怎么用C++和opencv开发海康相机录取视频
时间: 2024-01-24 08:17:24 浏览: 155
HKCamera_Demo.zip
下面是一个简单的示例代码,使用C++和OpenCV库来连接海康相机并录制视频:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <Windows.h>
#include "HCNetSDK.h"
using namespace std;
using namespace cv;
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser);
int main()
{
// 初始化海康SDK
NET_DVR_Init();
// 设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
// 登录设备
NET_DVR_USER_LOGIN_INFO struLoginInfo = { 0 };
struLoginInfo.bUseAsynLogin = 0;
strcpy_s(struLoginInfo.sDeviceAddress, "192.168.1.1"); // 设备IP地址
struLoginInfo.wPort = 8000; // 设备服务端口号
strcpy_s(struLoginInfo.sUserName, "admin"); // 登录用户名
strcpy_s(struLoginInfo.sPassword, "123456"); // 登录密码
NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = { 0 };
LONG lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
if (lUserID < 0)
{
printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
return -1;
}
// 预览设置
NET_DVR_PREVIEWINFO struPlayInfo = { 0 };
struPlayInfo.hPlayWnd = NULL;
struPlayInfo.lChannel = 1; // 预览通道号
struPlayInfo.dwStreamType = 0; // 码流类型,0-主码流,1-子码流,2-码流3,3-码流4,以此类推
struPlayInfo.dwLinkMode = 0; // 播放模式,0-非阻塞,1-阻塞
struPlayInfo.bBlocked = true; // 是否阻塞取流
// 开始预览
LONG lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, NULL);
if (lRealPlayHandle < 0)
{
printf("Preview failed, error code: %d\n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return -1;
}
// 创建OpenCV视频编码器
Size frameSize(struDeviceInfoV40.struVodFormat.struResolution.byWidth, struDeviceInfoV40.struVodFormat.struResolution.byHeight);
VideoWriter writer("output.avi", CV_FOURCC('X', 'V', 'I', 'D'), 30, frameSize);
// 录制视频
while (true)
{
Sleep(100);
if (GetAsyncKeyState(VK_ESCAPE) & 0x8000)
break;
}
// 停止预览
NET_DVR_StopRealPlay(lRealPlayHandle);
// 退出海康SDK
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return 0;
}
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* pUser)
{
switch (dwDataType)
{
case NET_DVR_SYSHEAD:
break;
case NET_DVR_STREAMDATA:
Mat frame(cv::Size(1920, 1080), CV_8UC3, pBuffer);
cvtColor(frame, frame, COLOR_BGR2RGB);
imshow("Preview", frame);
writer.write(frame);
waitKey(1);
break;
}
}
```
需要注意的是,这只是一个简单的示例代码,其中可能还有一些细节需要根据实际情况进行调整和修改。
阅读全文