Есть ли способ получить 4 координатных точки ограничивающего прямоугольника двух отдельных контуров в opencv python? - PullRequest
3 голосов
/ 13 мая 2019

У меня есть такая картинка ниже: Original Picture

Теперь я хочу получить четыре координатные точки для деформации перспективы, как показано ниже: Desired Picture

Здесь у меня есть два вопроса: 1. Как я могу получить 4 координаты для деформации перспективы?2. Как можно точно указать это местоположение на всем изображении, как если бы мы использовали контуры, много линий / прямоугольников и т. Д.

1 Ответ

1 голос
/ 14 мая 2019

первые найденные контуры, что слой иерархии> 2, и вы можете получить контуры, как показано ниже: enter image description here секунду, эти отдельные контуры имеют специальное отношение периметр / площадь, поэтому найденные контуры имеют площадь между 3000 ~ 4000и периметр между 800 ~ 1000: enter image description here наконец, найден минимум максимум двух контуров, и вы можете получить прямоугольник результата: enter image description here вот мой пример кода:

import cv2
import numpy as np
def found_by_hierarchy(contours, hierarchy,H):
    list = []
    for i in range(len(contours)):
       k = i
       c = 0
       while hierarchy[k][3] != -1:
           k = hierarchy[k][3]
           c = c + 1
       if c > H:
           list.append(i)
    return list
def minmax(list,min_x,max_x,min_y,max_y):
    for i in list:
        min_x=i[0][0] if i[0][0] < min_x else min_x
        max_x=i[0][0] if i[0][0] > max_x else max_x
        min_y=i[0][1] if i[0][1] < min_y else min_y
        max_y=i[0][1] if i[0][1] > max_y else max_y
    return min_x,max_x,min_y,max_y
img = cv2.imread("123.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gb = cv2.GaussianBlur(img_gray, (5, 5), 0)
edges = cv2.Canny(img_gb, 50 , 200)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

min_x,max_x,min_y,max_y = 99999,-1,99999,-1
for i in found_by_hierarchy(contours, hierarchy[0], 0):
    area = cv2.contourArea(contours[i])
    perimeter = cv2.arcLength(contours[i], True)
    if int(area) in range(3000,4000) and int(perimeter) in range(800,1000):
        min_x,max_x,min_y,max_y=minmax(contours[i],min_x,max_x,min_y,max_y)
cv2.rectangle(img, (min_x,min_y), (max_x,max_y), (0, 0, 255), 2)
draw_img = cv2.resize(img, (1500, 1500))   
cv2.imshow("draw_img", draw_img)
cv2.waitKey (0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...