2013-03-11 66 views
7

OpenCV功能cvtColor轉換矩陣的顏色空間(例如,從RGB轉換爲灰度)。該函數的C++簽名是可以使用OpenCV函數cvtColor來轉換矩陣嗎?

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0) 

能該功能可以與src相同的對象dst使用轉換矩陣代替,即?

cv::Mat mat = getColorImage(); 
cvtColor(mat, mat, CV_RGB2GRAY); 

(我知道,無論哪種方式,作爲目的地有不同數目的通道比源極,它仍然需要分配一個新的內存塊的目標。)

更多一般來說,OpenCV API中是否有一個約定來確定何時可以以這種方式使用函數?

+1

當源和目標具有相同的通道數時可以完成。例如RGB到YUV,RGB到YCbCr,反之亦然等等。 – sgarizvi 2013-03-11 17:23:10

回答

3

也許現在回答太遲了,但我想說我不同意這裏寫的一些東西。
即使目的矩陣不具有「相同的通道數量」,或者即使尚未創建目標矩陣,也可以將源和目標放置在相同的完全矩陣,沒有問題。
OpenCV程序員完全設計它。
此函數的所有用戶必須做的是注意源Mat是否正確,關於通道數量和數據類型,並記住函數調用後它們可以改變。

證明來自看着source code,上線2406,只是cv::cvtColor(…)函數中的第一行,

Mat src = _src.getMat(); 

被調用,那麼墊DST創建(和DST = _dst = _scr)。
所以cv::cvtColor(…)內部的情況在進行就地調用時如下:src指向舊矩陣,_src,_dst,dst全部指向同一個新分配的矩陣,它將成爲目標矩陣。
這意味着比現在新的變量src和dst(不是來自函數調用_src和_dst的變量)已準備好傳遞給實際的轉換函數。
當函數void cv::cvtColor(…)完成時,src被放置,並且_src,_dst和dst全部指向相同的Mat並且_dst的refcount將轉到1.

+0

是的,我同意這一點,雖然我現在沒有時間去實際測試它。但正如我所看到的,通過InputArray傳遞等價於用cv :: Mat傳遞值,這意味着兩個矩陣指向同一組數據。如果需要重新分配,那麼這不會影響指向原始數據的原始矩陣頭。 – 2016-01-04 12:29:27

+0

是的,在重新分配後,新的矩陣是目標Mat,而Mat是暫時的,當函數結束時將會丟失。我剛剛測試過它,而這個就地方案在OpenCv框架中似乎很平常(幾乎是一個標準)。 – 2016-01-04 18:37:49

3

如果您查看代碼here,您會看到在行2420上,在矩陣dst上調用了create。這意味着數據部分以及該矩陣的標題被重寫。因此,在srcdst中使用相同的矩陣調用此函數可能不太可取。

至於在OpenCV中的約定,看看InputArray and OutputArray,這些似乎表明,無論何時函數調用存在與這些輸入和輸出的數據類型,你應該使用不同的Mat變量。

+0

嗯,我明白你的意思了。但是,當矩陣轉換爲InputArray時,它可能會收到一個新的頭文件?提供一個新的頭部是用指針創建的。另外,查看_InputArray的頭文件https://github.com/Itseez/opencv/blob/9b7dfd677db5818b8dd699e2059c886a1e7ce24f/modules/core/include/opencv2/core/core.hpp表明getMat()函數還會返回一個Mat自己的頭文件而不是對相同頭文件數據的引用。 – 2013-03-12 08:57:43

+0

是......正好......所以你可能應該使用不同的Mat變量......如果你對頭部在哪裏變化以及數據在哪裏沒有清楚的認識,調試這些應用程序可能有點棘手。 – subzero 2013-03-13 12:11:06

2

它必須在就地工作的意義上,dst將在cv::cvtColor的調用之後包含正確轉換後的矩陣。但是如果輸入通道的數量不同於輸出通道的數量,那麼矩陣的數據將被重新分配。

如果你有其中dst不正確就地調用cvtColor後轉換的圖像樣本,那麼請提交一個錯誤上http://code.opencv.org

更一般地,有OpenCV的API中的約定確定何時可以用這種方式使用某個功能?

沒有這樣的約定。但您可以預期大部分基本圖像處理功能都可以在原地進行。因此,已知支持就地調用的所有轉換,過濾器,閾值,仿射/透視轉換。