OpenCV+海康威视摄像头的实时读取

#OpenCV+海康威视摄像头的实时读取

本文由 @lonelyrains出品,转载请注明出处。
文章链接: http://blog.csdn.net/lonelyrains/article/details/50350052

之前没想过会有这么多朋友遇到问题,所以建了 qq群1:536898072 qq群2:1071276535,专门供大家以后一起交流讨论图像和机器学习的工程实践问题。

vx: blade170103

##环境

  • 硬件:
    PC:i7-4970 16GB内存 摄像头型号:DS-2CD3310D-I(2.8mm)
  • 软件:
    windows-x64、vs2012、opencv2.4.8、hkvision5114-x64版本库

##配置

  • 保证使用SADP工具可以识别摄像头,然后配置IP与电脑在同一个网段。
    这里写图片描述
  • 再保证可以从浏览器中访问。账号密码默认的一般是admin、a123456789(老版本的摄像头密码是12345)。
    这里写图片描述
    登录成功后可能要求下载WebComponent控件,下载好了安装便是。如果仍然出现如下画面:
    这里写图片描述
    则换一种浏览器试。一般是默认浏览器没问题的。
    这里写图片描述
  • 配置使用sdk中自带的ClientDemo.exe工具可以访问
    这里写图片描述
    这里写图片描述
  • 配置sdk开发环境
    – opencv的配置
    这里不展开讲opencv的配置,仅说明需要配置opencv环境变量、设置好对应的vs开发环境的属性配置
    这里写图片描述
    这里写图片描述
    这里写图片描述
    – 海康威视sdk属性配置
    因为是64位环境,为了增强属性配置的内聚性,单独添加新项目属性表,设置海康威视sdk的属性
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    依赖库写全,为:
    HCNetSDK.lib;PlayCtrl.lib;ws2_32.lib;winmm.lib;GdiPlus.lib;IPHlpApi.Lib;%(AdditionalDependencies)

##代码及说明

