Определить прямоугольники в OpenCV (4.2.0), используя Python (3.7), - PullRequest
0 голосов
/ 12 апреля 2020

Я работаю над личным проектом, в котором я определяю прямоугольники (все одинаковые размеры), а затем размещаю эти прямоугольники внутри списка в том же порядке (сверху вниз), а затем обрабатываю информацию внутри каждого прямоугольника с помощью некоторой функции. Ниже мое тестовое изображение.

Test Image

Мне удалось обнаружить интересующий прямоугольник, однако я продолжаю получать другие прямоугольники, которые мне не нужны. Как видите, я хочу, чтобы только три прямоугольника с информацией (6,9,3) были в списке.

My output when I run my code

Мой код

import cv2

width=700
height=700
y1=0
y2=700
x1=500
x2=700
img=cv2.imread('test.jpg') #read image
img=cv2.resize(img,(width,height)) #resize image
roi = img[y1:y2, x1:x2] #region of interest i.e where the rectangles will be
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) #convert roi into gray
Blur=cv2.GaussianBlur(gray,(5,5),1) #apply blur to roi
Canny=cv2.Canny(Blur,10,50) #apply canny to roi

#Find my contours
contours =cv2.findContours(Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]

#Loop through my contours to find rectangles and put them in a list, so i can view them individually later.
cntrRect = []
for i in contours:
        epsilon = 0.05*cv2.arcLength(i,True)
        approx = cv2.approxPolyDP(i,epsilon,True)
        if len(approx) == 4:
            cv2.drawContours(roi,cntrRect,-1,(0,255,0),2)
            cv2.imshow('Roi Rect ONLY',roi)
            cntrRect.append(approx)



cv2.waitKey(0)
cv2.destroyAllWindows()

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Я бы посоветовал вам получить ограничивающие прямоугольники контуров, а затем отсортировать прямоугольники по убыванию площади. Обрежьте первый прямоугольник по умолчанию, затем l oop через оставшиеся прямоугольники и обрежьте их, если они, скажем,> = 90% площади первого прямоугольника. Это гарантирует, что у вас есть большие прямоугольники, а меньшие игнорируются.

0 голосов
/ 12 апреля 2020

В Contour есть функция под названием cv2.contourArea, для которой размеры вашего контура вводятся следующим образом cv2.contourArea(contours). Вы можете использовать условие,

if cv2.contourArea(contours)>#Rectangle area

С помощью этого ваша проблема будет решена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...