• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
zd_ad
博客园    首页    新随笔    联系   管理    订阅  订阅
opencv ipcam

OpenCV能处理bmp格式位图,也可以直接处理单通道的灰度图的;你从海康采集卡获得YV12的彩色图象,直接提取Y分量就成了
灰度图。然后在OpenCV中创建单通道的IplImage格式的图象,就可以进行处理了:
流程及部分关键代码:
1.获得海康板卡的原始码流YV12(彩色的),能得到图象的宽度W,高度h,以及大小Size,图象数据指针pBuffer;
2.从原始的YV12数据帧提取Y(灰度)分量(做图象的分析一般是先将图象灰度化,以减少计算量)
  int nYSize=w*h; //灰度图象的大小==YV12中Y分量长度.
  char *pYData =new char [nYSize]; 
  memcpy(pYData,pBuffer,nYSize); //pYData就是一帧灰度图;这句以及上一句可以省略,为了你能看的更清楚点。
3.创建单通道的IplImage的图象
  IplImage *pIplImage=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1); //创建但通道的位深为8位的IplImage格式的图象
  if(pIplImage)
  {
  memcpy(pIplImg->imageData,pYData,nYSize);
  }
4.构造了一个IplImage格式的图象后,你就能做你想做的事情了

 

 

///////////////////////////////////////////////////

如果我没看错的话,楼主是想在海康板卡的预览回调函数里实现图像数显示是吧?不知楼主有没有看海康板卡预览回调里给的数据格式呢?如果我没记错,他们家给的应该是YUV422。还有就是楼主在回调函数里做这么多事情也可能是无法显示的原因之一。正确的做法是在回调函数吧图像数据保存在一个buff中,另开一个线程,从buff中取数据然后处理和显示。

假设码流帧率为25帧/秒,那么该回调函数每40毫秒回调一次,你在这个回调函数里做的处理所花费的时间不应该超过40毫秒(保险起见,应该在30毫秒以下),如果超过了,可能会对解码流程造成影响。

//////////////////////////////////////////////////

 

 海康威视采集卡结合opencv使用的问题

 

 

/////////////////////////////////////////////////////

各位前辈,小弟用海康SDK读取海康网络摄像机的视频帧到内存中,并用openCV的cvSetData将内存中的数据读取出来并显示(我是用CxImage将读出的JPG格式转换成cv可以读取的bmp格式)。结果图像发生了偏移。经过我的验证,问题应该是出在cvSetData这个地方,因为在将数据读入cvSetData之前我将内存中的数据直接保存为文件,图像均为正常,将执行cvSetData之后的数据保存成文件就出现了图片的偏移现象。以下是我的代码和图像,请各位高手指点。
CxImage* jpgImg = new CxImage((byte*)buffer,bufferSize,CXIMAGE_FORMAT_JPG);
jpgImg->Encode(bmpBuffer,jSize,CXIMAGE_FORMAT_BMP);
memcpy(bpBuffer,bmpBuffer,jpgSize);
jpgImg->FreeMemory(bmpBuffer);
delete jpgImg;
pFrame = cvCreateImageHeader(cvSize(704,576),IPL_DEPTH_8U,3);
cvSetData(pFrame,bpBuffer,pFrame->widthStep);

帖子

海康板卡中采集opencv格式的视频,希望对大家有用:
UCHAR imageBuf[704 * 576*2];
DWORD Size = 704 * 576*2;
DWORD hSize=704 * 576;
UCHAR *imageBuffer=new UCHAR[hSize];
cvNamedWindow("image",0);
while(1)
{
GetOriginalImage(ChannelHandle[0], imageBuf, &Size);
memcpy(imageBuffer,imageBuf,hSize);
IplImage *pIplImage=cvCreateImage(cvSize(704,576),IPL_DEPTH_8U,1);
if(pIplImage)
{
memcpy(pIplImage->imageData,imageBuffer,hSize);
cvShowImage("image",pIplImage);
cvReleaseImage(&image);
}
if(cvWaitKey(100)==27)
break;
}

 

posted on 2010-11-18 10:28  zd_ad  阅读(800)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3