Нахождение прямоугольного angular объекта из хитрого изображения - PullRequest
2 голосов
/ 13 марта 2020

Canny Edge Detection

Это изображение грузового контейнера, но вид сверху. Сначала мне нужно найти прямоугольник angular и узнать каждую угловую позицию. Цель состоит в том, чтобы узнать размер контейнера.

1 Ответ

2 голосов
/ 14 марта 2020

Вот простой подход:

  1. Получение двоичного изображения. Загрузка изображения, преобразование в оттенки серого, Размытие по Гауссу , затем Порог Оцу .

  2. Найти искаженный контур ограничивающего прямоугольника. Мы найдем контуры , затем отфильтруем, используя contour area, чтобы выделить прямоугольник angular контур. Затем мы находим искаженный ограничивающий прямоугольник с помощью cv2.minAreaRect и рисуем его на пустой маске.

  3. Находим углы. Мы используем Ши -Tomasi Corner Detector уже реализован как cv2.goodFeaturesToTrack для обнаружения углов. Посмотрите на this для объяснения каждого параметра.


Обнаруженный ограничивающий прямоугольник -> Маска -> Обнаруженные углы

image image image

Угловые точки

(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_TREE, 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)
        box = cv2.boxPoints(rect)
        box = np.int0(box)
        cv2.fillPoly(mask, [box], (255,255,255))

# Find corners
corners = cv2.goodFeaturesToTrack(mask,4,.8,100)
offset = 15
for corner in corners:
    x,y = corner.ravel()
    cv2.circle(image,(x,y),5,(36,255,12),-1)
    x, y = int(x), int(y)
    cv2.rectangle(image, (x - offset, y - offset), (x + offset, y + offset), (36,255,12), 3)
    print("({}, {})".format(x,y))

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.imshow('mask', mask)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...