【QT】海康视频及openCv抓拍正脸接口

本文是关于海康视频及openCv抓拍正脸接口调试:通过海康摄像头获取视频流,opencv转换成Mat类型对象,检测人脸对象是否存在。

海康和opencv库和头文件的添加如下:

cpp 复制代码
win32{
                INCLUDEPATH += $$PWD\..\hikvision\include

                LIBS += -L$$PWD\..\hikvision\lib\ -lHCNetSDK -lHCCore -lPlayCtrl -lGdiPlus \
                 -L$$PWD\..\hikvision\lib\HCNetSDKCom -lHCAlarm -lHCGeneralCfgMgr -lHCPreview \


                 # release openCV
                INCLUDEPATH +=  $$PWD\..\openCV34\opencv-3.4.16-win-64bit-mingw-lib-release-20241101\include\ 
                                                 $$PWD\..\openCV34\openCV34\opencv-3.4.16-win-64bit-mingw-lib-release-20241101\include\opencv2
                LIBS += $$PWD\..\openCV34\opencv-3.4.16-win-64bit-mingw-lib-release-20241101\x64\mingw\lib\libopencv*.a
                LIBS +=-L$$PWD\..\openCV34\opencv-3.4.16-win-64bit-mingw-lib-release-20241101\x64\mingw\bin\
}


unix{
                 INCLUDEPATH += $$PWD/../hikvision_linux/include


                LIBS += -L$$PWD/../hikvision_linux/lib/ -lhcnetsdk -lHCCore -lPlayCtrl -lAudioRender -lSuperRender \
                 -L$$PWD/../hikvision_linux/lib/HCNetSDKCom -lHCAlarm -lHCGeneralCfgMgr -lHCPreview
}

海康视频流数据转换成Mat对象类型的方法:

cpp 复制代码
  #define PHOTO_W 384
    #define PHOTO_H 288
QByteArray captureFace()
{
    QByteArray photo_buf;
    unsigned char* buf = new unsigned char[PHOTO_W*PHOTO_H];
    if(lUserID!=-1)
    {
        NET_DVR_JPEGPARA IpJpegPara2;
        IpJpegPara2.wPicQuality=1;
        IpJpegPara2.wPicSize=WORD(0);
        DWORD sL = 0;

        //***********设备抓拍(注:必须子码流)************************
        bool isCaptureOk = NET_DVR_CaptureJPEGPicture_NEW(lUserID,videoChannel,&IpJpegPara2,buf,PHOTO_W*PHOTO_H,&sL);
        if( isCaptureOk == false) {
            qDebug() << "NET_DVR_CaptureJPEGPicture error;" << "error number is " << NET_DVR_GetLastError();
        }
        else
        {
            std:: vector<Rect> faces;

            方法一:将海康的视频数据流uchar*转为opencv的Mat对象类型
            // 创建一个 320x240 的 8 位无符号型 4 通道全 0 的 Mat 
            cv::Mat mRGBAImg = cv::Mat::zeros(PHOTO_W,PHOTO_H, CV_8UC4);
            mRGBAImg.data = buf;
            方法二:将海康的视频数据流uchar*转为opencv的Mat对象类型
            vector <unsigned char> vec (buf,buf+PHOTO_W*PHOTO_H);
            cv::Mat img=cv::imdecode(vec,cv::IMREAD_COLOR);
                      方法三:将一个已经存在的jpeg格式文件转换为opencv的Mat对象类型
             QImage image;
             QBuffer buffer;
             buffer.open(QIODevice::ReadWrite);
             buffer.write(reinterpret_cast<const char*>(buf), PHOTO_W*PHOTO_H);
             image.loadFromData(buffer.data(), "JPG");
             buffer.close();
             image.save(".\\capture.jpg","JPG", 100);
                        cv::Mat matFrame = cv::imread(".\\capture.jpg", cv::IMREAD_COLOR);

            mFaceCascade.detectMultiScale(matFrame,faces,1.1,3,0,Size(50,50),Size(500,500));

            if(faces.size()>0){//人脸存在
                photo_buf.append(buf, PHOTO_W*PHOTO_H);
            }
            else{
                qDebug()<<"no catch face!";
            }

        }
    }
    delete[] buf;
    buf = nullptr;
    return photo_buf;
}

如果海康威视SDK确实不支持在函数调用时自动添加时间戳,你可以在保存图片后手动为图片加上时间戳。这通常需要使用图像处理库(如OpenCV)来加载图片,添加文本,然后保存。

示例代码:

cpp 复制代码
// 使用OpenCV添加时间戳
cv::Mat image = cv::imread("screenshot.jpg");
std::string timestamp = GetCurrentTimeStamp(); // 自定义函数获取时间戳字符串
cv::putText(image, timestamp, cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 255));
cv::imwrite("screenshot_with_timestamp.jpg", image);
相关推荐
Lhan.zzZ7 小时前
QML 组件库:VS2022 + Qt 静态库方案
开发语言·c++·qt·visual studio
TechVoyager_824610 小时前
HDMI信号进来,音视频出去:IT66021FN的全链路解析
音视频·音视频处理·it66021·hdmi接收芯片·hdmi1.4b·硬件方案·音视频全链路
leoZ23111 小时前
AI+前端提效-09 AI赋能前端测试:单元测试、E2E测试自动生成,提升覆盖率
前端·人工智能·opencv·目标检测·数据挖掘·单元测试·语音识别
ValueHD12 小时前
视频会议终端是什么,有哪几种类型?
后端·音视频·视频编解码·腾讯会议
redfred13 小时前
HandBrake 使用教程:开源视频压缩工具 视频太大压缩 MKV转MP4 批量转码 硬件加速 Windows/macOS/Linux
windows·开源·音视频
老余说AI13 小时前
告别机械音与音画脱节:2026 AI视频翻译与配音工具深度测评与工程选型指南
人工智能·音视频·视频翻译·视频配音
阿童木写作13 小时前
自动智能抠图工具推荐:跨马翻译批量处理图片与视频字幕,跨境电商高效翻译
大数据·人工智能·python·音视频
乐橙开放平台13 小时前
把工地遮挡和掉线接进项目部:setMessageCallback 订 alarm 与 deviceStatus
笔记·后端·物联网·自动化·音视频·智能家居
skr爱码士14 小时前
15_国际化和本地化:tr()、ts 文件、QM 文件、多语言切换
c++·qt·ui·客户端
别动我齐刘海15 小时前
从0到1独立搭建机器人软件系统
c++·人工智能·神经网络·opencv·目标检测·机器学习·机器人