2016年4月1日 星期五

Convert Image Format between QT and OpenCV

Convert Image Format between QT and OpenCV

對於C++的開發者來說,要開發UI的是非常麻煩的,以往都使用MFC來實現UI的部分,自從認識了QT之後,一切都變得不再麻煩,QT提供了Widget和QML兩種方式實做UI。但對於OpenCV的開發者來說必須先將OpenCV的影像格式轉換到QT的影像格式顯示,或者反過來都是。以下會介紹cv::MatQImageIplImageQImage的轉換。

cv::Mat轉換到QImage

//sharing the buffer 共享記憶體
QImage ConvertQtOpenCV::CvMat2QImage( cv::Mat &image )
{
    QImage qtImg;
    if( !image.empty() && image.depth() == CV_8U ){
        if(image.channels() == 1){
            qtImg = QImage( (const unsigned char *)(image.data),
                            image.cols,
                            image.rows,
                            QImage::Format_Indexed8 );
        }
        else{
            cvtColor( image, image, CV_BGR2RGB );
            qtImg = QImage( (const unsigned char *)(image.data),
                            image.cols,
                            image.rows,
                            QImage::Format_RGB888 );
        }
    }
    return qtImg;
}

IplImage轉換到QImage

//sharing the buffer 共享記憶體
QImage ConvertQtOpenCV::IplImage2QImage( IplImage *image )
{
    QImage qtImg;
    if (image && image->depth == IPL_DEPTH_8U && cvGetSize(image).width > 0 )
    {
        if(image->nChannels == 1){
            qtImg = QImage( (const unsigned char *)(image->imageData),
                            image->width,
                            image->height,
                            QImage::Format_Indexed8 );
        }
        else{
            cvCvtColor( image, image, CV_BGR2RGB );
            qtImg = QImage( (const unsigned char *)(image->imageData),
                            image->width,
                            image->height,
                            QImage::Format_RGB888 );
        }
    }
    return qtImg;
}

QImage轉換到cv::Mat

//sharing the buffer 共享記憶體
cv::Mat ConvertQtOpenCV::QImage2CvMat(QImage &image)
{
    cv::Mat cvImage;
    switch (image.format()){
    case QImage::Format_RGB888:{
        cvImage = cv::Mat(image.height(),
                          image.width(),
                          CV_8UC3,
                          image.bits(),
                          image.bytesPerLine());
        cv::cvtColor(cvImage, cvImage, CV_RGB2BGR);
        return cvImage;
    }
    case QImage::Format_Indexed8:{
        cvImage = cv::Mat(image.height(),
                          image.width(),
                          CV_8U,
                          image.bits(),
                          image.bytesPerLine());
        return cvImage;
    }
    default:
        break;
    }
    return cvImage;
}

QImage轉換到IplImage

//sharing the buffer 共享記憶體
IplImage *ConvertQtOpenCV::QImage2IplImage(QImage &image)
{
    IplImage *cvImage = NULL;
    switch (image.format()){
    case QImage::Format_RGB888:{
        cvImage = cvCreateImageHeader( cvSize(image.width(),
                                       image.height()), 8, 3 );
        cvSetData( cvImage, image.bits(), image.bytesPerLine() );
        cvCvtColor( cvImage, cvImage, CV_RGB2BGR );
        return cvImage;
    }
    case QImage::Format_Indexed8:{
        cvImage = cvCreateImageHeader( cvSize(image.width(),
                                       image.height()), 8, 1 );
        cvSetData( cvImage, image.bits(), image.bytesPerLine() );
        return cvImage;
    }
    default:
        break;
    }
    return cvImage;
}

更多OpenCV文章請參考:OpenCV Tutorial (學習筆記)

0 意見:

張貼留言