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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

3196閲覧

ラズベリーパイ4にてPyQt用いて作成したGUIで表示させているカメラモジュール画像の更新間隔が徐々に遅くなる対処法について

Crew_38

総合スコア5

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2021/03/31 14:22

編集2021/03/31 19:49

前提・実現したいこと

Qt Designerで作成したGUIのGraphicsView内にpushButton押下後、
ラズベリーパイに接続しているカメラモジュールの画像をリアルタイムで表示させたい

pushButton押下前
イメージ説明

pushButton押下後
イメージ説明

発生している問題・エラーメッセージ

pushButtonを押下直後はカメラモジュールからの画像をスムーズに更新するが
徐々に画像の更新間隔が秒単位で長くなる
暫く放置した結果以下のエラー表示されました。

QImage: out of memory, returning null image Traceback (most recent call last): File "/home/pi/20210331/Main.py", line 41, in set cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) cv2.error: OpenCV(4.5.1) /tmp/pip-wheel-qd18ncao/opencv-python/opencv/modules/core/src/alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 921600 bytes in function 'OutOfMemoryError' pi@raspberrypi:~/20210331 $

該当のソースコード

Qt Designerで作成し、Python用に変換したGUI

python

1# -*- coding: utf-8 -*- 2 3# Form implementation generated from reading ui file '.\GUI.ui' 4# 5# Created by: PyQt5 UI code generator 5.14.2 6# 7# WARNING! All changes made in this file will be lost! 8 9 10from PyQt5 import QtCore, QtGui, QtWidgets 11 12 13class Ui_Form(object): 14 def setupUi(self, Form): 15 Form.setObjectName("Form") 16 Form.resize(850, 500) 17 self.graphicsView = QtWidgets.QGraphicsView(Form) 18 self.graphicsView.setGeometry(QtCore.QRect(10, 10, 640, 480)) 19 font = QtGui.QFont() 20 font.setPointSize(10) 21 self.graphicsView.setFont(font) 22 self.graphicsView.setObjectName("graphicsView") 23 self.pushButton = QtWidgets.QPushButton(Form) 24 self.pushButton.setGeometry(QtCore.QRect(660, 10, 171, 71)) 25 font = QtGui.QFont() 26 font.setPointSize(18) 27 self.pushButton.setFont(font) 28 self.pushButton.setObjectName("pushButton") 29 self.pushButton.raise_() 30 self.graphicsView.raise_() 31 32 self.retranslateUi(Form) 33 self.pushButton.clicked.connect(Form.MyFuncStart) 34 QtCore.QMetaObject.connectSlotsByName(Form) 35 36 def retranslateUi(self, Form): 37 _translate = QtCore.QCoreApplication.translate 38 Form.setWindowTitle(_translate("Form", "WinodwTitle")) 39 self.pushButton.setText(_translate("Form", "pushButton")) 40 41 42if __name__ == "__main__": 43 import sys 44 app = QtWidgets.QApplication(sys.argv) 45 Form = QtWidgets.QWidget() 46 ui = Ui_Form() 47 ui.setupUi(Form) 48 Form.show() 49 sys.exit(app.exec_()) 50

起動用

Python

1 2import os 3import sys 4 5from PyQt5 import QtWidgets, uic 6from PyQt5 import QtCore as Qc 7from PyQt5 import QtGui as Qg 8from PyQt5 import QtWidgets as Qw 9from PyQt5.Qt import * 10 11import cv2 12 13import GUI 14 15class MyForm(QtWidgets.QMainWindow): 16 def __init__(self, parent=None): 17 super().__init__(parent) 18 self.ui = GUI.Ui_Form() 19 self.ui.setupUi(self) 20 21 self.capture = cv2.VideoCapture(0) 22 23 self.view = Qw.QGraphicsView() 24 self.scene = Qw.QGraphicsScene() 25 26 def MyFuncStart(self): 27 self.timer = Qc.QTimer(self.view) 28 self.timer.timeout.connect(self.set) 29 self.timer.start(10) 30 31 def set(self): 32 ret, cv_img = self.capture.read() 33 if ret == False: 34 return 35 36 Height, Width, dim = cv_img.shape 37 38 cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) 39 height, width, dim = cv_img.shape 40 bytesPerLine = dim * width 41 42 image = Qg.QImage(cv_img.data, width, height, bytesPerLine, Qg.QImage.Format_RGB888) 43 44 item = Qw.QGraphicsPixmapItem(Qg.QPixmap.fromImage(image)) 45 46 self.scene.addItem(item) 47 self.ui.graphicsView.setScene(self.scene) 48 self.ui.graphicsView.fitInView(self.scene.sceneRect(), Qc.Qt.KeepAspectRatio) 49 50 51 52if __name__ == '__main__': 53 app = Qw.QApplication(sys.argv) 54 wmain = MyForm() 55 wmain.show() 56 sys.exit(app.exec_()) 57

試したこと

タイマーの更新毎に以下の設定を追加しても効果はありませんでした。
self.capture.release()
cv2.destroyAllWindows()

補足情報(FW/ツールのバージョンなど)

ラズベリーパイ4 4B
ラズベリーパイ用 カメラモジュール OV5647センサー 500万画素
Python3.7.3

対処法についてアドバイスを頂けないでしょうか?
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

tasuku様のアドバイスを参考し、以下のように
addItemの前に、self.scene.clear()を追加する事で解決できました。

python

1self.scene.clear() # <- 追加 2self.scene.addItem(item)

ありがとうございました。

投稿2021/04/11 19:59

Crew_38

総合スコア5

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

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

0

ベストアンサー

10ミリ秒ごとにカメラからの画像を表示する QGraphicsPixmapItem を毎回 QGraphicsScene に「追加」しているから表示するアイテム数が多くなり、処理が遅くなっているのかなと思います。

とりあえず試すこととしては、

  • ディスプレイの更新速度と同期するように 16ms ごとの処理にする(1秒間に60フレーム換算)
  • QGraphicsView/Scene ではなく、QLabel を利用し、毎回そのラベルの表示画像を差し替える

OpenCV が必須ではない場合は、QtMultimedia が提供するカメラの機能を試してみるのもいいかもしれません。

投稿2021/03/31 14:37

tasuku.

総合スコア347

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

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

Crew_38

2021/03/31 19:55

コメントありがとうございます。頂いた内容を試してみます 今後QRコード読み込みに活かしていきたいと思っており、 調べてみるとOpenCVを用いた情報を多く見かけましたが、QtMultimediaでも可能か確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問