Как получить определенный кадр каждые n секунд во время потоковой передачи?

#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()