海康sdk获得图像数据 使用opencv显示
要使用海康SDK获得图像数据并使用OpenCV显示,需要按照以下步骤进行操作:
-
安装海康SDK,并按照官方文档中的指导进行配置和连接摄像头。
-
使用SDK提供的接口获取图像数据。通常可以使用海康SDK中的NET_DVR_GetRealPlayBuf函数来获取实时视频数据。
-
将获取的数据转换为OpenCV中支持的格式。通常可以使用cv::Mat类来处理图像数据。可以使用cv::Mat::create函数创建一个与获取的数据大小和格式相同的Mat对象,并使用memcpy函数将数据复制到该对象中。
-
使用OpenCV的imshow函数显示图像。可以使用cv::namedWindow函数创建一个窗口,并使用cv::imshow函数显示Mat对象中的数据。
下面是一个使用海康SDK和OpenCV实现实时视频显示的示例代码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include "HCNetSDK.h"
using namespace std;
using namespace cv;
int main()
{
// 初始化海康SDK
NET_DVR_Init();
// 登录设备
NET_DVR_DEVICEINFO_V30 deviceInfo;
LONG userID = NET_DVR_Login_V30("192.168.1.100", 8000, "admin", "password", &deviceInfo);
if (userID < 0) {
cerr << "Login failed: " << NET_DVR_GetLastError() << endl;
NET_DVR_Cleanup();
return -1;
}
// 开始预览
NET_DVR_PREVIEWINFO previewInfo;
previewInfo.hPlayWnd = NULL;
previewInfo.lChannel = 1;
previewInfo.dwStreamType = 0;
previewInfo.dwLinkMode = 0;
previewInfo.bBlocked = true;
LONG previewHandle = NET_DVR_RealPlay_V40(userID, &previewInfo, NULL, NULL);
if (previewHandle < 0) {
cerr << "RealPlay failed: " << NET_DVR_GetLastError() << endl;
NET_DVR_Logout(userID);
NET_DVR_Cleanup();
return -1;
}
// 获取视频参数
NET_DVR_GET_FRAMECFG frameCfg;
frameCfg.dwSize = sizeof(NET_DVR_GET_FRAMECFG);
NET_DVR_GetDVRConfig(userID, NET_DVR_GET_FRAMECFG, 1, &frameCfg, sizeof(NET_DVR_GET_FRAMECFG), NULL);
int width = frameCfg.struHighPerformance.struPicSize.struResolution.byWidth;
int height = frameCfg.struHighPerformance.struPicSize.struResolution.byHeight;
int channels = 3; // 通道数为3
// 创建Mat对象
Mat frame(height, width, CV_8UC3);
// 循环显示图像
while (true) {
// 获取视频数据
DWORD dataLen = 0;
char* dataBuf = NULL;
if (!NET_DVR_GetRealPlayBuf(previewHandle, &dataBuf, 1000000)) {
cerr << "GetRealPlayBuf failed: " << NET_DVR_GetLastError() << endl;
break;
}
dataLen = NET_DVR_GetPlayerBufSize(previewHandle);
// 转换数据格式
memcpy(frame.data, dataBuf, dataLen);
// 显示图像
imshow("Video", frame);
if (waitKey(1) == 27) // 按下ESC键退出
break;
// 释放视频数据
NET_DVR_FreeRealPlayBuf(dataBuf);
}
// 停止预览并退出
NET_DVR_StopRealPlay(previewHandle);
NET_DVR_Logout(userID);
NET_DVR_Cleanup();
return 0;
}
注意,在使用海康SDK和OpenCV时需要注意内存管理和资源释放。在获取视频数据和显示图像时需要使用相应的函数释放内存,以避免内存泄漏。同时,在退出程序前也需要释放海康SDK所占用的资源。
原文地址: https://www.cveoy.top/t/topic/b0jA 著作权归作者所有。请勿转载和采集!