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格式的图象后,你就能做你想做的事情了
///////////////////////////////////////////////////
假设码流帧率为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);
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;
}