2014-03-04 28 views
5

我有一個圖像有4個通道,格式爲4 * UINT8爲什麼openCV的convertto函數不起作用?

我試圖將其轉換爲3個信道浮子和我使用此代碼:

images.convertTo(images,CV_32FC3,1/255.0); 

的轉換後,該圖像是在一個浮點格式,但仍然有4個信道。我如何擺脫OpenCV中的第4個(alpha)通道?

回答

8

正如@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 
+0

您好先生,有什麼'1/255.0'?它對於哪些東西有用? – 2015-03-12 11:18:00

+5

@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

1

函數convertTo專門用於改變Mat的數據類型。正如文檔(link)中所述,輸出圖像的通道數總是與輸入圖像相同。

如果你想改變數據類型減少信道的數量,你應該使用的splitmergeconvertTo組合:

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); 

另一種方法可以自己重新編碼算法,這很容易,可能更有效。

0

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); 
相關問題