環境
raspberry pi 3 B+
python
open cv (バージョンは忘れてしまいましたが、新しめのやつです)
pyqt5 (バージョンは忘れてしまいましたが、新しめのやつです)
###目標
自律移動ロボットを製作しています。
GUIを作成し、GUI上でボタンを押すことでロボットを動かす仕組みです。
ロボットは搭載されたカメラから環境認識を行い自律的にモーターの出力を変えます。
###状態
カメラを起動し、モータを動かすことが出来ています。
しかし、ちょくちょく「cv2.error」が出てきます。
エラー文は以下になります。
cv2.error: OpenCV(3.4.3) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'
これはよくあるエラーだそうで、画像が認識できていないということだそうです。
しかし、分からないことに、同じプログラムでも、調子が良いと出てこず、調子が悪いとすぐに出てきます。何が原因かもわかりません。
ラズパイの動作が重くなると画像処理が出来なくなり、画像が読み込めなくなるのでしょうか?
どうかご教授を頂けますと幸いです。
また、現在の私の環境上返信に時間を要してしまいます。質問をしている身分で大変申し訳ありませんがよろしくお願いします。
以下に作成したコード(必要そうなもの)を載せます。
###作成したコード(必要そうなもの)
python
1#GUI.py 2import sys 3from PyQt5.QtWidgets import * 4from PyQt5.QtGui import * 5from PyQt5.QtCore import * 6import subprocess 7import time 8import numpy as np 9import cv2 10import math 11import RPi.GPIO as GPIO 12 13import motor 14import Gyro 15import Image_Processing 16 17 18class Tab1Widget(QWidget): 19 20 def __init__(self): 21 super().__init__() 22 self.title = "自律移動" 23 self.left = 50 24 self.top = 50 25 self.width = 1300 26 self.height = 1200 27 self.initUI() 28 self.counter = 0 29 30 def initUI(self): 31 32 super(Tab1Widget, self).__init__() 33 self.cap = cv2.VideoCapture(0) 34 35 self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,320) 36 self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240) 37 self.cap.set(cv2.CAP_PROP_FPS,10) 38 39 self.camera = 0 40 self.auto = 0 41 42 self.Pitch=0 43 self.Roll=0 44 45 46 self.view1 = QGraphicsView() 47 self.scene1 = QGraphicsScene() 48 49 btn1 = QPushButton("カメラSTART", self) 50 btn2 = QPushButton("カメラSTOP", self) 51 btn3 = QPushButton("自律移動START", self) 52 btn4 = QPushButton("自律移動STOP", self) 53 54 btn1.clicked.connect(self.camera_on) 55 btn2.clicked.connect(self.camera_off) 56 btn3.clicked.connect(self.auto_move_on) 57 btn4.clicked.connect(self.auto_move_off) 58 59 #GUIレイアウト(省略) 60 61 self.show() 62 63 64 65 def camera_on(self): 66 self.camera = 1 67 68 #サーボモータ(正面カメラ)のsetup 69 Servo_pin=18 70 GPIO.setmode(GPIO.BCM) 71 GPIO.setup(Servo_pin, GPIO.OUT) 72 self.Servo = GPIO.PWM(Servo_pin, 50) 73 self.Servo.start(0) 74 75 self.camera_set() 76 77 timer = QTimer(self.view1) 78 timer.timeout.connect(self.camera_set) 79 timer.start(300) 80 81 82 def camera_off(self): 83 self.camera = 0 84 85 def camera_set(self): 86 #Gyro.pyからデータ取得 87 self.Pitch, self.Roll = Gyro.GyroSensor(self.Pitch, self.Roll) 88 89 #テキストに出力 90 pitch = str(round(self.Pitch)) 91 self.textbox7.setText(pitch + "°") 92 93 roll = str(round(self.Roll)) 94 self.textbox8.setText(roll + "°") 95 96 ret, cv_img = self.cap.read() 97 98 if ret == False: 99 return 100 101 def servo_angle(angle): 102 duty = 2.5 + (12.0 - 2.5) * (angle + 90) / 180 103 self.Servo.ChangeDutyCycle(duty) 104 105 servo_angle(round(self.Pitch)) 106 self.Servo.stop() 107 108 height = cv_img.shape[0] 109 width = cv_img.shape[1] 110 center = (int(width/2),int(height/2)) 111 angle = round(self.Roll*(-1)) 112 scale = 1.0 113 trans = cv2.getRotationMatrix2D(center,angle,scale) 114 self.cv_img = cv2.warpAffine(cv_img,trans,(width,height)) 115 116 self.img_src = self.cv_img 117 118 119 cv_img_RGB = cv2.cvtColor(self.cv_img,cv2.COLOR_BGR2RGB) 120 121 122 cv_img_RGB = cv2.resize(cv_img_RGB,(320,240)) 123 124 height, width, dim = cv_img_RGB.shape 125 126 bytesPerLine = dim * width 127 128 self.image = QImage(cv_img_RGB.data, width, height, bytesPerLine, QImage.Format_RGB888) 129 130 self.item = QGraphicsPixmapItem(QPixmap.fromImage(self.image)) 131 132 self.scene.addItem(self.item) 133 134 self.view.setScene(self.scene) 135 136 137 def auto_move_on(self): 138 139 self.auto = 1 140 GPIO.cleanup() 141 motor.init_GPIO() 142 self.pin1 , self.pin2 , self.pin3 , self.pin4 , self.pin5 , self.pin6 = motor.init_GPIO() 143 self.auto_move_set() 144 repeatTime = 10 145 timer = QTimer(self.view1) 146 timer.timeout.connect(self.auto_move_set) 147 timer.start(repeatTime) 148 149 def auto_move_off(self): 150 151 self.auto = 0 152 self.motor_S() 153 GPIO.cleanup() 154 print("cleanup") 155 156 157 def auto_move_set(self): 158 if self.auto == 0 or self.camera == 0: 159 return 160 variable, img_src0, elapsed_time = Image_Processing.I_P(self.auto,self.img_src,self.Roll) 161 162 #モーターを動かすプログラム。画像処理(Image_Processing.py)にて得られた変数(variable)を基にモータの出力を変更 163 self.Duty_R , self.Duty_L = motor.motor_PWM(p_vaiue3,self.pin1 , self.pin2 , self.pin3 , self.pin4 , self.pin5 , self.pin6 ) 164 165 variable = str(round(variable,3)) 166 self.textbox6.setText(variable) 167 elapsed_time = str(round(elapsed_time,3)) 168 self.textbox1.setText(elapsed_time) 169 Duty_R = str(round(self.Duty_R ,1)) 170 self.textbox7.setText(Duty_R) 171 Duty_L = str(round(self.Duty_L,1)) 172 self.textbox8.setText(Duty_L) 173 174if __name__ == "__main__": 175 app = QApplication(sys.argv) 176 ex = Tab1Widget() 177 sys.exit(app.exec_())
python
1#Image_Processing.py 2import numpy as np 3import math 4import cv2 5import time 6import Value 7 8def I_P(auto,img_src,Roll): 9 t1 = time.time() 10 if auto == 0: 11 return 12 F= 0 13 14 15 img_src=cv2.resize(img_src,(180,60)) 16 img_src=img_src[20:60, 20-round(75*math.cos(math.radians(90-Roll))):140-round(75*math.cos(math.radians(90-Roll)))] 17 #HSV変換 18 hsv = cv2.cvtColor(img_src, cv2.COLOR_BGR2HSV) 19 img_src0 = cv2.cvtColor(img_src, cv2.COLOR_BGR2RGB) 20 GREEN_min = np.array([30, 64, 30]) 21 GREEN_max = np.array([90, 255,255]) 22 img_mask = cv2.inRange(hsv,GREEN_min ,GREEN_max) 23 24 neiborhood8 = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]],np.uint8) 25 img_erosion = cv2.erode(img_mask,neiborhood8,iterations=2) 26 img_erosion = cv2.erode(img_erosion,neiborhood8,iterations=2) 27 img_dilation = cv2.dilate(img_erosion,neiborhood8,iterations=2) 28 img_dilation = cv2.dilate(img_dilation,neiborhood8,iterations=2) 29 img_dst = cv2.bitwise_and(img_src, img_src, mask=img_dilation) 30 img_dst2 = cv2.bitwise_and(img_src, img_src, mask=img_mask) 31 32 #Value.pyで変数(variable)を計算 33 row_L , row_R ,variable = Value.Get_MotorParameter(img_mask,1 ,F) 34 35 36 t2 = time.time() 37 elapsed_time = t2 - t1 38 39 return variable ,img_src0 ,elapsed_time
ちなみに、エラーはImage_Processing.pyのHSV変換するところ
hsv = cv2.cvtColor(img_src, cv2.COLOR_BGR2HSV)
で毎回生じます。
回答3件
あなたの回答
tips
プレビュー