QT與OpenCV開發常用的圖像格式轉換函數:QImage轉Mat、Mat轉QImage、QImage轉IplImage、IplImage轉QImage

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;

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章