海康威视IP摄像头基于OPENCV的二次开发

最近玩了一下海康的IPcamera,与普通的WEBcamera输出RGB图像不同,其解码后输出的图像格式为YV12,这使得我们不能用熟悉的两行代码

就获得可以用opencv直接处理的源图像了,这一度造成了不少麻烦。

所以贴出部分代码,希望对正在使用或者也想玩下海康摄像头的朋友一点参考。

能力有限,若有误,勿喷!

转YV12到YCrCb的函数实现有很多,代码不知谁写的,我是从雪水的这篇博客(超链接)看到的,亲测可以实现。

  1. void yv12toYUV(char *outYuv, char *inYv12, int width, int height,int widthStep)  
  2. {  
  3.    int col,row;  
  4.    unsigned int Y,U,V;  
  5.    int tmp;  
  6.    int idx;    
  7.    for (row=0; row<height; row++)  
  8.    {  
  9.       idx=row * widthStep;  
  10.       int rowptr=row*width;  
  11.   
  12.       for (col=0; col<width; col++)  
  13.       {  

  14.          tmp = (row/2)*(width/2)+(col/2);  
  15.  
  16.          Y=(unsigned int) inYv12[row*width+col];  
  17.          U=(unsigned int) inYv12[width*height+width*height/4+tmp];  
  18.          V=(unsigned int) inYv12[width*height+tmp];  

  19.          if((idx+col*3+2)> (1200 * widthStep))  
  20.          {  
  21.           //printf("row * widthStep=%d,idx+col*3+2=%d.\n",1200 * widthStep,idx+col*3+2);  
  22.          }   
  23.          outYuv[idx+col*3]   = Y;  
  24.          outYuv[idx+col*3+1] = U;  
  25.          outYuv[idx+col*3+2] = V;  
  26.       }  
  27.    }  
  28. }  

本文推荐用cvtColor()函数,opencv2.4.8以上版本自定义了宏CV_YUV2BGR_YV12,可以实现这一转换;

以下是主函数:以下是实时流回调函数fRealDataCallBack:以下是解码回调函数,在解码回调之前需声明一个List容器,用以存放帧数据,该List最好定义为全局变量,便于在线程里opencv处理。此处利用解码回调函数做视频格式转换操作,并将RGB图像存入frameQueue。利用多线程编程,在另一个线程里用opencv处理图像或其他操作,我这里是进行跟踪的,其中,实时帧数realframe_count是用来控制取帧间隔时间的,因为opencv图像处理线程会运行相应复杂算法或者别的操作,时间消耗较大,不可能逐一处理每一帧。线程通过一个按钮开启,响应函数如下,由于贴的使部分代码,请自动忽略无关内容!以下为取帧线程函数:到这一步就可以了,另外,在函数中是不需要waitkey来控制帧率的,海康的SDK好像是自动回调的!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值