Python – OpenCV – есть ли способ «заполнить» ожидаемый контур?Python

Программы на Python
Anonymous
Python – OpenCV – есть ли способ «заполнить» ожидаемый контур?

Сообщение Anonymous »

Я хочу определить контур мяча, и объект всегда будет мячом, но у меня есть объект в середине, который может загораживать часть мяча, вот моя текущая ситуация:
(https:/ /i.sstatic.net/gwxnsVTI.png)
Я сделал так, чтобы он отлично работал в том случае, когда с обеих сторон находится достаточное количество мяча, но когда он уменьшает его не так хорошо:
(https://i.sstatic.net/gYiZ9bCI.png)
Я знаю, что могу изменить параметры своего кода, просто объединяя обе части когда они имеют достаточно хороший размер, но из-за шума это становится очень ситуативным, поэтому я не могу настолько уменьшить параметры:

Код: Выделить всё

import cv2
import numpy as np
from pyfirmata2 import Arduino, SERVO
import time
import serial

# Camera Connection/Setup
cap = cv2.VideoCapture(0)

while True:
_, frame = cap.read()
hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

#Blue color
low_blue = np.array([100, 100, 20])
high_blue = np.array([200, 255, 255])
blue_mask = cv2.inRange(hsv_frame, low_blue, high_blue)
#blue_mask = cv2.GaussianBlur(blue_mask,(5,5),0)
contours, hierarchy = cv2.findContours(blue_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=lambda x:cv2.contourArea(x), reverse=True)

sum = 0
emptymask = []
for cnt in contours:
if cv2.contourArea(cnt) > 300: #If the parts are big enough it assumes its a part of the ball
sum += cv2.contourArea(cnt)
emptymask.append(cnt)

#print(sum)
emptymask = cv2.vconcat(emptymask)

(x, y, w, h) = cv2.boundingRect(emptymask)

cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow("Frame", frame)
cv2.imshow("Mask", blue_mask)

key = cv2.waitKey(1)
if key == 27:
break

cap.release()
cv2.destroyAllWindows()

Итак, я подумал, смогу ли я определить размер мяча или что-то в этом роде, поскольку это всегда один и тот же мяч.
Я сделал что-то подобное в другой код, в котором, если размер не соответствует ожидаемому, он «угадывает» весь шар и создает квадрат, но становится невероятно сложно откалибровать точные положения x и y:

Код: Выделить всё

if reference > 6000: #See if the object is cropped or not
cv2.rectangle(frame, (x, y), (x + w, y + w), (0, 255, 0), 2)
elif ((x>180 and x170 and y

Подробнее здесь: [url]https://stackoverflow.com/questions/78659300/python-opencv-is-there-a-way-to-fill-an-expected-contour[/url]

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