Найти - Пользователи
Полная версия: перенос кода в класс Python 3.6
Начало » Python для новичков » перенос кода в класс Python 3.6
1
RSAX
Есть код, помогите вынести в отдельный класс загрузку каскада Хаара, чтобы на 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))
bw
Может как-нибудь так.
Хотя это натягивание совы на глобус, не очень понятно, зачем тут ООП.

 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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB