监控领域的相机,应该首选海康的了。大华貌似也不错,跟海康是竞争对手。
如果我们仅仅买了一个前端(相机),没有买后台(录像机),并且需要把监控视频实时显示在我们自己的上位机软件上,基于海康sdk的二次开发就非常必要了。
海康的sdk开发包,可到海康的官网下载。也要提前配置好opencv。
想要读取到海康相机的图像,有两种方法,一种是直接使用opencv和rtsp协议,一种是调用海康sdk的函数。
1、rtsp协议
CvCapture* pcapture;
pcapture = cvCreateFileCapture("rtsp://admin:[email protected]/mpeg4/ch1/sub/av_stream");
if (!pcapture)
{
printf("未能读取视频流\n");
return false;
}
IplImage* frme;
while (true)
{
frme = cvQueryFrame(pcapture);
cv::Mat image = cv::cvarrToMat(frme);
imshow("test", image);
waitKey(10);
}
cvReleaseImage(&frme);
return 0;
2、调用海康sdk
void main()
{
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("10.1.2.111", 8000, "admin", "shijue666", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %d\n", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//设置异常消息回调函数
NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL);
//---------------------------------------
//启动预览并设置回调数据流
LONG lRealPlayHandle;
cvNamedWindow("Mywindow", 0);
cvNamedWindow("IPCamera", 0);
HWND h = (HWND)cvGetWindowHandle("Mywindow");
if (h == 0)
{
cout << "窗口创建失败" << endl;
}
NET_DVR_PREVIEWINFO struPlayInfo = { 0 };
struPlayInfo.hPlayWnd = h; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
struPlayInfo.lChannel = 1; //预览通道号
struPlayInfo.dwStreamType = 1; //0-主码流,1-子码流,2-码流3,3-码流4,以此类推
struPlayInfo.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
//获取分辨率参数
int Ret;
NET_DVR_COMPRESSIONCFG_V30 struParams = { 0 };
DWORD dwReturnLen;
Ret = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_COMPRESSCFG_V30, struPlayInfo.lChannel, &struParams, sizeof(NET_DVR_COMPRESSIONCFG_V30), &dwReturnLen);
if (!Ret)
{
cout << "获取分辨率失败" << endl;
}
else
{
cout << "获取分辨率和帧率参数成功!" << endl;
cout << "帧率" << struParams.struNormHighRecordPara.dwVideoBitrate << endl;
cout<< "分辨率" << struParams.struNormHighRecordPara.byResolution << endl;
//再修改分辨率
struParams.struNormHighRecordPara.byStreamType = 0;
struParams.struNormHighRecordPara.dwVideoBitrate = 25;
struParams.struNormHighRecordPara.byResolution = 19; //16可以到子码流的最大分辨率
int SetCamera;
SetCamera = NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_COMPRESSCFG_V30, struPlayInfo.lChannel,
&struParams, sizeof(NET_DVR_COMPRESSIONCFG_V30));
if (SetCamera)
{
cout << "修改分辨率成功" << endl;
cout << "帧率" << struParams.struNormHighRecordPara.dwVideoBitrate << endl;
}
}
//回流函数,和软解码,,获取图像
lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, fRealDataCallBack, NULL);
if (lRealPlayHandle < 0)
{
printf("NET_DVR_RealPlay_V40 error\n");
printf("%d\n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
waitKey();
Sleep(-1);
//---------------------------------------
//关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
总结下需要实现的基本功能:
1、上位机软件窗口显示视频流
2、修改分辨率,上面代码中已有,注意主码流和子码流的区别
3、抓取一张图片
4、保存一段视频
本文完整调用海康sdk实现视频预览,修改分辨率等功能,下载后直接可以运行。