在qt中使用opencv时,不可避免的要用到图像的显示,若用opencv自带的函数进行显示,需要在linux下安装gtk,在PC机上比较容易安装,但在zedboard板卡上移植rainysky做了好久都没有搞定。故采用了QImage与IplImage相互转换的方法解决图像的显示,即用QImage显示图像,在IplImage格式采用opencv处理图像。
QImage转为IplImage:
IplImage *QImageToIplImage( QImage * qImage)
{
int width = qImage->width();
int height = qImage->height();
CvSize Size;
Size.height = height;
Size.width = width;
IplImage *IplImageBuffer = cvCreateImage(Size, IPL_DEPTH_8U, 3);
for (int y = 0; y < height; ++y)
{
for (int x = 0; x < width; ++x)
{
QRgb rgb = qImage->pixel(x, y);
cvSet2D(IplImageBuffer, y, x, CV_RGB(qRed(rgb), qGreen(rgb), qBlue(rgb)));
}
}
return IplImageBuffer;
}
IplImage 转为 QImage:
这个转换需要考虑到 IplImage是几通道的,或者中间可能会出现问题。
QImage *iplImgToQImg(IplImage* cvimage)
{
if (!cvimage)
return 0;
QImage* desImage = new QImage(cvimage->width,cvimage->height,QImage::Format_RGB32);
for(int i = 0; i < cvimage->height; i++)
{
for(int j = 0; j < cvimage->width; j++)
{
int r,g,b;
if(3 == cvimage->nChannels)
{
b=(int)CV_IMAGE_ELEM(cvimage,uchar,i,j*3+0);
g=(int)CV_IMAGE_ELEM(cvimage,uchar,i,j*3+1);
r=(int)CV_IMAGE_ELEM(cvimage,uchar,i,j*3+2);
}
else if(1 == cvimage->nChannels)
{
b=(int)CV_IMAGE_ELEM(cvimage,uchar,i,j);
g=b;
r=b;
}
desImage->setPixel(j,i,qRgb(r,g,b));
}
}
return desImage;
}
联系客服