我是 Android 版 OpenCV 的新手。我目前正在开发文档检测演示应用程序。到目前为止我所做的如下:
原图 -> 灰度图 -> GaussianBlur -> Canny边缘检测 -> 寻找轮廓 -> 绘制轮廓
我能够完美地检测到纸张,如下图所示。
但是它没有检测到一些文件。下面是其中之一
我对此进行了很多研究,发现问题出在精明的边缘检测上,下面是精明的图像:
如您所见,边缘检测并没有完美连接,并且在某些点上没有连接边缘。这就是原因所在。
我在 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);
我不知道我哪里错了!我应该怎么做才能完美检测文档?
最佳答案
首先,执行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
值来设置 lower
和 upper
阈值。 0.33
值通常被统计学家用于数据科学。所以这里也考虑了。
这是我得到的:
为了增强此边缘信息,我使用 cv2.MORPH_CROSS
内核执行了形态膨胀:
现在只需执行通常的 cv2.findContours()
操作并绘制最大轮廓。
:)
关于java - OpenCV - Canny 边缘检测无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41893029/