当前位置:   article > 正文

海康相机的二次开发_海康安防相机二次开发

海康安防相机二次开发

监控领域的相机,应该首选海康的了。大华貌似也不错,跟海康是竞争对手。

如果我们仅仅买了一个前端(相机),没有买后台(录像机),并且需要把监控视频实时显示在我们自己的上位机软件上,基于海康sdk的二次开发就非常必要了。

海康的sdk开发包,可到海康的官网下载。也要提前配置好opencv

想要读取到海康相机的图像,有两种方法,一种是直接使用opencv和rtsp协议,一种是调用海康sdk的函数。

1、rtsp协议

  1. CvCapture* pcapture;
  2. pcapture = cvCreateFileCapture("rtsp://admin:12345@192.1.2.111/mpeg4/ch1/sub/av_stream");
  3. if (!pcapture)
  4. {
  5. printf("未能读取视频流\n");
  6. return false;
  7. }
  8. IplImage* frme;
  9. while (true)
  10. {
  11. frme = cvQueryFrame(pcapture);
  12. cv::Mat image = cv::cvarrToMat(frme);
  13. imshow("test", image);
  14. waitKey(10);
  15. }
  16. cvReleaseImage(&frme);
  17. return 0;

此种方法,博主尝试过,虽然海康相机是支持rtsp协议的,但是用起来,会出现花屏的现象。如果有读者遇到同样的问题,欢迎交流并寻找解决办法。


2、调用海康sdk

  1. void main()
  2. {
  3. //---------------------------------------
  4. // 初始化
  5. NET_DVR_Init();
  6. //设置连接时间与重连时间
  7. NET_DVR_SetConnectTime(2000, 1);
  8. NET_DVR_SetReconnect(10000, true);
  9. //---------------------------------------
  10. // 注册设备
  11. LONG lUserID;
  12. NET_DVR_DEVICEINFO_V30 struDeviceInfo;
  13. lUserID = NET_DVR_Login_V30("10.1.2.111", 8000, "admin", "shijue666", &struDeviceInfo);
  14. if (lUserID < 0)
  15. {
  16. printf("Login error, %d\n", NET_DVR_GetLastError());
  17. NET_DVR_Cleanup();
  18. return;
  19. }
  20. //---------------------------------------
  21. //设置异常消息回调函数
  22. NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL);
  23. //---------------------------------------
  24. //启动预览并设置回调数据流
  25. LONG lRealPlayHandle;
  26. cvNamedWindow("Mywindow", 0);
  27. cvNamedWindow("IPCamera", 0);
  28. HWND h = (HWND)cvGetWindowHandle("Mywindow");
  29. if (h == 0)
  30. {
  31. cout << "窗口创建失败" << endl;
  32. }
  33. NET_DVR_PREVIEWINFO struPlayInfo = { 0 };
  34. struPlayInfo.hPlayWnd = h; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
  35. struPlayInfo.lChannel = 1; //预览通道号
  36. struPlayInfo.dwStreamType = 1; //0-主码流,1-子码流,2-码流3,3-码流4,以此类推
  37. struPlayInfo.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
  38. //获取分辨率参数
  39. int Ret;
  40. NET_DVR_COMPRESSIONCFG_V30 struParams = { 0 };
  41. DWORD dwReturnLen;
  42. Ret = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_COMPRESSCFG_V30, struPlayInfo.lChannel, &struParams, sizeof(NET_DVR_COMPRESSIONCFG_V30), &dwReturnLen);
  43. if (!Ret)
  44. {
  45. cout << "获取分辨率失败" << endl;
  46. }
  47. else
  48. {
  49. cout << "获取分辨率和帧率参数成功!" << endl;
  50. cout << "帧率" << struParams.struNormHighRecordPara.dwVideoBitrate << endl;
  51. cout<< "分辨率" << struParams.struNormHighRecordPara.byResolution << endl;
  52. //再修改分辨率
  53. struParams.struNormHighRecordPara.byStreamType = 0;
  54. struParams.struNormHighRecordPara.dwVideoBitrate = 25;
  55. struParams.struNormHighRecordPara.byResolution = 19; //16可以到子码流的最大分辨率
  56. int SetCamera;
  57. SetCamera = NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_COMPRESSCFG_V30, struPlayInfo.lChannel,
  58. &struParams, sizeof(NET_DVR_COMPRESSIONCFG_V30));
  59. if (SetCamera)
  60. {
  61. cout << "修改分辨率成功" << endl;
  62. cout << "帧率" << struParams.struNormHighRecordPara.dwVideoBitrate << endl;
  63. }
  64. }
  65. //回流函数,和软解码,,获取图像
  66. lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, fRealDataCallBack, NULL);
  67. if (lRealPlayHandle < 0)
  68. {
  69. printf("NET_DVR_RealPlay_V40 error\n");
  70. printf("%d\n", NET_DVR_GetLastError());
  71. NET_DVR_Logout(lUserID);
  72. NET_DVR_Cleanup();
  73. return;
  74. }
  75. waitKey();
  76. Sleep(-1);
  77. //---------------------------------------
  78. //关闭预览
  79. NET_DVR_StopRealPlay(lRealPlayHandle);
  80. //注销用户
  81. NET_DVR_Logout(lUserID);
  82. //释放SDK资源
  83. NET_DVR_Cleanup();
  84. return;
  85. }
总结下需要实现的基本功能:

1、上位机软件窗口显示视频流

2、修改分辨率,上面代码中已有,注意主码流和子码流的区别

3、抓取一张图片

4、保存一段视频

本文完整调用海康sdk实现视频预览,修改分辨率等功能,下载后直接可以运行


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/709880
推荐阅读
相关标签
  

闽ICP备14008679号