2017-11-10 7 views
0

私のBachelor-Workの主な部分は、複数のカメラ/デバイスの記録を一度に作成することです。私はこの理由からOpenCVを使い始めました。とても単純な例がうまくいきます。しかし、何らかの理由でスレッディングと複数のカメラを実装しようとしたとき、ファイルを保存しませんでした。エラーメッセージが表示されません。ファイルは表示されません。私は動作するスクリプト(すべてのオンラインチュートリアルで見ることができる基本的に同じ)と動作しないコードの関連部分の両方を投稿します。なぜそれがうまくいかないかについてのあなたのアイデアがあれば教えてください。何らかの理由でOpenCV-Pythonがスレッド設定で録画していない

の作業コード:

cap = cv2.VideoCapture(0) 

fourcc = cv2.VideoWriter_fourcc(*'XVID') #Codec 
out = cv2.VideoWriter('output.avi', fourcc, 24.0, (640,480)) 

while(cap.isOpened()): 
    ret, frame = cap.read() 
    out.write(frame) 

    if(cv2.waitKey(1) & 0xFF == ord('q')): #No idea what this does... 
     break 

cap.release() 
out.release() 
cv2.destroyAllWindows() 

問題のコード:

class PreviewBox(): 

def __init__(self, capture): 
    self.selected = False 
    self.label = QLabel() 
    self.label.mousePressEvent = self.toggleSelected 
    self.cap = capture 
    self.resizeFactor = 0.5 
    self.interactable = True 
    self.name = "defaultCam" 
    return super().__init__() 

def toggleSelected(self, event): 
    if self.interactable == True: 
     self.selected = not self.selected 
     if self.selected == True : 
      self.resizeFactor = 0.25 
     else: 
      self.resizeFactor = 0.5 
#============================================================ 
class RecordingWindow(QWidget): 

previews = [] 
previewThread = None 
recordingThread = None 

def __init__(self, mainWindow): 
    super().__init__() 
    self.ui = Ui_recordingTutorialWidget() 
    self.mainWindow = mainWindow 
    self.initUI() 
    self.show() 

def initUI(self): 

    self.ui.setupUi(self) 
    self.ui.gridLayout.setAlignment(Qt.AlignTop) 
    self.ui.startRecordingButton.clicked.connect(self.startRecording) 
    self.ui.stopRecordingButton.clicked.connect(self.stopRecording) 

def refreshPreviews(self): 

    if self.previewThread is not None: 
     self.previewThread.kill() 

    for previewB in self.previews: 
     previewB.interactable = False 
     previewB.resizeFactor = 0.5 
     self.ui.previewGrid.addWidget(previewB.label) 

    self.previewThread = PreviewThread(self.previews) 
    self.previewThread.daemon = True 
    self.previewThread.start() 

def startRecording(self): 
    self.recordingThread = RecordingThread(self.previews) 
    self.recordingThread.daemon = True 
    self.recordingThread.start() 

def stopRecording(self): 
    self.recordingThread.kill() 
#------------------------------------------------------------ 
class RecordingThread(threading.Thread): 

outputs = [] 
doRun = True 

def __init__(self, previews): 
    super().__init__() 
    for cam in previews: 
     fourcc = cv2.VideoWriter_fourcc(*'DIVX') #Codec 
     self.outputs.append((cam.cap, cv2.VideoWriter(cam.name, fourcc, 24.0, (int(cam.cap.get(3)),int(cam.cap.get(4)))))) #Output format and name 

def run(self): 
    while(self.doRun): 
     for cap, output in self.outputs: 
      if(cap.isOpened()): 
       ret, frame = cap.read() #Capture frame (ret is a boolean if frame is read succesfully) 
       output.write(frame) 
       print(ret) 

    for cap, output in self.outputs: 
     output.release() 
    cv2.destroyAllWindows() 

def kill(self): 
    self.doRun = False 

(私はそれが原因で貼り付ける、それは実際のエディタで正しいことだ、インデンデーションがここに間違っている知っている私はちょうどよ。怠け者..:D)

答えて

0

さて、私はばかげて驚きました。私はデフォルトの名前にファイル拡張子を追加するのを忘れていたので、何も保存していなかったからです。ビデオフィールドライターが作成された行を次のように変更します。

self.outputs.append((cam.cap, cv2.VideoWriter(cam.name+".avi", fourcc, 24.0, (int(cam.cap.get(3)),int(cam.cap.get(4)))))) 
関連する問題