У меня проблемы с контуром захвата живого видео.Я использую библиотеку OpenCV на Python
Моя цель состоит в том, чтобы измерить рыб тилапии, проходящих через трубу одну за другой, и получить ихприблизительные размеры, получая размеры прямоугольника. Здесь - образец прохождения 1 тилапии.
Здесь - еще один с подсветкой
Проблема означает, что вода также определяется как контур, и я не могу изолировать рыбу.Я пытался использовать сочетание методов размытия, расширения, эрозии, но, похоже, это не решило мою проблему.
Есть ли другие алгоритмы, которые я могу использовать?Или я должен переключиться на Обнаружение объекта?
Вот мой код:
#!/usr/bin/env python3
import numpy as np
import cv2
import time
kernel = np.ones((5,5),np.uint8)
cap = cv2.VideoCapture('white.mp4')
foreground_background = cv2.createBackgroundSubtractorMOG2()
while True:
ret, frame = cap.read()
if(type(frame) == type(None)):
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#gray = cv2.GaussianBlur(gray, (21, 21), 0)
#gray = cv2.medianBlur(gray,11)
gray = cv2.bilateralFilter(gray,9,75,75)
ret,thresh = cv2.threshold(gray, 127, 255 , cv2.THRESH_BINARY_INV)
thresh = cv2.erode(thresh, kernel, iterations=3)
thresh = cv2.dilate(thresh, kernel, iterations=3)
im2, cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
c=None
for c in cnts:
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)
cv2.imshow('Output', thresh)
cv2.waitKey(2)
cap.release()
cv2.destroyAllWindows()
Следующее добавлено Марком Сетчеллом ...если кто-то хочет увидеть отдельные кадры, я извлекаю со скоростью 10 кадров в секунду и монтирую кадры следующим образом:
![enter image description here](https://i.stack.imgur.com/kRXbW.png)
Используемые команды:
ffmpeg -i a.mov -r 10 frame_%05d.png
montage -tile 6x frame_*png -geometry +10+10 result.png