Постановка задачи заключается, по сути, в обнаружении формы, когда одна фигура находится внутри другой, а также в указании порядка иерархии, например, «треугольник внутри шестиугольника». Для этого я использую массив 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
Проблема с иерархиями при использовании функции cv.findContours в openCV ⇐ Python
Программы на Python
1762704242
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()
Подробнее здесь: [url]https://stackoverflow.com/questions/79814886/problem-regarding-hierarchies-when-using-cv-findcontours-function-in-opencv[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия