在opencv中,我們常常這樣用,cv::Mat image;
下面讓我們看看mat的內部。
打印image.channels,得到的會是幾呢?
答案是1,看來默認的Mat是1通道的,也就是灰度圖。
好處是:
1節省了內存
2節省了圖像處理的時間
那麼調用image = imread (“./test.jpeg”);
打印image.channels,得到的會是幾呢?
答案是3,也就是RGB888類型的圖片,不知道這是不是imread返回的默認格式。
但估計灰度圖和RGB888兩種格式圖片是opencv裏用到頻率極高的。
因此opencv在處理圖像時常常用到一個函數:
cvtColor( srcMat, src_gray, CV_BGR2GRAY );
把3通道的彩色圖轉換成1通道的灰色圖。
對於一個bgr的彩色圖像,如何分離出b,g,r呢?
opencv中有split 和 merge函數
cv::Mat channels[3];
cv::split(srcMat, channels);
藍色:channels[0] == 1通道的mat 裏面是藍色的灰度值
綠色:channels[1] == 1通道的mat 裏面是綠色的灰度值
紅色:channels[2] == 1通道的mat 裏面是紅色的灰度值
此時如果用imshow (“藍色”,channels[0]);
會看到什麼呢?
會看到一幅灰度圖片,一點藍的影子都沒有。
那如何真正顯示出藍色呢?
藍色是彩色,3通道的纔是彩色,所以藍色是3通道的彩色圖,只不過紅色和綠色通道的值是零。
cv::Mat bkground;
bkground.create(srcMat.rows, srcMat.cols, CV_8UC1);
bkground.copyTo(channels[1]);
bkground.copyTo(channels[2]);
merge (channels, 3, dstMat);
imshow (“藍色”,dstMat);
這樣便會看到藍色。
有時需要在qt上顯示opencv處理後的圖像。
QImage image;
打印image.format()的值是多少呢?
答案是0,查看文檔,表示invalid。
如果QImage image (”./test.jpeg”);
打印image.format()的值是多少呢?
答案是4,查看文檔,表示RGB32,也就是4通道。
可見對於彩色圖opencv和qt默認的通道數是不一樣的,一個是3,一個是4。
經過實驗發現,3通道比4通道在處理起來更簡單。
那如何把qt中的4通道抓換成3通道呢?
image = image.convertToFormat(QImage::Format_RGB888);
Mat tmpMat = QImage2cvMat (image);
然後對tmpMat用opencv的函數處理,
處理之後還需要用 cv::cvtColor(tmpMat, tmpMat, CV_BGR2BGRA)把3通道的tmpMat轉換成QImage默認的4通道,然後就可以在qt中正常顯示了。
下面這個文章寫的很好。
參考文章:http://blog.csdn.net/liyuanbhu/article/details/46662115