大华相机接入web页面实现人脸识别

这篇具有很好参考价值的文章主要介绍了大华相机接入web页面实现人脸识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先看下效果,中间主视频流就是大华相机(视频编码H.264),海康相机(视屏编码H.265)

大华相机接入web页面实现人脸识别,数码相机,前端

大华相机接入web页面实现人脸识别,数码相机,前端
前端接入视屏流代码

  <!--视频流-->
            <div id="col2">
                <div class="cell" style="flex: 7; background: none">
                    <div class="cell-box" style="position: relative">
                        <video autoplay muted id="video" class="video" />

                        <div class="cell div-faces">
                            <div class="cell-box">
                                <!--人脸识别-->
                                <div class="faces-wrapper">
                                    <div v-for="i in 5" :key="i" class="face-wrapper">
                                        <div class="face-arrow"></div>
                                        <div
                                            class="face-image"
                                            :style="{
                                                background: faceImages[i - 1]
                                                    ? `url(data:image/jpeg;base64,${
                                                          faceImages[i - 1]
                                                      }) 0 0 / 100% 100% no-repeat`
                                                    : ''
                                            }"></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
api.post('screen2/init').then((attach) => {
        const { streamerIp, streamerPort, cameraIp, cameraPort, cameraAdmin, cameraPsw } = attach
        webRtcServer = new WebRtcStreamer('video', `${location.protocol}//${streamerIp}:${streamerPort}`)
        webRtcServer.connect(`rtsp://${cameraAdmin}:${cameraPsw}@${cameraIp}:${cameraPort}`)
    })

后台部署需要启动:webrtc-streamer.exe 用来解码视屏流,这样就能实现web页面接入视屏流。

主视屏流下面的相机抓拍图片和预警数据接口是怎么实现的呢?
1、需要把大华相机的sdk加载到项目中sdk下载
大华相机接入web页面实现人脸识别,数码相机,前端
在maven的pom.xml中添加依赖,将上面jar包 依赖到项目中

        <!--外部依赖-->
        <dependency>
            <!--groupId和artifactId不知道随便写-->
            <groupId>com.dahua.netsdk</groupId>
            <artifactId>netsdk-api-main</artifactId>
            <!--依赖范围,必须system-->
            <scope>system</scope>
            <version>1.0-SNAPSHOT</version>
            <!--依赖所在位置-->
            <systemPath>${project.basedir}/libs/netsdk-api-main-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <!--groupId和artifactId不知道随便写-->
            <groupId>com.dahua.netsdk</groupId>
            <artifactId>netsdk-dynamic</artifactId>
            <!--依赖范围,必须system-->
            <scope>system</scope>
            <version>1.0-SNAPSHOT</version>
            <!--依赖所在位置-->
            <systemPath>${project.basedir}/libs/netsdk-dynamic-lib-main-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <!--groupId和artifactId不知道随便写-->
            <groupId>com.dahua.netsdk</groupId>
            <artifactId>netsdk-jna</artifactId>
            <!--依赖范围,必须system-->
            <scope>system</scope>
            <version>1.0-SNAPSHOT</version>
            <!--依赖所在位置-->
            <systemPath>${project.basedir}/libs/jna.jar</systemPath>
        </dependency>

2、然后在StartRunner中(项目启动时执行run方法) 初始化,登录,订阅人脸检测事件,并且定义回调,这里需要注意的是回调AnalyzerDataCB必须是静态单例的。

package ahpu.aip._runner;

import ahpu.aip.service.ConfigService;
import ahpu.aip.service.SceneService;
import ahpu.aip.util.HkUtil;
import ahpu.aip.util.RedisUtils;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Component
public class StartRunner implements CommandLineRunner, DisposableBean {
    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @Resource
    private ConfigService configService;
    @Resource
    private SceneService sceneService;



