我有一個圖像有4個通道,格式爲4 * UINT8
。爲什麼openCV的convertto函數不起作用?
我試圖將其轉換爲3個信道浮子和我使用此代碼:
images.convertTo(images,CV_32FC3,1/255.0);
的轉換後,該圖像是在一個浮點格式,但仍然有4個信道。我如何擺脫OpenCV中的第4個(alpha)通道?
我有一個圖像有4個通道,格式爲4 * UINT8
。爲什麼openCV的convertto函數不起作用?
我試圖將其轉換爲3個信道浮子和我使用此代碼:
images.convertTo(images,CV_32FC3,1/255.0);
的轉換後,該圖像是在一個浮點格式,但仍然有4個信道。我如何擺脫OpenCV中的第4個(alpha)通道?
正如@AldurDisciple說,Mat::convertTo()
意在用於改變Mat
的數據類型,而不是改變的號碼通道。
要鍛鍊了,你應該把它分爲兩個步驟:
cvtColor(image, image, CV_BGRA2BGR); // 1. change the number of channels
image.convertTo(image, CV_32FC3, 1/255.0); // 2. change type to float and scale
函數convertTo
專門用於改變Mat
的數據類型。正如文檔(link)中所述,輸出圖像的通道數總是與輸入圖像相同。
如果你想改變數據類型和減少信道的數量,你應該使用的split
,merge
和convertTo
組合:
cv::Mat img_8UC4;
cv::Mat chans[4];
cv::split(img_8UC4,chans);
cv::Mat img_8UC3;
cv::merge(chans,3,img_8UC3);
cv::Mat img_32FC3;
img_8UC3.convertTo(img_32FC3);
另一種方法可以自己重新編碼算法,這很容易,可能更有效。
OpenCV的cvtColor function允許您轉換Mat的類型和通道數量。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
所以像這樣的彩色4通道轉換爲彩色3通道:
cvtColor(image, image, CV_BGRA2BGR, 3)
;
或者使用mixChannels function可能更高效,如果您查看文檔的示例,說明如何拆分通道。
然後,如果你真的想將其更改爲特定類型:
image.convertTo(image,CV_32F);
您好先生,有什麼'1/255.0'?它對於哪些東西有用? – 2015-03-12 11:18:00
@Kabyle'1/255.0'這裏是比例因子,它將值'[0,255]'轉換爲'[0,1]'。有關詳細信息,請參見['Mat :: convertTo()'](http://docs.opencv.org/modules/core/doc/basic_structures.html?highlight=convertto#mat-convertto)的文檔。 – herohuyongtao