捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(二)
捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(二)
版权声明:本文为博主原创文章,未经博主允许不得转载。
http://blog.csdn.net/wanghuiqi2008/article/details/31410509
海康威视IPCamera图像捕获
捕获海康威视IPCamera图像,转成OpenCV可以处理的IplImage图像(一)
捕获海康威视IPCamera图像,转成OpenCV可以处理的IplImage图像(二)
所使用海康威视摄像头型号:DS-2CD4026FWD-(A)(P)
海康威视IPCamera图像捕获方法有两种:
(1)利用SDK里面的NET_DVR_CaptureJPEGPicture_NEW进行视频抓图
(2)捕获实时流,将实时流解码成YV12,然后转换成RGB
在上一篇博文里,我介绍了第一种方法,但是由于NET_DVR_CaptureJPEGPicture_NEW该函数执行需要较长时间,无法实时,所以必须继续第二种方法。
在这篇博文里,我将介绍第二种方法,将捕获到的海康威视IPCamera摄像头图像转成OpenCV能处理的IplImage图像。
在实现完捕获海康威视IPCamera图像,转成OpenCV可以处理的IplImage图像(一)里面的方法后,发现不能实时,这个系统我是要做给给人看的,是需要实时演示的,这样子肯定是不行的。纠结了好久!然后查看海康威视《设备网络SDK使用手册_V4.2》,里面有一个预览模块示例程序,可惜我一直运行不了,报出的错误是PROCGETCONSOLEWINDOW GetConsoleWindow中的GetConsoleWindow被重定义,后来一直调试没调成功。
实在是没辙了,打海康客服,不过海康的客服我实在无语,北京的完全无法接通,直接打杭州的,打了四五遍终于有个人接电话了,对方不懂,然后说让个工程师回电话。OK,终于回了。他告诉我http://www.hikvision.com/cn/download_more_401.html 这里是有例程的,有分功能示例!突然间有了希望了,例程是VC6.0工程,改了一些地方后,终于能运行了。于是,将他的MFC工程相关的代码抠出来,重组。于是实现了捕获YV12格式的视频流的功能,光有YV12还是不行的,需要将YV12转成YUV4:4:4的,然后再将YUV色度空间转换成RGB色度空间,这个过程是在信件的DecBFun回调函数(回调函数请看这里!)里面执行的。
不多说了,上代码!
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include "Windows.h"
- #include "HCNetSDK.h"
- #include "PlayM4.h"
- #include <opencv2\opencv.hpp>
- #include "cv.h"
- #include "highgui.h"
- #include <time.h>
- #define USECOLOR 1
- usingnamespacestd;
- usingnamespacestd;
- //--------------------------------------------
- intiPicNum=0;//Set channel NO.
- LONGnPort=-1;
- HWNDhWnd=NULL;
- voidyv12toYUV(char*outYuv,char*inYv12,intwidth,intheight,intwidthStep)
- {
- intcol,row;
- unsigned intY,U,V;
- inttmp;
- intidx;
- //printf("widthStep=%d.\n",widthStep);
- for(row=0; row<height; row++)
- {
- idx=row * widthStep;
- introwptr=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数据
- voidCALLBACK DecCBFun(longnPort,char* pBuf,longnSize,FRAME_INFO * pFrameInfo,longnReserved1,longnReserved2)
- {
- longlFrameType = pFrameInfo->nType;
- if(lFrameType ==T_YV12)
- {
- #if USECOLOR
- //int start = clock();
- IplImage* pImgYCrCb = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 3);//得到图像的Y分量
- yv12toYUV(pImgYCrCb->imageData, pBuf, pFrameInfo->nWidth,pFrameInfo->nHeight,pImgYCrCb->widthStep);//得到全部RGB图像
- IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 3);
- cvCvtColor(pImgYCrCb,pImg,CV_YCrCb2RGB);
- //int end = clock();
- #else
- IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth,pFrameInfo->nHeight), 8, 1);
- memcpy(pImg->imageData,pBuf,pFrameInfo->nWidth*pFrameInfo->nHeight);
- #endif
- //printf("%d\n",end-start);
- cvShowImage("IPCamera",pImg);
- cvWaitKey(1);
- #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
- {
- }
- *******************/
- }
- ///实时流回调
- voidCALLBACK fRealDataCallBack(LONGlRealHandle,DWORDdwDataType,BYTE*pBuffer,DWORDdwBufSize,void*pUser)
- {
- DWORDdRet;
- switch(dwDataType)
- {
- caseNET_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;
- caseNET_DVR_STREAMDATA://码流数据
- if(dwBufSize > 0 && nPort != -1)
- {
- BOOLinData=PlayM4_InputData(nPort,pBuffer,dwBufSize);
- while(!inData)
- {
- Sleep(10);
- inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);
- OutputDebugString(L"PlayM4_InputData failed \n");
- }
- }
- break;
- }
- }
- voidCALLBACK g_ExceptionCallBack(DWORDdwType,LONGlUserID,LONGlHandle,void*pUser)
- {
- chartempbuf[256] = {0};
- switch(dwType)
- {
- caseEXCEPTION_RECONNECT://预览时重连
- printf("----------reconnect--------%d\n", time(NULL));
- break;
- default:
- break;
- }
- }
- voidmain() {
- //---------------------------------------
- // 初始化
- NET_DVR_Init();
- //设置连接时间与重连时间
- NET_DVR_SetConnectTime(2000, 1);
- NET_DVR_SetReconnect(10000, true);
- //---------------------------------------
- // 获取控制台窗口句柄
- //HMODULE hKernel32 = GetModuleHandle((LPCWSTR)"kernel32");
- //GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
- //---------------------------------------
- // 注册设备
- LONGlUserID;
- NET_DVR_DEVICEINFO_V30 struDeviceInfo;
- lUserID = NET_DVR_Login_V30("10.102.7.88", 8000,"admin","12345", &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);
- //cvNamedWindow("IPCamera");
- //---------------------------------------
- //启动预览并设置回调数据流
- NET_DVR_CLIENTINFO ClientInfo;
- ClientInfo.lChannel = 1; //Channel number 设备通道号
- ClientInfo.hPlayWnd = NULL; //窗口为空,设备SDK不解码只取流
- ClientInfo.lLinkMode = 0; //Main Stream
- ClientInfo.sMultiCastIP = NULL;
- LONGlRealPlayHandle;
- 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;
- }
- //cvWaitKey(0);
- Sleep(-1);
- //fclose(fp);
- //---------------------------------------
- //关闭预览
- if(!NET_DVR_StopRealPlay(lRealPlayHandle))
- {
- printf("NET_DVR_StopRealPlay error! Error number: %d\n",NET_DVR_GetLastError());
- return;
- }
- //注销用户
- NET_DVR_Logout(lUserID);
- NET_DVR_Cleanup();
- return;
- }
终于能够实时捕获图像了,而且转换成了OpenCV能够处理的图像格式。
在这个过程中搜了很多资料,但是没有一个地方能详细说明,不过最终还是把这个给解决了。
附加说明:如果最后要做图像处理而不是像我这样只是将采集的图像显示出来,那么下面的语句是不需要的。
- #if USECOLOR
- cvReleaseImage(&pImgYCrCb);
- cvReleaseImage(&pImg);
- #else
- cvReleaseImage(&pImg);
- #endif
后记:虽然这个功能实现了,但是与我的图像处理函数如何结合到一起?我想到的是用链队列,双线程。链队列代码请看这里!
写这两篇博文的目的其实也是想让处于探索过程中的开发人员能少走些弯路,节省些时间,衷心希望本文能够帮到你!
因为本人已经毕业,项目也早就已经结题了,手头上不再具有可供调试的硬件设备,因此对于大家所碰到的问题,我基本上也已经无法回答了,非常抱歉!如果大家在开发海康威视摄像头的过程中遇到了什么问题可以去跟海康客服去沟通,如果您所在地区的客服无法联系上的话,请直接联系杭州总部的客服。
最后,对之前很长一段时间对大家所提出的问题一直置之不理再次表示道歉!谢谢大家的支持!
**************************************************************************************
转载请注明出处:http://blog.csdn.net/wanghuiqi2008/article/details/31410509
**************************************************************************************
- 顶
- 25
- 踩
- 0
- 上一篇捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(一)
- 下一篇内存IplImage图像链队列实现
- 猜你在找
- Python编程基础视频教程(第五季)
- Python编程基础视频教程(第七季)
- Swift视频教程(第三季)
- C++语言基础
- Cocos2d-Lua手游开发基础篇
- OpenCV中读取RGB格式图像转成HSV格式图像显示
- 海康威视采集卡结合opencv使用两种方法
- opencv读取海康威视摄像头
- OpenCV+海康威视摄像头的实时读取
- 海康威视API-单帧数据捕获并保存成JPEG图片NET_DVR_CaptureJPEGPicture
捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(二)相关推荐
- 捕获海康威视IPCamera图像,转成OpenCV能够处理的图像(二)
海康威视IPCamera图像捕获 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图像(一) 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图 ...
- 捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(一)
海康威视IPCamera图像捕获 捕获海康威视IPCamera图像,转成OpenCV可以处理的IplImage图像(一) 捕获海康威视IPCamera图像,转成OpenCV可以处理的IplImage图 ...
- 图像修复 python_Python OpenCV|cv2.inpaint()函数,图像修复
概念 修复是图像插值.数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用. 大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等.你有没有想过恢复它?我们不能简单地在绘画工 ...
- 海康威视IPCamera图像捕获 二种方法
所使用海康威视摄像头型号:DS-2CD4026FWD-(A)(P) 海康威视IPCamera图像捕获方法有两种: (1)利用SDK里面的NET_DVR_CaptureJPEGPicture_NEW进行 ...
- java识别图片中的图形形状_基于Java+OpenCV技术对几何图像颜色与形状识别
基于 Java+OpenCV 技术对几何图像颜色与形状识别 杨思阳 黄军 吴春秋 (黔东南民族职业技术学院,贵州 凯里 556000) [摘 要] 通过 Java 调用 OpenCV 视觉库实现几何图 ...
- 2.ROS机器视觉——ROS图像(imgmsg)与opencv(cv2)对接
参考:古月学院和ROS机器人开发实践 目标:实现ROS系统读取摄像头的图像,ROS读取的图像数据转化为opencv中的图像,opencv对接受的图像进行处理,最后返回给ROS系统可视化输出. 安装op ...
- OpenCV透视变换应用于图像的实例(附完整代码)
OpenCV透视变换应用于图像的实例 OpenCV透视变换应用于图像的实例 OpenCV透视变换应用于图像的实例 #include "opencv2/imgproc.hpp" #i ...
- OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔
OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 目录 OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 1. 图像梯度 1.1 Sobel和Schar ...
- python图像条状状噪声_一起学opencv-python十(给图像加噪声,模糊处理和图像锐化)...
参考了https://www.bilibili.com/video/av24998616/?p=9 https://www.bilibili.com/video/av24998616/?p=10和 h ...
最新文章
- 周志华等人新著!国内第一部AI本科专业教育培养体系出炉
- 交换二维数组元素c语言,二维数组中元素替换问题!
- 【jetson nano】ubuntu- python-ssh远程控制jetson nano与单片机串口通信
- ❤️拿到offer的成长之路与经验感悟分享❤️
- 开始使用Spring Cloud实战微服务
- Kernel Memory Layout on ARM Linux
- 如何把服务器系统克隆出来,一次Win2003服务器下的完全克隆 -电脑资料
- Android 驱动(10)----设备树(二)linux内核顶层am335x-evm.dts
- Hdu-1358Period(KMP算法之next数组的应用)
- 街头霸王全人物故事背景
- windows配置指定网段流量走虚拟专用网络
- 怎样让照片变得更清晰,这几个方法真的好用!
- rust怎么拆除墙壁指令_腐蚀RUST指令大全
- 西门子840Dsl系统的刀具列表数据采集
- 关于JSON.stringify()的用法
- 个人写的JSP个人日记本分享学习经验
- 吴裕雄--天生自然 诗经:所见
- PSNR峰值信噪比matlab实现
- python批量处理视频教程_如何用python批量调整视频声音
- Dozer 时间转换问题
热门文章
- Spring Bean 生命周期之“我从哪里来”?懂得这个很重要
- 自动对焦模块理论基础及其硬件实现浅析(一)
- LC滤波器设计学习笔记(一)滤波电路入门
- 2014年节假日放假方案发布,全年假期依然维持11天不变
- MyBatis 如果不存在则插入
- 持续迭代、永久更新的WIN NFT HORSE,具有无穷无尽的生命力
- 当面试官问“你有什么要问我的吗”时,应该说什么?
- 对于RISC-V的初步学习理解——RISC-V简介
- 千里马Android Framework-input系统专题blog目录集合
- error: insufficient permission for adding an object to repository database .git/objects
我的在VC6.0 + opencv1.0下报错
error C2664: 'OutputDebugStringA' : cannot convert parameter 1 from 'unsigned short [26]' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
请问楼主的#include <opencv2\opencv.hpp>是opencv2版本的吗?
然后在输出调试中提示PlayM4_InputData failed
这个是什么问题导致的?内存溢出吗?
我用这段程序运行看不到视频,只卡在黑色DOS界面上,感觉在不停取帧,但是没有显示,是怎么回事?
PS:我用的是openCV 1.0 ,跟这个有关吗?
你的实时处理速度是否能跟得上采集速度,如果处理速度很慢,那么处理后在显示出来,那当然显示的不是实时的。
弄两个回调函数?分别处理视频流? 博主能给个交流qq吗?谢谢了
用这种方法没有出现卡顿现象的。
楼主这篇博文很有用,感谢分享!
很不错,关于raw图像的处理