2016-03-15 198 views
0

我從類型CV_8UC4的kinect v2中獲得了圖像。 現在我嘗試在類型CV_8UC1中使用以下代碼。CV_8UC4 convertTo CV_8UC1不起作用

cv::Mat mImg(iHeight, iWidth, CV_8UC4); 
cv::Mat mImg2(iHeight, iWidth, CV_8UC1); 
.... 
get image from kinect to mImg 
.... 
mImg.convertTo(mImg2, CV_8UC1); 

之後,mImg2類型仍然是24(CV_8UC4),不知道我是否正確使用此功能。請幫忙。

回答

1

從其他鏈接中找到一些線索。

CV_8UC4到CV_8UC1不是通道問題,所以不要使用convertTo。

cvtColor(mImg,mImg2, CV_BGR2GRAY); 

改爲使用cvtColor,現在改變類型。儘管圖像變得灰暗,但我認爲我找到了正確的道路。

+0

要小心你想做什麼,如果你使用CV_BGR2GRAY它會假設8UC3輸入,而不是8UC4。 CV_BGRA2GRAY會將4個通道轉換爲一個通道。但是:你想達到什麼目的? BGR2GRAY將計算所有通道的線性組合,如0.33 * r + 0.33 * g + 0.33 * b(實際上,綠色和紅色的權重會高於藍色通道!)。不確定Alpha通道到底會有多精確。 – Micka

+0

其實現在CV_8UC1類型的圖像是灰色的。我會做進一步的測試來取代CV_BGR2GRAY。我只想說cvtColor是這個問題的正確選擇,而不是convertTo。 –

+0

確實取決於你想達到什麼,但正如你發現的,convertTo不能用來改變通道的數量。 – Micka

2

取決於你想達到的目標。 Kinect的大概形式{X,Y,深度,somethingelse_forexamplecolor}返回數據,因此,如果你想獲得單獨的墊深度數據,你會與分裂()去:

vector<cv::Mat> channels(4); 
cv::split(mImg, channels); 
cv::Mat depth = channels[2]; //or other than 2 

但可以保留數據一起,訪問它:

char depth = mImg.at<cv::Vec4b>(x,y)[0];