2017-02-25 149 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