Форум сайта python.su
0
Есть код, помогите вынести в отдельный класс загрузку каскада Хаара, чтобы на 1 видео можно было использовать 2-3-4+ каскада одновременно
В инит класса хочу передать первый кадр и путь до каскада (“cascade = …”), дальше там создать массив пустой rects = и вернуть его в “objects = ct.update(rects)”
Подскажите как это всё сделать, заранее спасибо!
# coding=utf-8 import cv2 from pyimagesearch.centroidtracker import CentroidTracker cascade = cv2.CascadeClassifier('cascade/16stage_3hours.xml') video_stream = cv2.VideoCapture("videos/4.mp4") ct = CentroidTracker(maxDisappeared=7, maxDistance=45) while 1: ret, img = video_stream.read() # Чтение первого кадра gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Изменение цвета пространства c BGR на Grey array_coordinate = cascade.detectMultiScale(gray, 1.3, 5) rects = [] # Массив координат прямоугольников объекта for (x, y, w, h) in array_coordinate: # Выделяем найденый объект рамкой cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) rects.append((x, y, x + w, y + h)) # Обновляем массив координат прямоугольников и записываем в переменную objects = ct.update(rects) # <...Код сокращён для примера...> cv2.imshow("counter", img) # Вывод изображения k = cv2.waitKey(30) & 0xff # При нажатии "Esc" закрытие программы if k == 27: break cv2.destroyAllWindows()
import cv2 class MultiCascade: def __init__(self, direction, frame): self.direction = direction self.frame = frame gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) array_coordinate = self.direction.detectMultiScale(gray, 1.3, 5) rects = [] for (x, y, w, h) in array_coordinate: cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) rects.append((x, y, x + w, y + h))
Офлайн
20
Может как-нибудь так.
Хотя это натягивание совы на глобус, не очень понятно, зачем тут ООП.
import cv2 from pyimagesearch.centroidtracker import CentroidTracker class Cascade: array_coordinate = None def __init__(self, path): self.classifier = cv2.CascadeClassifier(path) def load(self, frame): self.array_coordinate = self.classifier.detectMultiScale(frame, 1.3, 5) def process(self, ct, img): rects = [] # Массив координат прямоугольников объекта for (x, y, w, h) in self.array_coordinate: # Выделяем найденый объект рамкой cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) rects.append((x, y, x + w, y + h)) # Обновляем массив координат прямоугольников и записываем в переменную objects = ct.update(rects) # <...Код сокращён для примера...> def main(): ct = CentroidTracker(maxDisappeared=7, maxDistance=45) cascades = [ Cascade('cascade/16stage_3hours.xml'), Cascade('cascade/...'), Cascade('cascade/...'), ] video_stream = cv2.VideoCapture("videos/4.mp4") while True: ret, img = video_stream.read() # Чтение первого кадра gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Изменение цвета пространства c BGR на Grey for cascade in cascades: cascade.load(gray) cascade.process(ct, img) cv2.imshow("counter", img) # Вывод изображения k = cv2.waitKey(30) & 0xff # При нажатии "Esc" закрытие программы if k == 27: break try: main() finally: cv2.destroyAllWindows()
Офлайн