2017-02-25 145 views
1

我想下面的OpenCV的C++轉換到Python:轉換C++ CopyTo從到Python

.cpp的:

//step1 
Mat edges; 
adaptiveThreshold(vertical, edges, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2); 
imshow("edges", edges); 
// Step 2 
Mat kernel = Mat::ones(2, 2, CV_8UC1); 
dilate(edges, edges, kernel); 
imshow("dilate", edges); 
// Step 3 
Mat smooth; 
vertical.copyTo(smooth); 
// Step 4 
blur(smooth, smooth, Size(2, 2)); 
// Step 5 
smooth.copyTo(vertical, edges); 
// Show final result 
imshow("smooth", vertical); 

我不知道如何處理轉換步驟3到Python。我已經在你的情況在python

#step1 
edges = cv2.adaptiveThreshold(vertical,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,-2) 

#step2 
kernel = np.ones((2, 2), dtype = "uint8") 
dilated = cv2.dilate(edges, kernel) 

回答

2

cv::Mat::copyTo按以下步驟進行步驟1和2只是使圖像的副本。實際上,您使用它的方式相當於使用cv::Mat::clone,因爲您沒有指定掩碼。這樣在Python,使用numpy.copy方法的OpenCV使用NumPy的陣列作爲主數據類型:

# Step #3 
smooth = vertical.copy() 

對於步驟#5,則可立即複印基於掩模。我已經在我的前一篇文章中回答瞭如何做到這一點:Equivalent of copyTo in Python OpenCV bindings?。您正在查看第二種情況,即您正在複製的矩陣已被分配,並且只想複製掩碼中非零值。不過,爲了完整起見,我會把它放在這裏給你。

您基本上想要使用smooth修改vertical,但只複製由edges中的非零元素定義的元素smooth。您可以使用numpy.where查找非零的行和列位置,並使用它們複製smoothvertical之間的正確值。它也看起來像你有一個灰度圖像,所以這使得它更簡單:

# Step #5 
(rows, cols) = np.where(edges != 0) 
vertical[rows, cols] = smooth[rows, cols] 
+1

謝謝!這現在是有道理的。另外,你已經解釋過的第5步非常有幫助。在更大的上下文中,我試圖將C++代碼轉換爲python。我已經做到了,但我懷疑這是不正確的,因爲結果不一樣。我已經發布了一個單獨的問題,我真的很感謝你的意見http://stackoverflow.com/questions/42453892/converting-c-opencv-to-python – Anthony

+0

非常歡迎。我現在必須睡覺,但當我醒來時我會檢查你的問題。 – rayryeng