2012-04-02 45 views
3

我想在OpenCV 2.3.1中將1通道圖像(16位)轉換爲3通道圖像。轉換1通道圖像爲3通道

Mat temp, tmp2; 
    Mat hud; 
    tmp2 = cv_ptr->image; 
    tmp2.convertTo(temp, CV_16UC1); 
    temp = temp.t(); 
    cv::flip(temp, temp, 1); 
    resize(temp, temp, Size(320, 240)); 
    merge(temp, 3, hud); 

錯誤:我使用的合併功能,並收到以下錯誤有麻煩呼叫沒有匹配功能「合併(CV ::墊&,INT,CV ::墊&)」

任何人都可以幫助我嗎?提前致謝!

回答

1

看起來你沒有正確使用merge。您需要指定所有要「合併」的渠道。我想你想三個通道框架,所有的通道相同,在Python我會寫:

cv.Merge(temp, temp, temp, None, hud) 

從OpenCV的documentation

cvMerge: Composes a multi-channel array from several single-channel arrays or inserts a single channel into the array.

11

如果temp是1個信道矩陣,你要轉換爲3個通道,那麼下面的工作:

cv::Mat out; 
cv::Mat in[] = {temp, temp, temp}; 
cv::merge(in, 3, out); 

檢查Documenation以獲得更多信息。

+0

感謝您對這個信息。 – Mzk 2013-02-28 06:20:20

2

這是一個解決方案,它不需要複製單通道圖像,然後從中創建3通道圖像。此解決方案的內存佔用比使用合併的解決方案少3倍(通過上面的電壓)。 爲CV :: mixChannels見OpenCV的文件,如果你想知道爲什麼這個工程

// copy channel 0 from the first image to all channels of the second image 
int from_to[] = { 0,0, 0,1, 0,2}; 
Mat threeChannelImage(singleChannelImage.size(), CV_8UC3); 
mixChannels(&singleChannelImage, 1, & threeChannelImage, 1, from_to, 3); 
+1

這是一個乾淨而簡短的解決方案,但它與volting提出的解決方案相比沒有什麼優勢,而且這個解決方案也很短,乾淨並具有相同的內存佔用空間。使用{temp,temp,temp}不會複製圖像3次,但它只複製其標題。 – 2014-01-16 06:48:41

+0

你看到這樣一行:cv :: Mat in [] = {temp temp,temp}; 我上面的解決方案避免在[]中分配內存,這是原始圖像大小的3倍。請注意,這是兩個解決方案所需的3通道輸出陣列的補充。 – RawMean 2014-01-16 19:29:57

+3

您提到的行不是分配內存。它創建3個矩陣標題(每個字節少)與圖像'temp'共享相同的圖像緩衝區。 – 2014-01-16 19:52:32

相關問題