簡介:
某些時候,我們會希望能夠在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);
}
}
沒有留言:
張貼留言