[英]Why does openCV's convertto function not work?
我的圖像有4個通道,采用4 * UINT8
格式。
我試圖將其轉換為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
的數據類型。 如文檔( 鏈接 )中所提到的,輸出圖像的通道數始終與輸入圖像相同。
如果要更改數據類型並減少通道數,則應使用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函數允許您轉換Mat的通道類型和數量。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
所以這樣的東西會將彩色4通道轉換為彩色3通道:
cvtColor(image, image, CV_BGRA2BGR, 3)
;
或者使用mixChannels函數可能更有效,如果您查看文檔,其示例將顯示如何拆分通道。
然后,如果您真的想將其更改為特定類型:
image.convertTo(image,CV_32F);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.