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

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

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

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

Raspberry Pi

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

Python

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

Q&A

解決済

1回答

1009閲覧

opencvを使ってカメラ画像を表示するコードとキーボード入力を取得してi2c通信をするコードを用意したが二つを合わせるのがうまくいかない

otaka

総合スコア22

OpenCV

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

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2021/08/31 16:15

機体:ラズベリーパイ
OS:Raspberry Pi OS ver10.8
言語:python3

したいこと:
ラズベリーパイ(とAruduino)を使って遠隔操作カメラを用意する。
プログラムの内容:
・ライブカメラ映像を表示する
・キーボード入力によりAruduinoとi2c通信をする。Aruduinoでカメラに付けたモーターを回転させて視界を移すことができる

問題:
”カメラ映像を表示するプログラム” と "キーボード入力を受け付けてAruduinoとi2c通信を行うプログラム" の二つのプログラムファイルを用意してそれぞれ実行して動作を確認した。さらに二つのファイルを個別に同時に動作させることで一応の監視カメラを用意することができた。ここまではよかった。この後二つのプログラムをまとめた一つのプログラムファイルを作ってみたところAruduinoとの通信はできるがカメラ映像が表示されないものができてしまった。何がいけないのか意見を聞きたい。
下に元の二つのプログラムとそれらを合わせたプログラムを載せる。

エラーメッセージ:
エラーメッセージは出ていない。

お願いいたします。m(_ _)m

ライブカメラのプログラム

python3

1import cv2 2 3capture = cv2.VideoCapture(0) 4if capture.isOpened() is False: 5 raise IOError 6 7while(True): 8 try: 9 ret, frame = capture.read() 10 if ret is False: 11 raise IOError 12 cv2.imshow('frame',frame) 13 cv2.waitKey(1) 14 except KeyboardInterrupt: 15 # 終わるときは CTRL + C を押す 16 break 17 18capture.release() 19cv2.destroyAllWindows() 20

キーボード入力を取得してAruduinoとi2c通信をするプログラム

python3

1# -*- coding: utf-8 -*- 2import smbus 3from time import sleep 4import readchar 5 6bus = smbus.SMBus(1) 7 8SLAVE_ADDRESS = 0x04 9print("a:left, d:right, o;up, k:down ") 10 11def writeCommand(cmd): 12 bus.write_byte(SLAVE_ADDRESS, cmd) 13 print("send: ",cmd) 14 15while True: 16 command = readchar.readkey() 17 if str(command) == "a": 18 command = 1 19 elif str(command) == "d": 20 command = 2 21 elif str(command) == "o": 22 command = 3 23 elif str(command) == "k": 24 command = 4 25 elif command == ('q'): 26 break 27 else: 28 command = 5 29 if command >= 0 and command <= 180: 30 writeCommand(command) 31 else: 32 print("Error") 33 34

上の二つを合わせた問題のプログラム (カメラ映像が表示されない)

python3

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3import cv2 4import smbus 5from time import sleep 6import readchar 7 8bus = smbus.SMBus(1) 9SLAVE_ADDRESS = 0x04 10print("a:left, d:right, o;up, k:down ") 11 12 13cap = cv2.VideoCapture(0) 14if cap.isOpened() is False: 15 raise IOError 16# デフォルト画面サイズ横幅 17W = cap.get(cv2.CAP_PROP_FRAME_WIDTH) 18# デフォルト画面サイズ縦、高さ 19H = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) 20# デフォルトfps 21fps = cap.get(cv2.CAP_PROP_FPS) 22#デフォルトの画面サイズとfpsを確認 23print('W,H,fps: ', W , H , fps) 24#メモ W,H,fps: 640.0 480.0 30.0 25 26 27def writeCommand(cmd): 28 bus.write_byte(SLAVE_ADDRESS, cmd) 29 print("send: ",cmd) 30 31while(True): 32 33 #画面取得 34 ret, frame = cap.read() 35 36 #反転frame=cv2.flip(frame, 0) 37 if ret == True: 38 #画面への描写 39 cv2.imshow('frame',frame) 40 #2.waitKey(5) 41 42 command = readchar.readkey() 43 if str(command) == "a": 44 command = 1 45 elif str(command) == "d": 46 command = 2 47 elif str(command) == "o": 48 command = 3 49 elif str(command) == "k": 50 command = 4 51 elif command == ('q'): 52 break 53 else: 54 command = 5 55 if command >= 0 and command <= 180: 56 writeCommand(command) 57 else: 58 print("Error") 59 60 61 62cap.release() 63cv2.destroyAllWindows() 64 65

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

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

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

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

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

guest

回答1

0

ベストアンサー

waitKey は、キー入力所得だけでなく、GUIイベントの処理を兼ねている為、
opencvの提供するHighGUIを利用する場合は、waitKeyを定期的に呼び出す必要があります。

リファレンスより

imshow NOTE

This function should be followed by cv::waitKey function which displays the image for specified milliseconds. Otherwise, it won't display the image.

waitKey NOTE

This function is the only method in HighGUI that can fetch and handle events, so it needs to be called periodically for normal event processing unless HighGUI is used within an environment that takes care of event processing.

imshow を使う場合は waitKey を呼び出さなければならず、
制限として、キー入力の所得が競合してしまう為、
解決策としては、以下のどちらかの対策を取る事になります。

  • readchar ではなく waitKey を使い入力を独自に処理する。

 質問のコードの様に一文字であれば、問題はありませんが、
それ以上の入力を扱う場合は、入力のバッファリングを独自に実装する必要があります。

  • opencv の提供するGUI (imshow) を使わず、別のGUIを利用する。

 imread で得た frame を画像データとして適切なフォーマットに変換し、
GUI に描画します。
文字入力の扱いは、GUIのキーボード・ショートカットとして実装出来ます。

投稿2021/08/31 21:32

teamikl

総合スコア8760

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

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

otaka

2021/09/01 03:15

回答して頂きありがとうございます。 ご指摘を頂き以下の点を変更し結果、映像が表示されて入力もできるコードを用意することができました。 ・cv2.imshow()の直後にcv2.waitKey(1)を挿入 ・readchar.readkey()からcv2.waitKey(200)に変更 ←この時間が短いとキーを押し続けているのにキーから手を離している判定が定期的に差し込まれた。 imshow()を使わない方も気にはなりますが今回はimshow()を使うやり方のままでやろうと思います。 リファレンスも見やすく助かりました。ありがとうございました。m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問