Я пытаюсь извлечь синий объект, очень похожий на тот, который описан в https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html#object-tracking
Пример необработанного изображения с тремя синими фигурами для извлечения приведен здесь:
Захваченное изображение зашумлено, и обнаружение нефильтрованной формы возвращает от сотен до тысяч «синих» форм.Чтобы смягчить это, я применил следующие шаги:
- Размытие изображения перед его фильтрацией, в результате чего закрытые поверхности
- Преобразование маскированного изображения (после
bitwise_and
) обратно воттенки серого - Применение порога OTSU
- Наконец, определите контуры
Полный код:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
blur = cv2.GaussianBlur(frame, (15, 15), 0)
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
lower_red = np.array([115, 50, 50])
upper_red = np.array([125, 255, 255])
mask = cv2.inRange(hsv, lower_red, upper_red)
blue = cv2.bitwise_and(blur, blur, mask=mask)
gray = cv2.cvtColor(blue, cv2.COLOR_BGR2GRAY)
(T, ted) = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
im2, contours, hierarchy = cv2.findContours(
ted, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
cv2.drawContours(frame, [cnt], 0, (0, 255, 0), 3)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, str(len(contours)), (10, 500), font, 2, (0, 0, 255), 2, cv2.LINE_AA)
cv2.imshow('mask', mask)
cv2.imshow('blue', blue)
cv2.imshow('grey', gray)
cv2.imshow('thresholded', ted)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
К сожалению, до сих порОсталось 6-7 контуров, тогда как их должно быть три.
Как я могу еще больше улучшить обработку изображений, чтобы получить только три фигуры?