私の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)