虹软java接摄像头_虹软人脸识别SDK在网络摄像头中的实际应用

article/2025/6/25 23:06:12

目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此篇中介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容仅供参考。

ae67d333f7c2a0a75915d40ddf4019ff.png

市面上目前有很多款网络摄像头,以海康摄像头为例。海康SDK包含很多接口,接入有一定难度,这里只介绍获取视频帧相关的接口。

1.海康SDK接入基本流程

a.初始化并登录验证

NET_DVR_Init();

NET_DVR_DEVICEINFO_V30 struDeviceInfo = { 0 };

long lUserID = NET_DVR_Login_V30(m_cameraIp, m_cameraPort,

m_cameraUser, m_cameraPwd, &struDeviceInfo);

if (lUserID < 0)

{

NET_DVR_Cleanup();

return false;

}

b.创建线程并注册回调函数

thread videoThread(&HCNetCamera::getCameraPreview, this);

videoThread.detach();

bool HCNetCamera::getCameraPreview()

{

NET_DVR_CLIENTINFO ClientInfo;

ClientInfo.lChannel = 1; //Channel number 设备通道号

ClientInfo.hPlayWnd = NULL; //窗口为空,设备SDK不解码只取流

ClientInfo.lLinkMode = 0; //Main Stream

ClientInfo.sMultiCastIP = NULL;

//预览取流

g_realHandle = NET_DVR_RealPlay_V30(g_cameraUserId, &ClientInfo, fRealDataCallBack, NULL, TRUE);

if (g_realHandle < 0)

{

qDebug() << "NET_DVR_RealPlay_V30 failed! Error number: " << NET_DVR_GetLastError();

return false;

}

return true;

}

c.使用回调接口,获取实时的视频帧数据

void CALLBACK fRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser)

{

UNREFERENCED_PARAMETER(lRealHandle);

UNREFERENCED_PARAMETER(pUser);

DWORD dRet = 0;

BOOL inData = FALSE;

switch (dwDataType)

{

case NET_DVR_SYSHEAD:

if (g_cameraPort >= 0)

{

break; //同一路码流不需要多次调用开流接口

}

if (!PlayM4_GetPort(&g_cameraPort))

{

break;

}

if (!PlayM4_OpenStream(g_cameraPort, pBuffer, dwBufSize, 1024 * 1024))

{

dRet = PlayM4_GetLastError(g_cameraPort);

break;

}

//设置解码回调函数

if (!PlayM4_SetDecCallBack(g_cameraPort, DecCBFun))

{

dRet = PlayM4_GetLastError(g_cameraPort);

break;

}

//打开视频解码

if (!PlayM4_Play(g_cameraPort, NULL))

{

dRet = PlayM4_GetLastError(g_cameraPort);

break;

}

dRet = PlayM4_GetLastError(g_cameraPort);

break;

case NET_DVR_STREAMDATA: //视频流数据

default:

inData = PlayM4_InputData(g_cameraPort, pBuffer, dwBufSize);

while (!inData)

{

Sleep(10);

inData = PlayM4_InputData(g_cameraPort, pBuffer, dwBufSize);

dRet = PlayM4_GetLastError(g_cameraPort);

OutputDebugString(L"PlayM4_InputData failed \n");

}

break;

}

}

//解码回调 视频为YUV数据(YV12)

void CALLBACK DecCBFun(long port, char * pBuf, long nSize, FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2)

{

UNREFERENCED_PARAMETER(nReserved1);

UNREFERENCED_PARAMETER(nReserved2);

UNREFERENCED_PARAMETER(nSize);

UNREFERENCED_PARAMETER(port);

//图像格式转换

if (pFrameInfo->nType == T_YV12)

{

{

lock_guard locker(g_CameraMutex);

Utils_ns::ImageUtils_ns::YV12ToBGR24_FFMPEG((unsigned char*)pBuf, (unsigned char*)g_curRGBImage->imageData,

pFrameInfo->nWidth, pFrameInfo->nHeight);//得到全部RGB图像

}

}

}

d.应用层获取视频帧,这里为了简化操作,只获取了当前帧;大家也可以使用线程安全队列来处理

int HCNetCamera::getFrame(Mat& image)

{

lock_guard locker(g_CameraMutex);

if (g_curRGBImage && g_curRGBImage->imageData)

{

image = g_curRGBImage;

return 0;

}

return -1;

}

//以下是线程函数的一部分,主要是取帧,然后进行人脸检测