    @Override
    public void run(String... args) {
//        ==============================初始化大华相机=========================================
        //NetSDK 库初始化
        boolean bInit    = false;
        NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE;
        // 智能订阅句柄
        NetSDKLib.LLong attachHandle = new NetSDKLib.LLong(0);


        //设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
        class DisConnect implements NetSDKLib.fDisConnect {
            public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
                System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
            }
        }
        //网络连接恢复,设备重连成功回调
        // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
        class HaveReConnect implements NetSDKLib.fHaveReConnect {
            public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
                System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
            }
        }



        //登陆参数
        String m_strIp         = "192.168.1.108";
        int m_nPort        	   = 37777;
        String m_strUser       = "admin";
        String m_strPassword   = "admin123456";
        //设备信息
        NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); // 对应CLIENT_LoginEx2
        NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0);     // 登陆句柄
        NetSDKLib.LLong m_hAttachHandle = new NetSDKLib.LLong(0);    // 智能订阅句柄

//        初始化
        bInit = netsdkApi.CLIENT_Init(new DisConnect(), null);

        // 设置断联后自动重连
        netsdkApi.CLIENT_SetAutoReconnect(new HaveReConnect(),null);

        if(!bInit) {
            System.out.println("Initialize SDK failed");
        }else{
            System.out.println("Initialize SDK Success");
        }

        // 登录
        int nSpecCap = NetSDKLib.EM_LOGIN_SPAC_CAP_TYPE.EM_LOGIN_SPEC_CAP_TCP; //=0
        IntByReference nError = new IntByReference(0);
        m_hLoginHandle = netsdkApi.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, nSpecCap, null, m_stDeviceInfo, nError);
        if(m_hLoginHandle.longValue() == 0) {
            System.err.printf("Login Device[%s] Port[%d]Failed.\n", m_strIp, m_nPort, ToolKits.getErrorCode());
        } else {
            System.out.println("Login Success [ " + m_strIp + " ]");
        }


        // 订阅
        int bNeedPicture = 1; // 是否需要图片
        m_hAttachHandle =  netsdkApi.CLIENT_RealLoadPictureEx(m_hLoginHandle, 0, NetSDKLib.EVENT_IVS_ALL, bNeedPicture, AnalyzerDataCB.getInstance(), null, null);
        if(m_hAttachHandle.longValue() == 0) {
            System.err.println("CLIENT_RealLoadPictureEx Failed, Error:" + ToolKits.getErrorCode());
        }else {
            System.out.println("订阅成功~");
        }

    }


    private static class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {

        private static AnalyzerDataCB instance;
        public static AnalyzerDataCB getInstance() {
            if (instance == null) {
                synchronized (AnalyzerDataCB.class) {
                    if (instance == null) {
                        instance = new AnalyzerDataCB();
                    }
                }
            }
            return instance;
        }

        private static final Logger log = LoggerFactory.getLogger(AnalyzerDataCB.class);

        public static HashMap<String, Object> temMap;

        private int bGlobalScenePic;					//全景图是否存在, 类型为BOOL, 取值为0或者1
        private NetSDKLib.NET_PIC_INFO stuGlobalScenePicInfo;     //全景图片信息


        private NetSDKLib.NET_PIC_INFO stPicInfo;	  			    // 人脸图
        private NetSDKLib.NET_FACE_DATA stuFaceData;			    // 人脸数据

        private int nCandidateNumEx;				    // 当前人脸匹配到的候选对象数量
        private NetSDKLib.CANDIDATE_INFOEX[] stuCandidatesEx;     // 当前人脸匹配到的候选对象信息扩展

        // 全景大图、人脸图、对比图
        private BufferedImage globalBufferedImage = null;
        private BufferedImage personBufferedImage = null;
        private BufferedImage candidateBufferedImage = null;
        String[] faceSexStr = {"未知", "男", "女"};
        // 用于保存对比图的图片缓存,用于多张图片显示
        private ArrayList<BufferedImage> arrayListBuffer = new ArrayList<BufferedImage>();

        @Override
        public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType,
                          Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize,
                          Pointer dwUser, int nSequence, Pointer reserved) {
            // 获取相关事件信息
            getObjectInfo(dwAlarmType, pAlarmInfo);
            if(dwAlarmType == NetSDKLib.EVENT_IVS_FACEDETECT) {  // 人脸检测
                // 保存图片
                savePicture(pBuffer, dwBufSize, stPicInfo);
            }
            return 0;
        }

        /**
         * 获取相关事件信息
         * @param dwAlarmType 事件类型
         * @param pAlarmInfo 事件信息指针
         */
        public void getObjectInfo(int dwAlarmType, Pointer pAlarmInfo) {
            if(pAlarmInfo == null) {
                return;
            }

            switch(dwAlarmType)
            {
                case NetSDKLib.EVENT_IVS_FACEDETECT:   ///< 人脸检测
                {
                    NetSDKLib.DEV_EVENT_FACEDETECT_INFO msg = new NetSDKLib.DEV_EVENT_FACEDETECT_INFO();
                    ToolKits.GetPointerData(pAlarmInfo, msg);
                    stPicInfo = msg.stuObject.stPicInfo;  // 检测到的人脸
                    log.info("口罩状态(0-未知,1-未识别,2-没戴口罩,3-戴口罩了):" + msg.emMask);
                    log.info("时间:"+msg.UTC);
                    RedisUtils.set("mask",msg.emMask==3?"戴口罩":"未戴口罩");
                    RedisUtils.set("time",msg.UTC+"");
                    break;
                }
                default:
                    break;
            }
        }

        /**
         * 保存人脸检测事件图片 ===
         * @param pBuffer 抓拍图片信息
         * @param dwBufSize 抓拍图片大小
         */
        public void savePicture(Pointer pBuffer, int dwBufSize, NetSDKLib.NET_PIC_INFO stPicInfo) {
            File path = new File("./FaceDetected/");
            if (!path.exists()) {
                path.mkdir();
            }

            if (pBuffer == null || dwBufSize <= 0) {
                return;
            }

            /// 保存人脸图 /
            if(stPicInfo != null) {
                byte[] bufferPerson = pBuffer.getByteArray(stPicInfo.dwOffSet, stPicInfo.dwFileLenth);
                ByteArrayInputStream byteArrInputPerson = new ByteArrayInputStream(bufferPerson);

                try {
                    personBufferedImage = ImageIO.read(byteArrInputPerson);
                    if(personBufferedImage == null) {
                        return;
                    }
                    // 将图片转为base64存入Redis中
                    String base64 = Base64.encode(bufferPerson);
                    RedisUtils.set("img","data:image/jpeg;base64,"+base64);
                    String listStr = (String) RedisUtils.get("dahuaList");
                    List<HashMap> list = JSONArray.parseArray(listStr,HashMap.class);
                    HashMap<String,String> tmpResult = new HashMap<String,String>();
                    tmpResult.put("img",(String) RedisUtils.get("img"));
                    tmpResult.put("time",(String) RedisUtils.get("time"));
                    tmpResult.put("mask",(String) RedisUtils.get("mask"));

                    if(CollectionUtils.isEmpty(list)){
                        list = new ArrayList<>();
                        list.add(tmpResult);
                    }else {
                        list.add(tmpResult);
                    }

                    if(list.size()>5){
                        RedisUtils.set("dahuaList", JSON.toJSONString(list.subList(list.size()-5,list.size())));
                    }else {
                        RedisUtils.set("dahuaList",JSON.toJSONString(list));
                    }
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
        }

    }


    @Override
    public void destroy() {
    }
}

