実現したいこと
前回作成したプログラムに「カメラでの撮影」、「二値化」、「黒の面積を条件化」、「エアシリンダー制御」を
付け加えています。
前回のプログラム→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
あなたの回答
tips
プレビュー