質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

653閲覧

PyQtでwebカメラを使って動画を録画し,保存するアプリでエラーが発生してしまいます

abea

総合スコア32

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/02/11 11:57

下のpyqt5で書かれたwebカメラから映像を取得し保存するアプリで,最初にendボタンを押すと
'NoneType' object has no attribute 'deleteLater'
とエラーが出てしまいます.これを解決する方法を教えてくださるとありがたいです.

python3

1import sys 2from PyQt5 import QtCore, QtGui, QtWidgets 3import cv2 4import os, zipfile, datetime 5now = datetime.datetime.now() 6dirname = 'test_{0:%Y%m%d}'.format(now) 7 8class QtCapture(QtWidgets.QWidget): 9 def __init__(self, *args): 10 super(QtWidgets.QWidget, self).__init__() 11 12 self.fps = 24 13 self.cap = cv2.VideoCapture(*args) 14 15 self.video_frame = QtWidgets.QLabel() 16 lay = QtWidgets.QVBoxLayout() 17 lay.setContentsMargins(0,0,0,0) 18 lay.addWidget(self.video_frame) 19 self.setLayout(lay) 20 21 # ------ Modification ------ # 22 self.isCapturing = False 23 self.ith_frame = 1 24 # ------ Modification ------ # 25 26 def setFPS(self, fps): 27 self.fps = fps 28 29 def nextFrameSlot(self): 30 ret, frame = self.cap.read() 31 32 # ------ Modification ------ # 33 # Save images if isCapturing 34 if self.isCapturing: 35 if not(os.path.isdir(dirname)): 36 os.mkdir(dirname) 37 cv2.imwrite('./'+dirname+'/img_%05d.jpg'%self.ith_frame, frame) 38 self.ith_frame += 1 39 # ------ Modification ------ # 40 41 # My webcam yields frames in BGR format 42 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 43 img = QtGui.QImage(frame, frame.shape[1], frame.shape[0], QtGui.QImage.Format_RGB888) 44 pix = QtGui.QPixmap.fromImage(img) 45 self.video_frame.setPixmap(pix) 46 47 def start(self): 48 self.timer = QtCore.QTimer() 49 self.timer.timeout.connect(self.nextFrameSlot) 50 self.timer.start(1000./self.fps) 51 52 def stop(self): 53 self.timer.stop() 54 55 # ------ Modification ------ # 56 def capture(self): 57 if not self.isCapturing: 58 self.isCapturing = True 59 else: 60 self.isCapturing = False 61 # ------ Modification ------ # 62 63 def deleteLater(self): 64 self.cap.release() 65 super(QtWidgets.QWidget, self).deleteLater() 66 67 68class ControlWindow(QtWidgets.QWidget): 69 def __init__(self): 70 QtWidgets.QWidget.__init__(self) 71 self.capture = None 72 73 self.start_button = QtWidgets.QPushButton('Start') 74 self.start_button.clicked.connect(self.startCapture) 75 self.quit_button = QtWidgets.QPushButton('End') 76 self.quit_button.clicked.connect(self.endCapture) 77 self.end_button = QtWidgets.QPushButton('Stop') 78 79 # ------ Modification ------ # 80 self.capture_button = QtWidgets.QPushButton('Capture') 81 self.capture_button.clicked.connect(self.saveCapture) 82 # ------ Modification ------ # 83 84 vbox = QtWidgets.QVBoxLayout(self) 85 vbox.addWidget(self.start_button) 86 vbox.addWidget(self.end_button) 87 vbox.addWidget(self.quit_button) 88 89 # ------ Modification ------ # 90 vbox.addWidget(self.capture_button) 91 # ------ Modification ------ # 92 93 self.setLayout(vbox) 94 self.setWindowTitle('Control Panel') 95 self.setGeometry(100,100,200,200) 96 self.show() 97 98 def startCapture(self): 99 if not self.capture: 100 self.capture = QtCapture(0) 101 self.end_button.clicked.connect(self.capture.stop) 102 # self.capture.setFPS(1) 103 self.capture.setParent(self) 104 self.capture.setWindowFlags(QtCore.Qt.Tool) 105 self.capture.start() 106 self.capture.show() 107 108 def endCapture(self): 109 self.capture.deleteLater() 110 self.capture = None 111 112 # ------ Modification ------ # 113 def saveCapture(self): 114 if self.capture: 115 self.capture.capture() 116 # ------ Modification ------ # 117 118 119 120if __name__ == '__main__': 121 122 import sys 123 app = QtWidgets.QApplication(sys.argv) 124 window = ControlWindow() 125 sys.exit(app.exec_()) 126

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

quit_buttonのclickedシグナルに紐づいているのはendCaptureですので、
endCaptureが呼び出された時点で、captureがNoneであることが問題ということです。

captureに具体的な値が与えられるのはstartCapture内ですね。
これを呼び出す前にメソッドを参照しようとすると当然エラーが生じます。

キャプチャしていない状態のcaptureをNoneとする現行の設計を保持するならば、
endCapture内の処理を、captureがNoneであるかどうかで分岐させれば良いです。

投稿2018/02/11 12:10

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問