海康相机的二次开发

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

如果我们仅仅买了一个前端(相机),没有买后台(录像机),并且需要把监控视频实时显示在我们自己的上位机软件上,基于海康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;

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


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实现视频预览,修改分辨率等功能,下载后直接可以运行。


你可能感兴趣的:(图像处理应用)