Проблема с иерархиями при использовании функции cv.findContours в openCVPython

Программы на Python
Ответить
Anonymous
 Проблема с иерархиями при использовании функции cv.findContours в openCV

Сообщение Anonymous »

Постановка задачи заключается, по сути, в обнаружении формы, когда одна фигура находится внутри другой, а также в указании порядка иерархии, например, «треугольник внутри шестиугольника». Для этого я использую массив numpy, который мне дает cv.findContours. Проблема, с которой я сталкиваюсь, заключается в том, что иерархические отношения совершенно неточны, они просто не работают, и я не могу понять, почему. Было бы здорово, если бы кто-нибудь мог сказать мне, есть ли проблема в фундаментальной логике моего кода или это просто проблема настройки. Я прикрепил свой код ниже.
import cv2 as cv
import numpy as np
capture = cv.VideoCapture(0)

while True:

isTrue, frame = capture.read()
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
blurred = cv.GaussianBlur(gray, (3, 3), cv.BORDER_DEFAULT)
canny = cv.Canny(blurred, 50, 150, apertureSize=3)

contours, hierarchy = cv.findContours(canny, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
cv.imshow('frame', canny)
cv.drawContours(frame,contours, -1, (255,0,0))
ldic = {}
for idx,contour in enumerate(contours):
if idx == 0:
continue
if cv.contourArea(contour) < 1200:
continue

epsilon = 0.01*cv.arcLength(contour, True)
approx = cv.approxPolyDP(contour, epsilon, True)
M = cv.moments(approx)

sides = len(approx)
if sides == 3:
label = "triangle"
elif sides == 4:
label = "square"
elif sides == 5:
label = "pentagon"
elif sides == 6:
label = "hexagon"
else:
continue

cont_dict = {
"id":idx,
"shape":label,
"hierarchy_shit":hierarchy[0][idx],
"cx":int(M['m10']/M['m00']),
"cy": int(M['m01'] / M['m00'])
"area": M['m00']
}

ldic[idx] = cont_dict

if M['m00'] != 0:
cx = int(M['m10']/M['m00'])
cy = int(M['m01'] / M['m00'])
cv.putText(frame, cont_dict["shape"], (cx, cy), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 3, cv.FILLED)

for key,val in ldic.items():
parent_idx = int(val["hierarchy_shit"][3])
if parent_idx != -1 and parent_idx in ldic and val["cx"]-ldic[val["hierarchy_shit"][3]]["cx"] >= 0 and val["cy"]-ldic[val["hierarchy_shit"][3]]["cy"] >= 0:
cv.putText(frame, f"{val["shape"]} inside {ldic[val["hierarchy_shit"][3]]["shape"]}",
(cx, cy), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 3, cv.FILLED)
print(f"{val["shape"]} inside {ldic[val["hierarchy_shit"][3]]["shape"]}")
cv.imshow('frame1', frame)

print(ldic)
if cv.waitKey(20) == ord('q'):
break
capture.release()
cv.destroyAllWindows()


Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-opencv
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»