#python #opencv #video-streaming #classification #frame
Вопрос:
Я новичок в области обработки изображений, и на самом деле у меня возникли проблемы с небольшим кодом, связанным с классификацией. Во время потоковой передачи я просто хочу получать определенный кадр каждые 3 секунды, а затем я использую этот кадр с алгоритмом классификации. Вот мое текущее кодирование с потоком: (в нем всего кадров, и я не хочу брать их все)
class ThreadCapture(): def __init__(self, knn): self.frame = [] self.status = False self.isStop = False self.knn = knn self.cap = cv2.VideoCapture(0) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) def start(self): threading.Thread(target=self.current_frame, daemon=True, args=()).start() def stop(self): self.isStop = True def get_frame(self): return self.status, self.frame def current_frame(self): while(not self.isStop): self.status, self.frame = self.cap.read() self.crop_frame() self.cap.release() def run_knn(self): img_resize = cv2.resize(self.frame, (224, 224)) img = cv2.cvtColor(img_resize, cv2.COLOR_BGR2RGB) img_pil = Image.fromarray(img) return self.knn.classify(img_pil) def main(arg): ..... stream = ThreadCapture(EagleEyes) stream.start() time.sleep(1) while(True): status, frame = stream.get_frame() if status: info, res = stream.run_knn() print(info) cv2.putText(frame, info, (10,40), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 1, cv2.LINE_AA) cv2.imshow('abc', frame) if cv2.waitKey(1)==ord('q'): break stream.stop() cv2.destroyAllWindows()
Я плохо разбираюсь в кодировании, поэтому я хотел бы знать, может ли кто-нибудь поддержать меня в улучшении вышеуказанных кодировок. Спасибо вам всем.
Комментарии:
1. цикл в main() будет вращаться как сумасшедший, пока статус ложен, и он никогда не вырвется из этого.
2. @ChristophRackwitz Не могли бы вы дать мне идею для получения кадра или настройки интервалов? На самом деле, мне просто нужно нажать «q», чтобы выйти из программы.
Ответ №1:
Самый простой способ может заключаться в том, чтобы продолжить в том же духе, что и выше, но предпринимать какие-либо действия с кадрами только через определенный промежуток времени.
Например, если вы хотите что-то делать с кадром каждые 10 секунд, а частота кадров видео составляет 25 кадров в секунду, вы можете считать до тех пор, пока не достигнете 250 кадров, а затем выполнить свою работу с этим кадром.
..... stream = ThreadCapture(EagleEyes) stream.start() time.sleep(1) frameCounter = 0 while(True): status, frame = stream.get_frame() //Increment the frame counter frameCounter = 1 if frameCounter == 250 //Do whatever work you want on the frame here //Reset the counter frameCounter = 0 // Add some condition to break out of the loop, // e.g. end of file or status check. cap.release() cv2.destroyAllWindows()