赞
踩
监控领域的相机,应该首选海康的了。大华貌似也不错,跟海康是竞争对手。
如果我们仅仅买了一个前端(相机),没有买后台(录像机),并且需要把监控视频实时显示在我们自己的上位机软件上,基于海康sdk的二次开发就非常必要了。
海康的sdk开发包,可到海康的官网下载。也要提前配置好opencv。
想要读取到海康相机的图像,有两种方法,一种是直接使用opencv和rtsp协议,一种是调用海康sdk的函数。
1、rtsp协议
- CvCapture* pcapture;
- pcapture = cvCreateFileCapture("rtsp://admin:12345@192.1.2.111/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实现视频预览,修改分辨率等功能,下载后直接可以运行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。