Próbuję uruchomić na Pythonie używając dwóch funkcji openCV w tym samym czasie. Jedna funkcja ma pokazywać lokalne wideo, a druga powinna pokazywać klatki z mojej kamery internetowej. Podczas uruchamiania poniższego kodu oba okna zawieszają się i wygasają. Używam go na Ubuntu 16.04

import cv2
import numpy as np
from threading import Thread

def webcam_video(): 

  cap = cv2.VideoCapture(0)
  while(True):
    ret, frame = cap.read()
    if ret == True:
      cv2.imshow('frame',frame)
      if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    else :
        break
  cap.release()
  cv2.destroyAllWindows()

def local_video(): 
  path = "video-1.mp4"
  cap = cv2.VideoCapture(path)
  while(True):
    ret, frame = cap.read()
    if ret == True:
     cv2.imshow('frame_2',frame)
     if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    else :
        break     
  cap.release()
  cv2.destroyAllWindows()

t1= Thread(target = webcam_video)
t2= Thread(target = local_video)

t1.start() 
t2.start()
1
Mohamad Ballout 17 grudzień 2019, 01:45
1
Spójrz na Python OpenCV streaming z kamery — wielowątkowość, znaczniki czasu. Utwórz dwa obiekty i podaj odpowiednią ścieżkę
 – 
nathancy
17 grudzień 2019, 01:49
1
AFAIK, nie możesz robić cv2.waitKey() i imshow() w 2 różnych wątkach. Myślę, że musiałbyś mieć jeden wątek robiący wyświetlacz i czekający na klucze. Możesz, jak pokazuje nathanancy, zdobywać w wielu wątkach.
 – 
Mark Setchell
17 grudzień 2019, 02:02
@nathancy, Dzięki za odpowiedź, stworzyłem dwa obiekty i udało mi się uruchomić oba filmy razem. Chciałem jednak pokazać je w dwóch różnych oknach, ponieważ działają teraz w tym samym oknie. Wybacz, bo jestem całkiem początkujący w Pythonie i OpenCV
 – 
Mohamad Ballout
17 grudzień 2019, 12:17
Myślę, że możesz mieć 2 okna, ale nie możesz mieć 2 wywołań waitKey() z różnych wątków. Możesz bez problemu nagrywać wideo w 2 wątkach. Tyle, że musisz wyświetlić obrazy i wykonać waitKey() w głównym wątku... github.com/skvark/opencv-python/issues/134
 – 
Mark Setchell
17 grudzień 2019, 20:34
2
Możesz zdefiniować nową zmienną klasy, taką jak self.id = 'thread_1' i self.id = 'thread_2' (może przekazać id jako argument do obiektu), a następnie po wyświetleniu obrazu możesz zrobić cv2.imshow(self.id,frame1) lub cv2.imshow(self.id,frame2)
 – 
nathancy
18 grudzień 2019, 00:39

1 odpowiedź

Korzystanie z Multiprocessingu działa dla mnie!

import numpy as np
import cv2
from multiprocessing import Process

def webcam_video(): 

  cap = cv2.VideoCapture(0)
  while(True):
    ret, frame = cap.read()
    if ret == True:
      cv2.imshow('frame',frame)
      if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    else :
        break
  cap.release()
  cv2.destroyAllWindows()

def local_video(): 
  path = r"C:\Users\bernad.peter\Downloads\Singapore Port.mp4"
  cap = cv2.VideoCapture(path)
  while(True):
    ret, frame = cap.read()
    if ret == True:
     cv2.imshow('frame_2',frame)
     if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    else :
        break     
  cap.release()
  cv2.destroyAllWindows()


if __name__ == '__main__':
    p1= Process(target = local_video)
    p2= Process(target = webcam_video)
    p1.start() 
    p2.start()

    p1.join()
    p2.join()
1
Bernad Peter 27 październik 2020, 07:21