2015-07-02 41 views
0

我是OpenCV的新手,隨書附帶。我想提取二進制圖像表示與組件區以下內容:OpenCV clone()和copyTo()方法不會生成與原始類型相同的Mat?

cv::Mat result; 
result = image.clone(); 
cv::watershed(image, result); 

執行時,將產生以下錯誤:

segmentation.cpp:159: error: (-215) src.type() == CV_8UC3 && dst.type() == CV_32SC1 
in function watershed 

錯誤肯定是正確的,因爲我與type2str驗證功能在這個SO後:How to find out what type of a Mat object is with Mat::type() in OpenCV

我也試過使用image.copyTo(result)而不是clone(),但這會產生相同的錯誤信息。 我做錯了什麼,以及如何複製Mat以獲得相同類型?

我猜測哈克解決方案將轉換結果的顏色以匹配圖像的顏色,如在這裏所做的:OpenCV: How to convert CV_8UC1 mat to CV_8UC3但這似乎是錯誤的不是?

+1

無需克隆()或複製圖像*在所有*,甚至是錯誤的。只需將結果留空,並確保您的輸入img是24位bgr(CV_8UC3)。 – berak

回答

3

也如此處所述:Difference Clone CopyTo,在這種情況下,在clone()copyTo()之間沒有區別。

事實上,對於clone()源代碼如下:

inline Mat Mat::clone() const 
{ 
    Mat m; 
    copyTo(m); 
    return m; 
} 

copyTo然而可以聯合使用用掩模,並且一般將數據複製到另一矩陣,因此可以是例如到有用繪製一個子圖像到另一個圖像。

關於用於watershed的代碼中,文檔狀態,

  • 圖像 - 輸入8位3通道圖像。
  • 標記 - 輸入/輸出標記的32位單通道圖像(地圖)。它應該具有與圖像相同的尺寸。

所以image(您image)和markers(您result)不應該是相同的。

Before passing the image to the function, you have to roughly outline the desired regions in the image markers with positive (>0) indices. So, every region is represented as one or more connected components with the pixel values 1, 2, 3, and so on. Such markers can be retrieved from a binary mask using findContours() and drawContours() (see the watershed.cpp demo). The markers are 「seeds」 of the future image regions. All the other pixels in markers , whose relation to the outlined regions is not known and should be defined by the algorithm, should be set to 0’s. In the function output, each pixel in markers is set to a value of the 「seed」 components or to -1 at boundaries between the regions.

Visual demonstration and usage example of the function can be found in the OpenCV samples directory (see the watershed.cpp demo).

+0

我明白了你的觀點,但我的問題的另一部分是爲什麼結果和圖像在.clone或.copyTo方法之後不匹配? –

+0

沒有區別。除非你在copyTo中指定一個roi,但這是另一回事。 – Miki

+0

用copyTo和clone更新答案 – Miki

相關問題