Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 边缘像差和1个缺角的正方形检测_Python_Image Processing_Opencv_Computer Vision - Fatal编程技术网

Python 边缘像差和1个缺角的正方形检测

Python 边缘像差和1个缺角的正方形检测,python,image-processing,opencv,computer-vision,Python,Image Processing,Opencv,Computer Vision,这是关于正方形检测的两个例子的后续,并提出了一些很酷的方法 我正在尝试设计一种鲁棒的方形检测算法,以帮助将收据的图片与图像的其余部分隔离开来。我的代码是基于前面问题中的凸包方法构建的,但是它被一个图像阻塞了,其中一个点不在图像中,并且由于左侧的笔杆,收据的边缘有畸变 我怎样才能发现这张收据上的角落 图为: 这是我的密码: import cv2 import numpy as np img = cv2.imread('taco.jpg') img = cv2.resize(img,(1944,

这是关于正方形检测的两个例子的后续,并提出了一些很酷的方法

我正在尝试设计一种鲁棒的方形检测算法,以帮助将收据的图片与图像的其余部分隔离开来。我的代码是基于前面问题中的凸包方法构建的,但是它被一个图像阻塞了,其中一个点不在图像中,并且由于左侧的笔杆,收据的边缘有畸变

我怎样才能发现这张收据上的角落

图为:

这是我的密码:

import cv2
import numpy as np

img = cv2.imread('taco.jpg')
img = cv2.resize(img,(1944,2592))
img = cv2.medianBlur(img,31)
img = cv2.GaussianBlur(img,(0,0),3)

grayscale = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
thresh = cv2.Canny(grayscale, 10, 20)
thresh = cv2.dilate(thresh,None)

contours,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    if cv2.contourArea(cnt)>250:  # remove small areas like noise etc
        hull = cv2.convexHull(cnt)    # find the convex hull of contour
        hull = cv2.approxPolyDP(hull,0.1*cv2.arcLength(hull,True),True)
        if len(hull)==4:
            cv2.drawContours(img,[hull],0,(0,255,0),2)

cv2.namedWindow('output',cv2.cv.CV_WINDOW_NORMAL)
cv2.imshow('output',img)
cv2.cv.ResizeWindow('output',960,640)
cv2.waitKey()
cv2.destroyAllWindows()

有什么想法吗?

Mathematica中的解决方案:

导入您的图像:

i = Import@"http://i.imgur.com/RrYKJ.jpg";
检测比例尺中比收据中的字母更细的边缘(一个参数)

删除小于收据周长比例的行(参数)

找到形态成分

(mc = MorphologicalComponents[Erosion[ColorNegate@i2, 1]]) // Colorize

查找具有更多边界邻接的变形组件(将其从遮罩中删除)

形成面具

com = Commonest[Join[mc[[1]], mc[[-1]], Transpose[mc][[1]], Transpose[mc][[-1]]]]
mc1 = Unitize[mc /. com[[1]] -> 0];

将遮罩与原始图像相乘

ImageMultiply[Image@mc1, i]

这看起来很棒,尽管我买不起mathematica许可证。然而,我不知道如何在python和opencv中模仿的唯一一步是第一步。你知道:i1=EdgeDetect[i,10]背后的算法吗?具体地说,我想知道边缘算法是如何在10的范围内检测的。也许我可以缩小我的图像比例,或者将其模糊到10级,以获得类似的边缘检测?Canny在这里应该可以很好地工作。Verde的配方中缺少的一个步骤是对象边界的建模——您可能希望将线有力地拟合到它们上,以便估计四个角并消除透视失真。@Franco从OP中提出的过去的问题就指向了这个方向。OP需要问这个问题,因为过去的答案是基于一个四边形的。我尽量保持对几何图形的不可知论。你真的不知道角的数量(在我的图像中为5)。一旦你绘制了门票边界,透视失真就很容易消除。@Verde,如果我的评论听起来像是对你的批评,我道歉。这并不是有意的——事实上,我赞赏你花时间找到并演示OP的端到端答案。但是,请注意,我们确实知道预期的拐角数-这里4是优先;-)(OP说他在找收据,而在我的地盘上,收据仍然是长方形的——这与纸卷上的打印机有关)。”课程纸弯曲、镜头变形等@FrancoCallari没关系,但请注意,如果不小心拍摄了照片,并且遗漏了收据的某些边框(这里部分发生了这种情况),矩形匹配算法将严重失败。
mc1 = Unitize[mc /. com[[1]] -> 0];
ImageMultiply[Image@mc1, i]