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

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

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

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

Raspberry Pi

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

Python

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

Q&A

0回答

626閲覧

カメラで直前に撮影した写真を二値化するプログラムを繰り返し行いたいです。

ryu-12

総合スコア2

OpenCV

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

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2021/12/17 04:54

編集2021/12/18 10:08

実現したいこと

前回作成したプログラムに「カメラでの撮影」、「二値化」、「黒の面積を条件化」、「エアシリンダー制御」を
付け加えています。
前回のプログラム→https://teratail.com/questions/372761
現在実現したいことは、
1.モーターが始動
2.センサーが物体を検知→モーター停止
3.モーター停止から1秒後に撮影開始
4.写真を二値化し、白と黒の面積をそれぞれ表示
5.二値化から3秒後、モーター再始動(再始動してから0.3秒間はセンサーを無視)
6.黒の面積を条件とし、条件を満たしていればセンサーの復帰と同時にエアシリンダーで物体を押し出す
7.こちら停止の指令を出すまで、2~6の動作を繰り返す
という感じです。下記は現在のプログラムです。

Python3

1import RPi.GPIO as GPIO 2import time 3import sys 4import datetime 5import cv2 6import numpy as np 7GPIO.setwarnings(False) 8GPIO.setmode(GPIO.BOARD) 9 10motor1speed = 15 11Air = 18 12motor1Direction = 21 13SENSOR_PORT = 24 14LED1 = 35 15LED2 = 37 16 17 18GPIO.setup(Air,GPIO.OUT) 19GPIO.setup(19,GPIO.OUT) 20GPIO.setup(motor1speed,GPIO.OUT) 21GPIO.setup(motor1Direction,GPIO.OUT) 22GPIO.setup(SENSOR_PORT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 23GPIO.setup(LED1, GPIO.OUT) 24GPIO.setup(LED2, GPIO.OUT) 25 26#モーター制御 27def motorstart(): 28 pwm = GPIO.PWM(19, 100) 29 pwm.start(0) 30 GPIO.output(motor1Direction, 0) 31 pwm.ChangeDutyCycle(40) 32 pwmR = GPIO.PWM(motor1speed, 100) 33 pwmR.start(0) 34 GPIO.output(motor1speed, 1) 35 pwmR.ChangeDutyCycle(23) 36 37def motorstop(): 38 GPIO.output(motor1speed, 0) 39 GPIO.output(motor1Direction, 0) 40 41cap = cv2.VideoCapture(0) 42motorstart() 43 44restart_flag = False 45while True: 46 try: 47 if restart_flag: 48 GPIO.output(LED1, GPIO.HIGH) 49 motorstart() 50 if time.time() - s_t >=0.3: 51 if 50 < Black_Area: #黒の割合が50%より大きい場合 52 #エアシリンダー制御 53 GPIO.output(Air, 1) #判別対象→押出 54 time.sleep(0.5) 55 GPIO.output(Air, 0) 56 restart_flag = False 57 else: 58 continue 59 60 if(GPIO.input(SENSOR_PORT) == 0): 61 motorstart() 62 GPIO.output(LED1, GPIO.HIGH) 63 GPIO.output(LED2, GPIO.LOW) 64 65 else: 66 GPIO.output(LED1, GPIO.LOW) 67 GPIO.output(LED2, GPIO.HIGH) 68 motorstop() 69 time.sleep(1) 70 #撮影開始 71 ret, frame = cap.read() 72 time.sleep(3) 73 path = "photo.jpg" 74 cv2.imwrite(path,frame) 75 #画像の二値化開始 76 img=cv2.imread('photo.jpg',0) 77 ret1,img_th=cv2.threshold(img,0,255,cv2.THRESH_OTSU) 78 whole_area=img_th.size 79 white_area=cv2.countNonZero(img_th) 80 black_area=whole_area-white_area 81 print('White_Area='+str(white_area/whole_area*100)+'%') 82 print('Black_Area='+str(black_area/whole_area*100)+'%') 83 Black_Area= black_area/whole_area*100 84 time.sleep(3) 85 motorstart() 86 restart_flag = True 87 s_t = time.time() 88 GPIO.output(LED2, GPIO.LOW) 89 90 except KeyboardInterrupt: #全プログラム停止 & 終了 91 GPIO.cleanup() 92 sys.exit()

現在起こっている問題

モーターの動作やセンサーの反応、二値化の結果の条件化はうまくいっているのですが、写真の撮影がうまくいきません。最初の撮影は問題ないのですが二回目以降写真を撮影せずに、最初に撮った写真を二値化してしまいます。なので二値化の結果がずっと変わらないという問題が発生しています。

試したこと

上記のプログラムの「#撮影開始」の部分に「while(True)」を入れて撮影の繰り返しを行おうとしたのですが、撮影してからの動作(モーターやセンサーなど)が動かなくなってしまいした。特にはエラーが起きることはありませんでした。
どなたか解決策を教えていただけないでしょうか。

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

Python 3.7.2 , Open CV 4.5.3

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

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

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

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

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

thkana

2021/12/19 09:30

> cv2.imwrite(path,frame) > #画像の二値化開始 > img=cv2.imread('photo.jpg',0) 特に記録を残そうということでもなさそうですが、なぜファイルを介しているのですか? frameを直接二値化できない要素があるのですか? (常に「最初に撮った写真」が扱われるようにはならなそうですが、ファイル書き込みを指示して直後に読み出そうとするところに不安を感じます)
ryu-12

2021/12/20 13:15

thkana様 >特に記録を残そうということでもなさそうですが~ 撮影や二値化のプログラムは他のサイトから参考にしたものです。(ほぼそのまま使用しています) 写真の撮影・保存→https://tony-mooori.blogspot.com/2015/10/pythonwebpython.html 二値化→https://qiita.com/tokkuri/items/ad5e858cbff8159829e9 なので、 > frameを直接二値化 とはおそらく「bgrUpper」や「bgrLower」を使用したプログラムのことだと思いますが、自分は使用していません。 >ファイル書き込みを指示して直後に読み出そうとする これに関しての不安が動作的なことでしたら、すでに確認済みで問題はありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問