{

lock_guard<:mutex> locker(g_CameraMutex);

int ret = m_camera->getFrame(curFrame);

if (ret == -1)

{

continue;

}

}

ftProcessor->faceDetect(curFrame);

2.基本图像格式转换

目前虹软SDK支持以下几种图像数据格式:

7763a26b08ab4450cd7b8baf0b1f86dc.png

在实际开发过程中一般使用opencv,opencv默认的图像数据格式是BGR24,而我使用的海康摄像头视频编码格式是H264,视频帧数据格式是YV12,因此需要将YV12转换为BGR24 ,同时也会说明下怎么转换为虹软SDK支持的其它格式,主要参考了[2],以下的代码仅供参考。

a.YV12 To BGR24

void yv12ToBGR24(unsigned char* yv12, unsigned char* bgr24, int width, int height)

{

unsigned char* y_yv12 = yv12;

unsigned char* v_yv12 = yv12 + width*height;

unsigned char* u_yv12 = yv12 + width*height + width*height / 4;

unsigned char* b = bgr24;

unsigned char* g = bgr24 + 1;

unsigned char* r = bgr24 + 2;

int yIndex, uIndex, vIndex;

for (int i = 0; i < height; ++i)

{

for (int j = 0; j < width; ++j)

{

yIndex = i * width + j;

vIndex = (i / 2) * (width / 2) + (j / 2);

uIndex = vIndex;

*b = (unsigned char)(y_yv12[yIndex] + 1.732446 * (u_yv12[vIndex] - 128));

*g = (unsigned char)(y_yv12[yIndex] - 0.698001 * (u_yv12[uIndex] - 128) - 0.703125 * (v_yv12[vIndex] - 128));

*r = (unsigned char)(y_yv12[yIndex] + 1.370705 * (v_yv12[uIndex] - 128));

b += 3;

g += 3;

r += 3;

}

}

}

b.YV12 To I420

void yv12ToI420(unsigned char yv12, unsigned char i420, int width, int height)

{

unsigned char* y_yv12 = yv12;

unsigned char* v_yv12 = yv12 + width*height;

unsigned char* u_yv12 = yv12 + width*height + width*height / 4;

unsigned char* y_i420 = i420;

unsigned char* u_i420 = i420 + width*height;

unsigned char* v_i420 = i420 + width*height + width*height / 4;

memcpy(i420, yv12, width*height);

memcpy(v_i420, v_yv12, width*height / 4);

memcpy(u_i420, u_yv12, width*height / 4);

}

c.YV12 To NV21

void yv12ToNV21(unsigned char yv12, unsigned char nv21, int width, int height)

{

unsigned char* y_yv12 = yv12;

unsigned char* v_yv12 = yv12 + width*height;

unsigned char* u_yv12 = yv12 + width*height + width*height / 4;

unsigned char* y_nv21 = nv21;

unsigned char* v_nv21 = nv21 + width*height;

unsigned char* u_nv21 = nv21 + width*height + 1;

memcpy(nv21, yv12, width*height);

for (int i = 0; i < width*height / 4; ++i)

{

*v_nv21 = *v_yv12;

*u_nv21 = *u_yv12;

v_nv21 += 2;

u_nv21 += 2;

++v_yv12;

++u_yv12;

}

}

d.YV12 To NV12

void yv12ToNV12(unsigned char yv12, unsigned char nv12, int width, int height)

{

unsigned char* y_yv12 = yv12;

unsigned char* v_yv12 = yv12 + width*height;

unsigned char* u_yv12 = yv12 + width*height + width*height / 4;

unsigned char* y_nv12 = nv12;

unsigned char* u_nv12 = nv12 + width*height;

unsigned char* v_nv12 = nv12 + width*height + 1;

memcpy(nv12, yv12, width*height);

for (int i = 0; i < width*height / 4; ++i)

{

*v_nv12 = *v_yv12;

*u_nv12 = *u_yv12;

v_nv12 += 2;

u_nv12 += 2;

++v_yv12;

++u_yv12;

}

}

e.YV12 To YUYV

void yv12ToYUYV(unsigned char yv12, unsigned char yuyv, int width, int height)

