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

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

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

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

Python 3.x

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

Raspberry Pi

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

Q&A

解決済

1回答

3887閲覧

GUI上にカメラの映像を映したい

noooooooob

総合スコア16

OpenCV

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

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2020/07/08 03:52

編集2020/07/15 08:48

環境

Raspberry Pi 3 B
python 3.7

やりたいこと

pyqt5でGUIを作成し、GUI上にカメラのフレームを出力したいです。
後々、このカメラを使って画像処理もやっていく予定です。

###作成したコード

python

1import sys 2from PyQt5.QtWidgets import * 3from PyQt5.QtGui import * 4from PyQt5.QtCore import * 5import subprocess 6import time 7import numpy as np 8import cv2 9 10 11class Tab1Widget(QWidget): 12 13 def __init__(self): 14 super().__init__() 15 self.title = "カメラテスト" 16 self.left = 50 17 self.top = 50 18 self.width = 1300 19 self.height = 1200 20 self.initUI() 21 22 def initUI(self): 23 24 self.cap = cv2.VideoCapture(0) 25 26 self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,640) 27 self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,400) 28 self.cap.set(cv2.CAP_PROP_FPS,10) 29 30 self.camera_on = 0 31 32 self.view = QGraphicsView() 33 self.scene = QGraphicsScene() 34 35 btn1 = QPushButton("START", self) 36 btn2 = QPushButton("STOP", self) 37 38 btn1.clicked.connect(self.Start) 39 btn2.clicked.connect(self.Stop) 40 41 label1 = QLabel("カメラ") 42 43 layoutA = QHBoxLayout() 44 layoutA.addWidget(btn1) 45 layoutA.addWidget(btn2) 46 47 layoutB = QVBoxLayout() 48 layoutB.addWidget(label1) 49 layoutB.addWidget(self.view) 50 51 layoutAB = QVBoxLayout() 52 layoutAB.addLayout(layoutA) 53 layoutAB.addLayout(layoutB) 54 55 self.setLayout(layoutAB) 56 self.show() 57 58 def Start(self): 59 self.camera_on = 1 60 self.Camera_On() 61 timer = QTimer(self.view1) 62 timer.timeout.connect(self.Camera_On) 63 timer.start(300) 64 65 def Camera_On(self): 66 ret, cv_img = self.cap.read() 67 if ret == False: 68 return 69 70 self.img_src = cv_img 71 72 cv_img_RGB = cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB) 73 cv_img_RGB = cv2.resize(cv_img_RGB,(640,500)) 74 #cv_img_RGB = cv2.rectangle(cv_img_RGB, (65, 95), (255, 250), (255, 0, 0), 2, 3) 75 height, width, dim = cv_img_RGB.shape 76 bytesPerLine = dim * width 77 self.image = QImage(cv_img_RGB.data, width, height, bytesPerLine, QImage.Format_RGB888)# 78 self.item = QGraphicsPixmapItem(QPixmap.fromImage(self.image)) 79 self.scene.addItem(self.item) 80 self.view.setScene(self.scene) 81 82 def Stop(): 83 self.camera_on = 0 84 85if __name__ == "__main__": 86 app = QApplication(sys.argv) 87 ex = Tab1Widget() 88 sys.exit(app.exec_())

分からないこと

一応、一つずつ調べ、学習しながら作ったのですが、分からないことがたくさんありますので、ご教授いただけますと幸いです。
Q1.そもそもこのコードで、カメラフレームをGUI上に出力できますか?
Q2.このコードの私の解釈はあっていますか?以下、私の解釈
1.QGraphicsView()[Line32]は作成したカメラフレームをGUI上に出力するためのクラス。
2.QGraphicsScene()[Line33]はQGraphicsView()と一緒に使うクラス(道具)。
3.Start関数内[Line55~60]のQTime関数で0.3秒おきにフレームを更新。
4.cv_img_RGB.shape[Line72]でcv_img_RGBの高さ、幅、奥行き?のデータを取得

私が理解できたのはこれだけでした。
[Line74~77]が特に理解できていません。何をしているのかもわかりません。どうかご教授ください。よろしくお願いします。

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

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

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

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

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

yuki23

2020/07/08 05:44

Qtの質問のようですので、qt のタグも追加しておくと良いでしょう
noooooooob

2020/07/08 05:47

ありがとうございます。 早速訂正させていただきます。
guest

回答1

0

自己解決

Q1.おそらく
Q2.正しい
Q3.
line74.#Opencv(numpy)画像をQtのQImageに変換
line75.#QImageをQPixmapに変換し、アイテムとして読み込む
line76~77.#ピクセルイメージをシーンに埋め込み、さらにビューワーに入れることで表示が行われます。

投稿2020/07/09 09:57

noooooooob

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問