QT配合OpenCV完成图像处理时,经常使用QT显示OpenCV处理的图像数据,下面列出常用的一些转换函数,方便OpenCV与QT之间转换。
适用的OpenCV的版本:OpenCV3.X和OpenCV2.X版本。
(1) 将QImage图片转为opecv的qimage格式
IplImage *Widget::QImage_to_IplImage(const 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);
CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+0 ) = qBlue(rgb);
CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+1 ) = qGreen(rgb);
CV_IMAGE_ELEM( IplImageBuffer, uchar, y, x*3+2 ) = qRed(rgb);
}
}
return IplImageBuffer;
}
(2). 将opecv的图片转为qimage格式
QImage *Widget::IplImage_to_QImage(IplImage *img)
{
QImage *qmg;
uchar *imgData=(uchar *)img->imageData;
qmg = new QImage(imgData,img->width,img->height,QImage::Format_RGB888);
*qmg=qmg->rgbSwapped(); //BGR格式转RGB
return qmg;
}
(3). 将QImage图片转为Mat格式
Mat Widget::QImage_to_cvMat(QImage image)
{
Mat mat;
switch(image.format())
{
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
mat = Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
break;
case QImage::Format_RGB888:
mat = Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
cvtColor(mat, mat, CV_BGR2RGB);
break;
case QImage::Format_Indexed8:
mat = Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat;
}
(4). 将Mat图片转为QImage格式
QImage Widget::Mat_to_QImage(const Mat& InputMat)
{
Mat TmpMat;
if (InputMat.channels() == 1)
{
cvtColor(InputMat, TmpMat, CV_GRAY2RGB);
}
else
{
cv::cvtColor(InputMat, TmpMat, CV_BGR2RGB);
}
QImage Result = QImage((const uchar*)(TmpMat.data), TmpMat.cols, TmpMat.rows,QImage::Format_RGB888);
Result.bits();
return Result;
}
(5). QLabel显示函数
//显示检测的结果
void Widget::show_face(IplImage* img)
{
uchar *imgData=(uchar *)img->imageData;
QImage my_image=QImage(imgData,img->width,img->height,QImage::Format_RGB888);
my_image=my_image.rgbSwapped(); //BGR格式转RGB
QPixmap my_pix; //创建画图类
my_pix.convertFromImage(my_image);
/*在控件上显示*/
ui->label_display->setPixmap(my_pix);
}
在QT框架里开发OpenCV,为了方便调用OpenCV里的函数,记得要在头文件声明OpenCV的命名空间,不然每次调用函数都得cv::xxxx。
using namespace cv;