'How to find corner (x, y) coordinate points on image Python OpenCV?
This is a truck container image but from the top view. First, I need to find the rectangle and know each corner position. The goal is to know the dimension of the container.
Solution 1:[1]
Here's a simple approach:
Obtain binary image. Load image, convert to grayscale, Gaussian blur, then Otsu's threshold.
Find distorted bounding rectangle contour and corners. We find contours then filter using contour area to isolate the rectangular contour. Next we find the distorted bounding rectangle with
cv2.minAreaRect()
and the corners withcv2.boxPoints()
Detected bounding rectangle ->
Mask ->
Detected corners
Corner points
(188, 351)
(47, 348)
(194, 32)
(53, 29)
Code
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()
Solution 2:[2]
minAreaRect
applied to the contour is your best friend. There is no need for a corner detector.
https://docs.opencv.org/3.4/d3/dc0/group__imgproc__shape.html#ga3d476a3417130ae5154aea421ca7ead9
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Yves Daoust |