获取结果接口类文章来源地址https://www.toymoban.com/news/detail-564226.html

@RestController
@Validated
@RequestMapping("dahua/")
public class DahuaController {

    @ApiOperation(value = "大华人脸",tags = "大华人脸")
    @GetMapping("getFaceList")
    public R face() {
        String dahuaList = (String) RedisUtils.get("dahuaList");
        List<HashMap> list = JSONArray.parseArray(dahuaList,HashMap.class);
        return R.succ().attach(list);
    }

}

到了这里,关于大华相机接入web页面实现人脸识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小米12s ultra,索尼xperia1 iv,数码相机 拍照对比

    首先说明所有的测试结果和拍摄数据我放到百度网盘了(地址在结尾) 我一直想知道现在的手机和相机差距有多大,到底差在哪儿? 先说结论: 1.1英寸的手机cmos(2022年) 6年前(2016)的入门款相机(m43画幅) 2.手机 不能换镜头,只能在特定的拍摄距离才能发挥出全部的实力.数码变焦画质损

    2024年02月09日
    浏览(87)
  • 【计算机视觉:算法和应用】第二章:图像形成——2.3数码相机

    2.1几何图元与变换 2.2相机辐射成像        从一个或多个光源开始,在世界中一个或多个表面反射并通过相机镜头后,光最终到达成像传感器。到达传感器的光子是如何转换为我们在数字图像上看到的数字(R,G,B)值的呢?在这一节,我们构建了一个简单的模型来解释大多数

    2024年01月19日
    浏览(67)
  • 【三十天精通Vue 3】第二十七天 如何用Vue 3和TensorFlow.js实现人脸识别Web应用?

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3

    2024年02月03日
    浏览(45)
  • AHD同轴摄像头接入电脑USB录制视频的方法,AHD转USB,AI图像算法(ADAS\DMS\360环视\BSD\人脸识别),图像接入电脑处理

            在图像算法训练时,有时候需要接入电脑进行算法调试和处理,很多摄像头是AHD同轴信号,例如安防和汽车后装市场很多摄像头都是AHD同轴的接口,而电脑没有可以接入同轴的接口,所以需要转换成电脑可以接入的接口才可以将摄像头接入电脑,而USB绝对是最常用

    2024年02月09日
    浏览(138)
  • AS-V1000产品介绍:支持GA/T1400视图库标准(可通过GA/T1400接入海康、华为、大华等图传前端设备,实现图传功能)

    目                 录 一、概述 二、AS-V1000视频监控管理平台的特点 二、视频监控平台通过GA/T1400接入前端设备 (一)接入华为GA/T1400前端设备 (二)接入大华GA/T1400前端设备 (三)接入海康威视GA/T1400前端设备 三、接入GA/T1400后的效果 1、白名单设置 2、告警描述 3、实时

    2024年02月19日
    浏览(44)
  • 大华相机IP网段更新配置

    大华相机在出厂后一般都会对应一个IP,如192.169.1.XX。实际项目中,为了将相机放到与wifi相同的频段,一般需要更改相机的IP和网关,使之与wifi处于相同频段,那么就可以在wifi覆盖的所有区域进行调试。 如下为方法: 1、使用ipconfig查看当前使用的网络ip以及相应的网关 2、选

    2024年02月11日
    浏览(47)
  • 1.8安装大华相机SDK及测试

    不同工业相机的sdk不同,可以到相应的官网下载,我使用的是大华相机和海康相机 下载SDK: 官方下载地址:http://download.huaraytech.com/pub/sdk/ 推荐使用的是2.3.1的Linux的x86的版本 点击下载 安装: 将下载的压缩包用指令unzip 压缩,.run文件增加可执行权限,然后运行即可打开软件

    2024年02月16日
    浏览(55)
  • 海康大华监控摄像机接入SkeyeVSS视频融合平台配置详细步骤

    监控摄像机接入SkeyeVSS视频融合平台配置 监控接入准备 一台笔记本电脑 安装海康摄像机调试工具 安装大华摄像机调试工具 硬件调试工具(自备) 监控接入步骤 海康网络摄像机接入步骤: 打开设备网络搜索工具(SADPTool.exe),打开界面如下图所示: 正常情况下,网线接上

    2024年02月15日
    浏览(215)
  • 【人脸识别】基于facenet_pytorch实现人脸识别

            该代码可以在Pycharm、Jupyter、Python等Python编译器中运行,本文我使用的是Pycharm。 (一)安装pytorch(cpu)         首先在Pycharm中新建一个名为facenet_test的项目,并创建一个名为fp.py的Python文件。         打开PyTorch官网Start Locally | PyTorch,在主页中根据自己的电

    2024年02月04日
    浏览(48)
  • 基于OpenCV提供的人脸识别算法LBPH实现人脸识别

    本文通过学习LBPH人脸识别算法,简要了解人脸识别技术的原理,实现人脸采集、训练人脸模型实现人脸识别。 OpenCV库自带的人脸级联分级器具有很好的人脸检测和人脸追踪效果,它是一个基于Haar特征的Adaboost级联分类器。特别注意,OpenCV库虽然自带人脸级联分级器,但是识

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包