(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]