如何在Python中从模糊图像中找到扭曲矩形的精确角落位置?

2024-05-15 14:43:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个程序,以检测一个扭曲矩形的角落在Python与OpenCV精确。在

我试过用google搜索不同建议的解决方案,但是通过一条直线的正弦叠加(见阈值图像),我可能无法检测到角点。到目前为止,我尝试过寻找克隆和HoughLines,但没有得到好的结果。 不幸的是,我不明白徐斌在how to find blur corner position with opencv?中的C代码

这是我的初始图像:

enter image description here

在调整大小和阈值后,我应用canny边缘检测来获得以下图像:

contours, hierarchy = cv2.findContours(g_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
box = cv2.minAreaRect(contour)
box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)
box = np.array(box, dtype="float")
box = perspective.order_points(box)

我只得到了一些额外的结果:

我原以为直线拟合是解决这个问题的好方法,但不幸的是我不能让HoughLines工作,而且在查找了OpenCV Python - How to implement RANSAC to detect straight lines?RANSAC似乎也很难申请我的问题。在

我们非常感谢您的帮助。在


Tags: to图像程序boxgoogle阈值解决方案cv2
1条回答
网友
1楼 · 发布于 2024-05-15 14:43:55

要检测角点,可以使用^{}。函数有四个参数

corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance)
  • image-输入8位或浮点32位灰度单通道图像
  • maxCorners-要返回的最大角数
  • qualityLevel-角落的最低可接受质量水平在0-1之间。所有低于质量等级的角都将被拒收
  • minDistance-角点之间可能的最小欧几里德距离

现在我们知道了如何找到角点,我们必须找到旋转矩形并应用函数。以下是一种方法:


首先对图像进行放大、灰度化、双边滤波,然后通过Otsu阈值得到二值图像

接下来我们用cv2.findContours()找到扭曲的矩形,然后得到以绿色突出显示的旋转边界框。我们把这个边界框画到一个面具上

现在我们有了蒙版,我们只需使用cv2.goodFeaturesToTrack()来查找蒙版上的角点

这是原始输入图像的结果和每个角点的(x, y)坐标

转角点

^{pr2}$

代码

import cv2
import numpy as np
import imutils

# Resize image, blur, and Otsu's threshold
image = cv2.imread('1.png')
resize = imutils.resize(image, width=500)
mask = np.zeros(resize.shape, dtype=np.uint8)
gray = cv2.cvtColor(resize, cv2.COLOR_BGR2GRAY)
blur = cv2.bilateralFilter(gray,9,75,75)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Find distorted rectangle contour and draw onto a mask
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
rect = cv2.minAreaRect(cnts[0])
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(resize,[box],0,(36,255,12),2)
cv2.fillPoly(mask, [box], (255,255,255))

# Find corners on the mask
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(mask, maxCorners=4, qualityLevel=0.5, minDistance=150)

for corner in corners:
    x,y = corner.ravel()
    cv2.circle(resize,(x,y),8,(155,20,255),-1)
    print("({}, {})".format(x,y))

cv2.imshow('resize', resize)
cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.waitKey()

相关问题 更多 >