{

unsigned char* y_yv12 = yv12;

unsigned char* v_yv12 = yv12 + width*height;

unsigned char* u_yv12 = yv12 + width*height + width*height / 4;

unsigned char* y_yuyv = yuyv;

unsigned char* u_yuyv = yuyv + 1;

unsigned char* v_yuyv = yuyv + 3;

for (int i = 0; i < width; ++i)

{

for (int j = 0; j < height; ++j)

{

*y_yuyv = *y_yv12;

y_yuyv += 2;

++y_yv12;

}

}

for (int j = 0; j < height / 2; ++j)

{

for (int i = 0; i < width / 2; ++i)

{

*u_yuyv = *u_yv12;

*(u_yuyv + width * 2) = *u_yv12;

u_yuyv += 4;

++u_yv12;

*v_yuyv = *v_yv12;

*(v_yuyv + width * 2) = *v_yv12;

v_yuyv += 4;

++v_yv12;

}

u_yuyv += width * 2;

v_yuyv += width * 2;

}

}


http://chatgpt.dhexx.cn/article/qbGUgne8.shtml

相关文章

海康SDK方式对接摄像头

1知识相关: OpenAPI:对外开放的接口 Http Methodhttp:请求的方法&#xff0c;常用的方法有GET/POST/PUT/DELETE等请求 Path:http请求路径&#xff0c;指域名/IP&#xff08;端口号&#xff09;之后的部分&#xff0c;如请求地址为"www.example.com/artemis/api"&…

人脸服务器如何与门禁系统对接,人脸识别门禁与自动门接线图

人脸识别门禁开锁流程是将VIP客户人脸图像库导入系统人脸库;当VIP客户接近高清摄像头&#xff0c;摄像头开始抓怕&#xff0c;并将所拍的人脸图像信息传给后台人脸识别服务器; 服务器收到摄像头传递过来的VIP客户图像&#xff0c;并将图像与预先导入的人脸库进行人脸比对。 若对…

调用远程摄像头进行人脸识别_工地如何实现安全帽检测/人脸识别?

安全生产一直是施工生产中很重要的一部分&#xff0c;只有保障了员工的安全&#xff0c;才能保证企业的利益。安全帽作为保护、防护的重要防范手段&#xff0c;一直是各大企业要求员工佩戴的&#xff0c;可还是发生了各种由于未佩戴安全帽导致的安全事故。 通过安装在工地施工现…

使用512KiB RAM基于单片机的实时摄像头人脸识别DNN论文解析

前言&#xff1a; 在读论文前可以先了解一下什么是GAP8&#xff08;GAP8 是基于 RISC-V 和 PULP&#xff08;并行超低功耗处理平台&#xff09;开源平台的物联网应用处理器。它实现了智能设备的经济高效的开发、部署和自主操作&#xff0c;这些设备可以捕获、分析、分类并处理…

Springboot集成海康威视门禁设备,车牌识别摄像头,人脸设备

海康设备集成springboot 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 海康设备集成springboot前言一、海康SDK包根据下载的SKD包中的DEMO示例连接设备创建一个springboot项目将库文件放入根目录lib文件下&#…

java海康摄像头添加人脸_java及opencv实现调用本地摄像头、网络摄像头完成人脸检测、人脸收集、人脸识别、性别识别...

这几年人脸识别比较流行&#xff0c;各种应用场景都用到了人脸识别&#xff0c;如&#xff1a;无人店、火车站检票口、小区门禁、智慧展厅、某些银行网点等&#xff0c;这也是未来生活的一种趋势。我也是好奇想研究一下&#xff0c;百度google了一大堆资料&#xff0c;发现网上…

JAVA使用海康SDK摄像头人体目标识别模块

JAVA使用海康SDK 首先到海康威视官网下载SDK 海康威视SDK 1.导入项目时候需要注意&#xff0c;linux环境跟windows不同的 区别如下&#xff1a; public interface HCNetSDK extends Library //linux public interface HCNetSDK extends StdCallLibrary //windows2.初始化SDK …

PDF图片文字识别

工具 adobe acrobat XI PRO 没有安装该软件的&#xff0c;需下载安装&#xff0c;有了此软件&#xff0c;pdf随意改&#xff0c;必备&#xff01; 步骤 1.打开pdf文件&#xff0c;点击工具---文本识别---在本文件中 2.选择“所有页面”&#xff0c;点击“编辑” 3.选择语言&a…

利用Java实现的图片中文字识别,你学会了吗?

一. 背景 今天有粉丝向波哥提出了这样一个疑问&#xff1a;给出一张图片&#xff0c;如何利用Java中的技术获取图片中的文字信息&#xff1f;针对这个问题&#xff0c;你有么有解决办法呢&#xff1f;如果你没有想到好的解决思路&#xff0c;也不用怕&#xff0c;看波哥来给你…