#include <opencv\cv.h>
#include <opencv\highgui.h>#include <iostream>#include <cstdio>
#include <cstring>
#include <iostream>
#include <windows.h>
#include <HCNetSDK.h>
/*#include "PlayM4.h"*/
#include <plaympeg4.h>
#include <opencv2\opencv.hpp>
#include <time.h>#include "global.h"
#include "readCamera.h"#define USECOLOR 1using namespace cv;
using namespace std;//--------------------------------------------
int iPicNum=0;//Set channel NO.
LONG nPort=-1;
HWND hWnd=NULL;void yv12toYUV(char *outYuv, char *inYv12, int width, int height,int widthStep)
{int col,row;unsigned int Y,U,V;int tmp;int idx;//printf("widthStep=%d.\n",widthStep);for (row=0; row<height; row++){idx=row * widthStep;int rowptr=row*width;for (col=0; col<width; col++){//int colhalf=col>>1;tmp = (row/2)*(width/2)+(col/2);//         if((row==1)&&( col>=1400 &&col<=1600))//         { //          printf("col=%d,row=%d,width=%d,tmp=%d.\n",col,row,width,tmp);//          printf("row*width+col=%d,width*height+width*height/4+tmp=%d,width*height+tmp=%d.\n",row*width+col,width*height+width*height/4+tmp,width*height+tmp);//         } Y=(unsigned int) inYv12[row*width+col];U=(unsigned int) inYv12[width*height+width*height/4+tmp];V=(unsigned int) inYv12[width*height+tmp];//         if ((col==200))//         { //         printf("col=%d,row=%d,width=%d,tmp=%d.\n",col,row,width,tmp);//         printf("width*height+width*height/4+tmp=%d.\n",width*height+width*height/4+tmp);//         return ;//         }if((idx+col*3+2)> (1200 * widthStep)){//printf("row * widthStep=%d,idx+col*3+2=%d.\n",1200 * widthStep,idx+col*3+2);} outYuv[idx+col*3]   = Y;outYuv[idx+col*3+1] = U;outYuv[idx+col*3+2] = V;}}//printf("col=%d,row=%d.\n",col,row);
}//解码回调 视频为YUV数据(YV12),音频为PCM数据
void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2)
{long lFrameType = pFrameInfo->nType;	if(lFrameType ==T_YV12){
#if USECOLOR//int start = clock();static IplImage* pImgYCrCb = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 3);//得到图像的Y分量  yv12toYUV(pImgYCrCb->imageData, pBuf, pFrameInfo->nWidth,pFrameInfo->nHeight,pImgYCrCb->widthStep);//得到全部RGB图像static IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 3);  cvCvtColor(pImgYCrCb,pImg,CV_YCrCb2RGB);  //int end = clock();
#elsestatic IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 1);  memcpy(pImg->imageData,pBuf,pFrameInfo->nWidth*pFrameInfo->nHeight); 
#endif//printf("%d\n",end-start);Mat frametemp(pImg),frame;//frametemp.copyTo(frame);
// 		cvShowImage("IPCamera",pImg);
// 		cvWaitKey(1);EnterCriticalSection(&g_cs_frameList);g_frameList.push_back(frametemp);LeaveCriticalSection(&g_cs_frameList);#if USECOLOR
// 		cvReleaseImage(&pImgYCrCb);
// 		cvReleaseImage(&pImg);
#else/*cvReleaseImage(&pImg);*/
#endif//此时是YV12格式的视频数据,保存在pBuf中,可以fwrite(pBuf,nSize,1,Videofile);//fwrite(pBuf,nSize,1,fp);}/***************else if (lFrameType ==T_AUDIO16){//此时是音频数据,数据保存在pBuf中,可以fwrite(pBuf,nSize,1,Audiofile);}else{}*******************/}///实时流回调
void CALLBACK fRealDataCallBack(LONG lRealHandle,DWORD dwDataType,BYTE *pBuffer,DWORD dwBufSize,void *pUser)
{DWORD dRet;switch (dwDataType){case NET_DVR_SYSHEAD:    //系统头if (!PlayM4_GetPort(&nPort)) //获取播放库未使用的通道号{break;}if(dwBufSize > 0){if (!PlayM4_OpenStream(nPort,pBuffer,dwBufSize,1024*1024)){dRet=PlayM4_GetLastError(nPort);break;}//设置解码回调函数 只解码不显示if (!PlayM4_SetDecCallBack(nPort,DecCBFun)){dRet=PlayM4_GetLastError(nPort);break;}//设置解码回调函数 解码且显示//if (!PlayM4_SetDecCallBackEx(nPort,DecCBFun,NULL,NULL))//{//	dRet=PlayM4_GetLastError(nPort);//	break;//}//打开视频解码if (!PlayM4_Play(nPort,hWnd)){dRet=PlayM4_GetLastError(nPort);break;}//打开音频解码, 需要码流是复合流
// 			if (!PlayM4_PlaySound(nPort))
// 			{
// 				dRet=PlayM4_GetLastError(nPort);
// 				break;
// 			}		}break;case NET_DVR_STREAMDATA:   //码流数据if (dwBufSize > 0 && nPort != -1){BOOL inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);while (!inData){Sleep(10);inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);OutputDebugString(L"PlayM4_InputData failed \n");	}}break;	}		
}void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{char tempbuf[256] = {0};switch(dwType) {case EXCEPTION_RECONNECT:    //预览时重连printf("----------reconnect--------%d\n", time(NULL));break;default:break;}
}unsigned readCamera(void *param)
{//---------------------------------------// 初始化NET_DVR_Init();//设置连接时间与重连时间NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);//---------------------------------------// 获取控制台窗口句柄//HMODULE hKernel32 = GetModuleHandle((LPCWSTR)"kernel32");//GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");//---------------------------------------// 注册设备LONG lUserID;NET_DVR_DEVICEINFO_V30 struDeviceInfo;lUserID = NET_DVR_Login_V30("192.168.2.64", 8000, "admin", "a123456789", &struDeviceInfo);if (lUserID < 0){printf("Login error, %d\n", NET_DVR_GetLastError());NET_DVR_Cleanup();return -1;}//---------------------------------------//设置异常消息回调函数NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);//cvNamedWindow("IPCamera");//---------------------------------------//启动预览并设置回调数据流 NET_DVR_CLIENTINFO ClientInfo;ClientInfo.lChannel = 1;        //Channel number 设备通道号ClientInfo.hPlayWnd = NULL;     //窗口为空,设备SDK不解码只取流ClientInfo.lLinkMode = 0;       //Main StreamClientInfo.sMultiCastIP = NULL;LONG lRealPlayHandle;lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID,&ClientInfo,fRealDataCallBack,NULL,TRUE);if (lRealPlayHandle<0){printf("NET_DVR_RealPlay_V30 failed! Error number: %d\n",NET_DVR_GetLastError());return 0;}//cvWaitKey(0);Sleep(-1);//fclose(fp);//---------------------------------------//关闭预览if(!NET_DVR_StopRealPlay(lRealPlayHandle)){printf("NET_DVR_StopRealPlay error! Error number: %d\n",NET_DVR_GetLastError());return 0;}//注销用户NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return 0;
}

其中最终得到的帧保存在g_frameList.push_back(frametemp);中。前后设置了对应的锁,用来对该帧序列的读写进行保护。这一部分内容是要自己完成的。即定义变量:

CRITICAL_SECTION g_cs_frameList;
std::list<Mat> g_frameList;

主函数中的调用代码,先建立线程,调用上述读摄像头的函数的回调,并把读到的帧序列保存在g_frameList中,然后再读取该序列,保存到Mat里即可:

int main()
{	HANDLE hThread;unsigned threadID;Mat frame1;InitializeCriticalSection(&g_cs_frameList);hThread = (HANDLE)_beginthreadex( NULL, 0, &readCamera, NULL, 0, &threadID );...EnterCriticalSection(&g_cs_frameList);if(g_frameList.size()){list<Mat>::iterator it;it = g_frameList.end();it--;Mat dbgframe = (*(it));//imshow("frame from camera",dbgframe);//dbgframe.copyTo(frame1);//dbgframe.release();(*g_frameList.begin()).copyTo(frame[i]);frame1 = dbgframe;g_frameList.pop_front();}g_frameList.clear(); // 丢掉旧的帧LeaveCriticalSection(&g_cs_frameList);...return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43598.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海康威视摄像机通过SDK实现自动拍照(一)

尊敬的读者您好&#xff1a;笔者很高兴自己的文章能被阅读&#xff0c;但原创与编辑均不易&#xff0c;所以转载请必须注明本文出处并附上本文地址超链接以及博主博客地址&#xff1a;https://blog.csdn.net/vensmallzeng。若觉得本文对您有益处还请帮忙点个赞鼓励一下&#xf…

海康威视RTSP取流

感觉这位老哥的参考https://blog.csdn.net/cug_heshun2013/article/details/79434387https://blog.csdn.net/cug_heshun2013/article/details/79434387 目前的需求是&#xff0c;使用海康威视 网络摄像头上传至服务器。 目前探究到的方法是&#xff0c;使用RTSP进行取流&…

海康威视访客案例说明

目录 案例1、如何通过iSC平台openAPI接口实现访客预约功能 案例2、(普通访客场景)自主开发访客客户端实现先线上预约再现场登记 案例3、(临时访客场景)自主开发访客客户端实现临时来访现场登记 案例4、预约后无需现场登记访客场景 案例1、如何通过iSC平台openAPI接口实现访…

海康威视接口在线调试

一、在线调试页面有两种进入方式&#xff0c;请选择适合您的进入方式&#xff1a; 1、能登录iSC平台运管中心&#xff0c;选择方法一&#xff1b; 2、不能登录iSC平台运管中心&#xff0c;选择方法二&#xff1b; 二、进入在线调试页面方法介绍 方法一&#xff1a;登录运管中…

海康威视网络摄像头配置本地存储服务器(远程连接查看回放)

目录 环境&#xff1a;Win电脑A远程连接B查看录像-win电脑B存储录像 配置 方法&#xff1a; 海康小工具 海康威视网络摄像头答疑 环境&#xff1a;Win电脑A远程连接B查看录像-win电脑B存储录像 A,B两台电脑 A电脑远程连接B电脑&#xff0c;查看录像回放&#xff0c;不用…

2023秋招——海康威视海外技术支持

投递简历之后很快收到了回复邮件&#xff0c;让参加一个【在线测评】&#xff0c;在网上查了一下&#xff0c;类似于公务员的行测题。 在线测评 4部分题型&#xff1a; 1.文字理解&#xff08;考察主题、文字意思是否符合等&#xff09; 2.图表解读&#xff08;根据数据推算…

海康威视接口调用

综合安防管理平台提供了OpenAPI安全认证库&#xff08;Java&#xff09;快速实现接口调用。 Java实现接口调用步骤如下&#xff1a; 新建Java工程&#xff0c;从Hikvision AI Cloud开放平台网站&#xff08;海康开放平台&#xff09;上下载“OpenAPI安全认证库&#xff08;Jav…

如何访问海康威视摄像机的后台

1、首先打开海康威视网络摄像头的web管理页面,点击输入用户名密码进行登录。2、然后在弹出来的界面中,点击打开配等我继续说如何访问海康威视摄像机的后台。 —— 必须修改的三个参数分别是:appkey,secret里面的参数,ip其余的参数用默认值即可。其中有一个要注意的点是,这…

OneNav Extend网址导航书签系统源码开源版

简介&#xff1a; OneNav Extend 是一款开源免费的书签&#xff08;导航&#xff09;管理程序&#xff0c;使用PHP SQLite 3开发&#xff0c;界面简洁&#xff0c;安装简单&#xff0c;使用方便。 OneNav可帮助你你将浏览器书签集中式管理&#xff0c;解决跨设备、跨平台、跨…

秘密胶囊开源版-匿名留言程序源码

正文&#xff1a; 秘密胶囊开源版-最新匿名留言程序源码 秘密胶囊程序由Pings原创&#xff0c;所有代码均为手动编写。 本项目是秘密胶囊项目的最初版本&#xff0c;所有源码均未加密&#xff0c;各位有基础的自寻二开。 本次开源的1.0版本只实现了写留言&#xff0c;查留言…

UML九种图的分类

UML九种图的分类 一、 UML从整体上分类 UML九种图&#xff0c;具体的可以分为五类。 1、用例图&#xff1a;从用户角度描述系统功能&#xff0c;并指出各功能的操作者。 2、静态图&#xff1a;是UML中从系统静态角度来描述的系统。 包括类图和对象图。 类图&#xff1a;描述系…

【不专一的开发】UML(一)——用例图、类图、对象图

目录 脑图 用例图 对象图 脑图 UML&#xff08;Unified Modeling Language&#xff09;统一建模语言。它适用于各类系统的建模&#xff0c;为了可以方便开发而统一的一种通过不同类型生动的图来表达系统的各种功能结构。 用例图 【概念】Use case diagrame描述作为用户的角度…

作为一名高级开发者需要具备的技能之画UML类图

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

[UML] --- 类图

1 类图简介 类图以反映类的结构(属性、操作)以及类之间的关系为主要目的&#xff0c;描述了软件系统的结构&#xff0c;是一种静态建模方法 类图中的“类”与面向对象面向对象面向对象语言中的“类”的概念是对应的&#xff0c;它用来描述系统中的有意义的概念&#xff0c;包括…

UML 类图各符号含义速查

链接&#xff1a;https://pan.baidu.com/s/1RePYipe_4hnW_EtCbD-r9Q 提取码&#xff1a;0000 概述 类图 类名 访问修饰符 变量名 : 返回类型&#xff08;例&#xff1a; Username : String&#xff09; 访问修饰符 方法名 () : 返回类型&#xff08;例&#xff1a; getUserna…

快速识别UML类图

在UML类图中&#xff0c;常见的有以下几种关系: 泛化&#xff08;Generalization&#xff09;, 实现&#xff08;Realization&#xff09;&#xff0c;关联&#xff08;Association)&#xff0c;聚合&#xff08;Aggregation&#xff09;&#xff0c;组合(Composition)&#xf…

小马识途分享创建品牌百科的流程和技巧

大家知道百度百科是人人可参与协作的网络百科全书&#xff0c;无论是创建词条、编辑现有词条&#xff0c;都可以亲手为百度百科作出贡献。虽然理论上百度百科是可以人人创建的&#xff0c;但并不是创建后马上就可以得到展示的&#xff0c;需要通过百度百科的审核机制。所以&…

在线类图各种UML图分享

好工具一定要分享给最好的朋友&#xff0c;ProcessOn助您和好友一起高效办公&#xff01; https://www.processon.com/i/5a37774de4b0dce99f032667

UML图:类图 --详细介绍

类图的概念 描述类、接口及它们之间关系的图&#xff0c;显示系统中各个类的静态结构 类图的元素 类 面向对象系统组织结构的核心对一组具有相同属性、操作、关系和语义的对象的抽象包括名称部分&#xff08;Name&#xff09;、属性部分&#xff08;Attribute&#xff09;…

UML-认识六种箭头,轻松读懂UML图

进行系统设计时&#xff0c;UML是一种常见的面向对象结构设计方式&#xff0c;里面的各种箭头表示经常会把人弄糊涂&#xff0c;如果不能正确理解&#xff0c;实现阶段就会出大问题&#xff0c;失之毫厘&#xff0c;谬以千里&#xff0c;下面带着大家认识下6种常用箭头。 1. 泛…