用OpenCV直接create一个窗口,显示图像数据。
其中需要注意的是:
1、Opencv库一般应用的是unsigned char* ,而项目中的是long * 数据,只需强制转换一下就可以了,这里还是地址存储数据的问题。
2、YUV有多种格式,这里是YUV420 具体参考上篇文章。 cvCvtColor(yuvimage,rgbimg,CV_YCrCb2RGB);
IplImage* YUV420_To_IplImage_Opencv(unsigned char* pYUV420, int width, int height)
{
if (!pYUV420)
{
return NULL;
}
IplImage *yuvimage,*rgbimg,*yimg,*uimg,*vimg,*uuimg,*vvimg;
int nWidth = width;
int nHeight = height;
rgbimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);
yuvimage = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,3);
yimg = cvCreateImageHeader(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);
uimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);
vimg = cvCreateImageHeader(cvSize(nWidth/2, nHeight/2),IPL_DEPTH_8U,1);
uuimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);
vvimg = cvCreateImage(cvSize(nWidth, nHeight),IPL_DEPTH_8U,1);
cvSetData(yimg,pYUV420, nWidth);
cvSetData(uimg,pYUV420+nWidth*nHeight, nWidth/2);
cvSetData(vimg,pYUV420+long(nWidth*nHeight*1.25), nWidth/2);
cvResize(uimg,uuimg,CV_INTER_LINEAR);
cvResize(vimg,vvimg,CV_INTER_LINEAR);
cvMerge(yimg,uuimg,vvimg,NULL,yuvimage);
cvCvtColor(yuvimage,rgbimg,CV_YCrCb2RGB);
cvReleaseImage(&uuimg);
cvReleaseImage(&vvimg);
cvReleaseImageHeader(&yimg);
cvReleaseImageHeader(&uimg);
cvReleaseImageHeader(&vimg);
cvReleaseImage(&yuvimage);
if (!rgbimg)
{
return NULL;
}
return rgbimg;
}
main()
{
IplImage * iplimg = YUV420_To_IplImage_Opencv( (unsigned char*)pTDFrame, 1280, 720);
//取到的帧,进行算法处理
//CString strChannID = GetMPID().c_str();
/*int num=GTProcessFrame(0, (unsigned char *)pTDFrame, GT_LIGHTING_AUTO, GT_MIN_VEHICLE_SN, pFDChann->pVehicleInfos);
if (num > 0)
{
int result = 1;
}*/
cvShowImage("tracker",iplimg);
if(cvWaitKey(10)>=0)
break;
cvReleaseImage(&iplimg);
}