如何在Python OpenCV中找到图像角落的(x, y)坐标点?

6

Canny边缘检测

这是一张卡车集装箱的图像,但是从俯视角度来看。首先,我需要找到矩形并知道每个角落的位置。目标是了解集装箱的尺寸。


1
你到目前为止尝试了什么? - Yunus Temurlenk
我试图通过应用ROI来删除不必要的区域,以便只剩下一个正方形图像,但我需要知道角落的位置。 - maping-id
哪个矩形,外部矩形还是内部矩形?请发布您的代码以展示您尝试过什么。 - Rotem
请发布您进行Canny边缘检测的原始图像。也许另一种方法会更好。 - fmw42
2个回答

7
下面是一个简单的方法:
  1. 获取二进制图像。 载入图像,转换为灰度图像高斯模糊,接着进行大津阈值处理

  2. 查找畸变边界框轮廓和角点。 我们使用查找轮廓,然后使用轮廓面积进行过滤以隔离矩形轮廓。接下来,我们使用cv2.minAreaRect()查找扭曲的边界框和角点,使用cv2.boxPoints()


检测到的边界矩形 -> 蒙版 -> 检测到的角落

角点

(188, 351)
(47, 348)
(194, 32)
(53, 29)

代码

import cv2
import numpy as np

# Load image, grayscale, blur, Otsu's threshold
image = cv2.imread('1.png')
mask = np.zeros(image.shape[:2], dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Find distorted bounding rect
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area > 5000:
        # Find distorted bounding rect
        rect = cv2.minAreaRect(c)
        corners = cv2.boxPoints(rect)
        corners = np.int0(corners)
        cv2.fillPoly(mask, [corners], (255,255,255))
        
        # Draw corner points
        corners = corners.tolist()
        print(corners)
        for corner in corners:
            x, y = corner
            cv2.circle(image, (x, y), 5, (36,255,12), -1)

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

为什么要使用一个始终很难调整的角点检测器呢,当你已经知道角点在哪里? - user1196549
你事先不知道角落坐标,因此使用 cv2.goodFeaturesToTrack 来获取角落坐标。 - nathancy
1
来吧,minAreaRect - user1196549
@YvesDaoust 已更改!感谢您发现了那个不必要的步骤。 - nathancy

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接