opencv调用海康威视摄像头
时间: 2023-08-30 07:11:35 浏览: 141
opencv调用海康摄像头
在使用OpenCV调用海康威视摄像头前,需要先安装海康威视SDK并设置好环境变量。具体步骤如下:
1. 下载海康威视SDK并安装。
2. 打开SDK安装目录下的“HCNetSDKCom”文件夹,在其中找到“HCNetSDK.dll”和“PlayCtrl.dll”两个文件。将这两个文件复制到系统目录下(一般为C:\Windows\System32)。
3. 在系统环境变量中添加“HCNETSDKPATH”变量,并将其值设置为SDK安装目录。
4. 在Visual Studio中,打开项目的属性页,选择“VC++目录”,将“包含目录”和“库目录”分别设置为SDK安装目录下的“Include”和“Lib”文件夹。
5. 在项目中添加以下代码:
```cpp
#include <opencv2/opencv.hpp>
#include <HCNetSDK.h>
#include <PlayM4.h>
#include <Windows.h>
using namespace cv;
int main()
{
// 初始化SDK
NET_DVR_Init();
// 登录设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.168.1.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return -1;
}
// 开启预览
LONG lRealPlayHandle;
NET_DVR_PREVIEWINFO struPlayInfo = { 0 };
struPlayInfo.hPlayWnd = NULL;
struPlayInfo.lChannel = 1;
struPlayInfo.dwStreamType = 0;
struPlayInfo.dwLinkMode = 0;
lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, NULL, NULL);
if (lRealPlayHandle < 0)
{
printf("NET_DVR_RealPlay_V40 failed, error code: %d\n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return -1;
}
// 显示图像
Mat frame;
namedWindow("Camera", WINDOW_NORMAL);
while (true)
{
// 获取图像数据
LONG lRealPlayRet = NET_DVR_GetRealPlayerIndex(lRealPlayHandle);
if (lRealPlayRet < 0)
{
printf("NET_DVR_GetRealPlayerIndex failed, error code: %d\n", NET_DVR_GetLastError());
break;
}
LPNET_DVR_PREVIEWINFO lpPreviewInfo = &struPlayInfo;
LONG lFrame = NET_DVR_GetNextVideoFrame(lRealPlayHandle);
if (lFrame < 0)
{
printf("NET_DVR_GetNextVideoFrame failed, error code: %d\n", NET_DVR_GetLastError());
break;
}
BYTE* pBuf = NULL;
DWORD dwBufSize = 0;
BOOL bRet = PlayM4_GetData(lRealPlayRet, &pBuf, &dwBufSize);
if (!bRet)
{
printf("PlayM4_GetData failed, error code: %d\n", PlayM4_GetLastError(lRealPlayRet));
break;
}
Mat yuvImg(Size(lpPreviewInfo->dwWidth, lpPreviewInfo->dwHeight * 3 / 2), CV_8UC1, pBuf);
cvtColor(yuvImg, frame, COLOR_YUV2BGR_I420);
// 显示图像
imshow("Camera", frame);
if (waitKey(30) == 27) // 按下ESC退出
break;
}
// 关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
// 注销设备
NET_DVR_Logout(lUserID);
// 释放SDK资源
NET_DVR_Cleanup();
return 0;
}
```
以上代码中,我们通过NET_DVR_Login_V30函数登录设备,通过NET_DVR_RealPlay_V40函数开启预览,通过PlayM4_GetData函数获取图像数据,然后转换为OpenCV格式的图像并显示出来。在使用完毕后,通过NET_DVR_StopRealPlay函数关闭预览,通过NET_DVR_Logout函数注销设备,通过NET_DVR_Cleanup函数释放SDK资源。
需要注意的是,海康威视SDK的函数返回值有可能是负数,表示操作失败,此时可以通过NET_DVR_GetLastError函数获取错误码进行排查。
阅读全文