Python利用百度AI图像识别技术识别图片

准备工作&#xff1a;在百度云控制台创建文字识别模块&#xff1b;装备几张简单的有文字的图片。 百度官方文档&#xff1a;http://ai.baidu.com/docs#/OCR-API/7e4792c7 然后进入编码阶段&#xff1a; 如下代码获取access_token client_id和client_secret是百度云列表提供…

java做图文识别

现在的世界&#xff0c;什么都需要人工智能AI进行处理&#xff0c;那么&#xff0c;对于Java程序猿来说&#xff0c;是不是有些工作是不是就不能胜任呢&#xff0c;答案是显然是不一定的&#xff0c;对于图片识别来说&#xff0c;这个任务就可以使用Java进行开发&#xff0c;虽…

【计算机视觉】人脸识别--人脸识别技术综述

https://www.cnblogs.com/huty/p/8517691.html &#xfeff;参考&#xff1a;http://www.xuehuile.com/thesis/9a81f680054441ad907934b07b465c8e.html&#xff0c;本文做了相关修改。 1 人脸识别技术概述 近年来&#xff0c;随着计算机技术的迅速发展&#xff0c;人脸自动识…

厉害了,用 Java 也能实现图片识别!

点击上方蓝色“终端研发部”&#xff0c;选择“设为星标” 学最好的别人&#xff0c;做最好的我们 最近闲来无事研究了一下用 Java 如何模拟浏览器的行为&#xff0c;在实验登录的步骤时碰到了识别验证码的问题&#xff0c;于是在网上查找了关于 Java 如何进行图片识别验证码&a…

图片验证码识别教程技术原理分析

面对技术这片大海&#xff0c;我们都是一个渔民&#xff0c;三天打鱼&#xff0c;两天结网。我是把过去自己所掌握的所有技术总结成一张网&#xff0c;若一个技术干货分享的东西离我的网还太远&#xff0c;我就会放弃去了解。因为如果不能连结到这张网中&#xff0c;形成一个节…

Java OCR tess4j 图片识别技术(三)

先贴代码段 tess4j整个的代码调用到时是蛮简单的。 1.先去官网下载&#xff1a;http://tess4j.sourceforge.net/ 我的是Tess4J-3.4.0版&#xff0c;目录如下: 2.新建项目&#xff0c;将lib,tessdata,src复制到新建的项目中 3.将lib下的jar包加到build path 中 项目目录…

Java图像识别技术:Test4J

简介 做图像识别&#xff0c;可以使用TESSERACT-OCR来实现&#xff0c;但是该方式需要下载软件&#xff0c;在电脑上安装环境&#xff0c;移植性不高&#xff0c;使用Tess4J只需要下载相关Jar包&#xff0c;导入项目&#xff0c;再把项目封装好就可以处处运行了。 Test4J官网&…

计算机识别图像的原理,什么是图像识别技术?图像识别技术原理介绍

图像识别技术是人工智能的一个重要领域。它是指对图像进行对象识别,以识别各种不同模式的目标和对像的技术。 图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。图像识别,顾名思义,就是对图像做出各种处理、分析,最终识别我们所要研究的目标。今天所…

图片识别——需求篇

最近由于工作的关系,学习了一些关于图片识别的知识,并成功用于解决实际问题当中,特此一一记录下来,以备后用,同时希望对大家有用。 场景 企业端用户在注册时,会上传一下公司的Logo。上传的步骤是:选择本地Logo图片,点上传,图片被上传至公司图片服务器(此时这张图片有…

Ubuntu重启黑屏——Intel微码更新兼容性问题

9月13日前后对Ubuntu 22.04进行软件更新&#xff0c;再开机后经过grub直接黑屏&#xff0c;没有任何报错信息。 对于默认不显示Grub菜单的机器&#xff0c;可以在闪过紫屏前长按Esc进入Grub菜单。由于此时仍能进入Grub菜单界面&#xff0c;此处优先选择使用自带的Recovery Mod…

华为-微码开发入门 - 环境搭建

搭建环境 安装 Node.js 前言&#xff1a; We码的整个开发依赖 Node.js 环境&#xff0c;我们需要对 Node.js 做一个简单的了解。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;类似Java的JRE&#xff0c;JRE有一个称为Java Virtual Machine&#xff08…