2017-01-27 257 views
1

我是OpenCV与Android的新手。我目前正在研究文档检测演示应用程序。我所做的,只要下面是:OpenCV - canny边缘检测不能正常工作

原图 - >灰度图像 - >高斯模糊 - >Canny边缘检测 - >寻找轮廓 - >画轮廓

我可以完美地检测出纸张,如下图所示。

enter image description here

但它不能检测某些文件。下面是他们

enter image description here

之一,我研究了很多关于这一点,发现问题出在Canny边缘检测和下面是精明的形象:

enter image description here

正如你所看到的,边缘检测并不完美,并且在某个点不连接边缘。这就是原因。

我已经通过类似的问题在:How to select the best set of parameters in Canny Edge detection algorithm implemented in OpenCV? 我已经按照解决方案,但它没有为我工作。

我的精明的检测代码如下:

double otsu_thresold = Imgproc.threshold(mGray,edged,0,255, Imgproc.THRESH_OTSU); 
Imgproc.Canny(mRgba, edged, otsu_thresold*0.5,otsu_thresold); 

我不知道我错了!我应该怎么做才能完美检测文档?

+1

为了增强边缘使用**形态学扩张**。请参阅[本页](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html#morphological-ops)。 –

回答

3

首先要执行的方法Canny边缘检测必须改变。您在cv2.Canny()手动设置较低和较高的阈值。你可以自动做到这一点。我用THIS LINK作为参考。

使用下面的代码片段:

v = np.median(gray_image) 

#---- apply automatic Canny edge detection using the computed median---- 
lower = int(max(0, (1.0 - sigma) * v)) 
upper = int(min(255, (1.0 + sigma) * v)) 
edged = cv2.Canny(gray_image, lower, upper) 
cv2.imshow('Edges',edged) 

那我在这里做什么?

我正在采取中位数值的灰度图像。选择值为0.33的sigma以设置lowerupper阈值。 0.33统计学家通常将数值用于数据科学。所以这也被认为是在这里。

这是我得到:

enter image description here

现在只是执行通常cv2.findContours()

enter image description here

要使用cv2.MORPH_CROSS内核增强我进行形态膨胀这个边缘信息操作并画出最大轮廓。

:)

+0

我正在使用otsu的方法来动态地查找阈值。我也应用了你的解决方案,但它没有奏效,而且也减慢了相机的帧速度。 – ImLearning

+0

你的意思是发现边缘很慢? –

+0

不,我的意思是由于阈值计算,相机预览帧变慢 – ImLearning