2012年4月4日

把OpenCV的IpLImage資料放置QT的QImage


簡介:
某些時候,我們會希望能夠在QT的開發環境中使用openCV來處理影像,可是openCV的保存影像內容的資料結構是IpLImage;QT保存影像內容的方式是透過類別QImage保存,那麼這時候該如何做這之間的影像搬移呢?



處理方式:
要完成轉換的關鍵有兩點:首先是QImage與IpLImage的三顏色順序是「相反的」,QImage是RGB,而IpLImage是BGR;因此我們需要先對IpLImage中的R與B做轉換。
轉換的方式可以透過openCV的cvConvertImage (const CvArr* src, CvArr* dst, int flags=0),從openCV的Document可以看到:




第三個參數的設定是關鍵,CV_CVTIMG_SWAP_RB,可以把R與B對調,並放置另外一個目的地位置。
再來,第二個關鍵在於,創建QImage時,需要哪些IpLImage中的參數?
我們從QT的Document中來找一下QImage創建時有哪些建構子可以使用,之後找到了下面這一個多載的建構子:

節錄至 QImage | Documentation | Qt Developer Network


uchar  *data: 主要影像內容
int width : 影像寬
int height : 影像高
int bytesPerLIne:widthStep : 每一列影像像素的Bytes總數
Format format:影像格式及位元深度


而你的影像若為彩色,則代表是RGB三顏色,個顏色又占8bits,因此Format的格式選則為Format_RGB888
若為灰階,則為單通道,因此Format格式選用Format_indexed8 

最後,程式法如下:

QImage MainWindow::convertProcess(IplImage *image)
{
    if(image->nChannels == 1) {
        return QImage((unsigned char *)image->imageData,image->width,image->height,image->widthStep,QImage::Format_Indexed8);
    }
    else{
        cvConvertImage(image,image,CV_CVTIMG_SWAP_RB);
        return QImage((unsigned char *)image->imageData,image->width,image->height,image->widthStep,QImage::Format_RGB888);
    }
}


沒有留言:

ShareThis