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;