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

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

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

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

Raspberry Pi

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

解決済

不定期に「cv2.error:~~~~cvtColor」が生じます。

pythonnoob1
pythonnoob1

総合スコア18

OpenCV

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

Raspberry Pi

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

3回答

0評価

0クリップ

2056閲覧

投稿2020/11/12 08:42

編集2020/11/17 07:38

環境

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

#GUI.py import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import subprocess import time import numpy as np import cv2 import math import RPi.GPIO as GPIO import motor import Gyro import Image_Processing class Tab1Widget(QWidget): def __init__(self): super().__init__() self.title = "自律移動" self.left = 50 self.top = 50 self.width = 1300 self.height = 1200 self.initUI() self.counter = 0 def initUI(self): super(Tab1Widget, self).__init__() self.cap = cv2.VideoCapture(0) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,320) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240) self.cap.set(cv2.CAP_PROP_FPS,10) self.camera = 0 self.auto = 0 self.Pitch=0 self.Roll=0 self.view1 = QGraphicsView() self.scene1 = QGraphicsScene() btn1 = QPushButton("カメラSTART", self) btn2 = QPushButton("カメラSTOP", self) btn3 = QPushButton("自律移動START", self) btn4 = QPushButton("自律移動STOP", self) btn1.clicked.connect(self.camera_on) btn2.clicked.connect(self.camera_off) btn3.clicked.connect(self.auto_move_on) btn4.clicked.connect(self.auto_move_off) #GUIレイアウト(省略) self.show() def camera_on(self): self.camera = 1 #サーボモータ(正面カメラ)のsetup Servo_pin=18 GPIO.setmode(GPIO.BCM) GPIO.setup(Servo_pin, GPIO.OUT) self.Servo = GPIO.PWM(Servo_pin, 50) self.Servo.start(0) self.camera_set() timer = QTimer(self.view1) timer.timeout.connect(self.camera_set) timer.start(300) def camera_off(self): self.camera = 0 def camera_set(self): #Gyro.pyからデータ取得 self.Pitch, self.Roll = Gyro.GyroSensor(self.Pitch, self.Roll) #テキストに出力 pitch = str(round(self.Pitch)) self.textbox7.setText(pitch + "°") roll = str(round(self.Roll)) self.textbox8.setText(roll + "°") ret, cv_img = self.cap.read() if ret == False: return def servo_angle(angle): duty = 2.5 + (12.0 - 2.5) * (angle + 90) / 180 self.Servo.ChangeDutyCycle(duty) servo_angle(round(self.Pitch)) self.Servo.stop() height = cv_img.shape[0] width = cv_img.shape[1] center = (int(width/2),int(height/2)) angle = round(self.Roll*(-1)) scale = 1.0 trans = cv2.getRotationMatrix2D(center,angle,scale) self.cv_img = cv2.warpAffine(cv_img,trans,(width,height)) self.img_src = self.cv_img cv_img_RGB = cv2.cvtColor(self.cv_img,cv2.COLOR_BGR2RGB) cv_img_RGB = cv2.resize(cv_img_RGB,(320,240)) height, width, dim = cv_img_RGB.shape bytesPerLine = dim * width self.image = QImage(cv_img_RGB.data, width, height, bytesPerLine, QImage.Format_RGB888) self.item = QGraphicsPixmapItem(QPixmap.fromImage(self.image)) self.scene.addItem(self.item) self.view.setScene(self.scene) def auto_move_on(self): self.auto = 1 GPIO.cleanup() motor.init_GPIO() self.pin1 , self.pin2 , self.pin3 , self.pin4 , self.pin5 , self.pin6 = motor.init_GPIO() self.auto_move_set() repeatTime = 10 timer = QTimer(self.view1) timer.timeout.connect(self.auto_move_set) timer.start(repeatTime) def auto_move_off(self): self.auto = 0 self.motor_S() GPIO.cleanup() print("cleanup") def auto_move_set(self): if self.auto == 0 or self.camera == 0: return variable, img_src0, elapsed_time = Image_Processing.I_P(self.auto,self.img_src,self.Roll) #モーターを動かすプログラム。画像処理(Image_Processing.py)にて得られた変数(variable)を基にモータの出力を変更 self.Duty_R , self.Duty_L = motor.motor_PWM(p_vaiue3,self.pin1 , self.pin2 , self.pin3 , self.pin4 , self.pin5 , self.pin6 ) variable = str(round(variable,3)) self.textbox6.setText(variable) elapsed_time = str(round(elapsed_time,3)) self.textbox1.setText(elapsed_time) Duty_R = str(round(self.Duty_R ,1)) self.textbox7.setText(Duty_R) Duty_L = str(round(self.Duty_L,1)) self.textbox8.setText(Duty_L) if __name__ == "__main__": app = QApplication(sys.argv) ex = Tab1Widget() sys.exit(app.exec_())

python

#Image_Processing.py import numpy as np import math import cv2 import time import Value def I_P(auto,img_src,Roll): t1 = time.time() if auto == 0: return F= 0 img_src=cv2.resize(img_src,(180,60)) img_src=img_src[20:60, 20-round(75*math.cos(math.radians(90-Roll))):140-round(75*math.cos(math.radians(90-Roll)))] #HSV変換 hsv = cv2.cvtColor(img_src, cv2.COLOR_BGR2HSV) img_src0 = cv2.cvtColor(img_src, cv2.COLOR_BGR2RGB) GREEN_min = np.array([30, 64, 30]) GREEN_max = np.array([90, 255,255]) img_mask = cv2.inRange(hsv,GREEN_min ,GREEN_max) neiborhood8 = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]],np.uint8) img_erosion = cv2.erode(img_mask,neiborhood8,iterations=2) img_erosion = cv2.erode(img_erosion,neiborhood8,iterations=2) img_dilation = cv2.dilate(img_erosion,neiborhood8,iterations=2) img_dilation = cv2.dilate(img_dilation,neiborhood8,iterations=2) img_dst = cv2.bitwise_and(img_src, img_src, mask=img_dilation) img_dst2 = cv2.bitwise_and(img_src, img_src, mask=img_mask) #Value.pyで変数(variable)を計算 row_L , row_R ,variable = Value.Get_MotorParameter(img_mask,1 ,F) t2 = time.time() elapsed_time = t2 - t1 return variable ,img_src0 ,elapsed_time

ちなみに、エラーはImage_Processing.pyのHSV変換するところ

hsv = cv2.cvtColor(img_src, cv2.COLOR_BGR2HSV)

で毎回生じます。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

fourteenlength

2020/11/12 09:53

確かめられないのでコメント欄で対応します。 恐らく ret, cv_img = self.cap.read()の処理で何らかの原因で(過負荷でフレームが落ちて?カメラがタイムアウトして?)画像が拾えていない、其のあとに拾えていない画像はHSVにできていない、だと思います。 if ret is True:のような感じで画像が拾えたときだけ処理をするような安全策を仕込んで様子を見られますか?
pythonnoob1

2020/11/12 10:21

fourteenlength様、返信ありがとうございます。 実際に実行できるのは明日になりそうです。明日実行し、また結果を報告させて頂きます。よろしくお願いします。
pythonnoob1

2020/11/13 06:35

fourteenlength様、本日、様々な可能性を考え実際に実行してみました。 しかし、改善されなかったことをご報告させていただきます。 返信してくださり、誠に有難うございます。
fourteenlength

2020/11/14 07:21 編集

少なくともRollの値を0-360で振った時に212~328になった時'img_src.shape (40, 0, 3)'が発生してエラーが起きて止まるとこまで確認しました。回答にはならないのでここに参考まで。 ```Python import numpy as np import cv2 for Roll in range(360): ____print("------------") ____print("Roll:", Roll ) ____img_src = img_src = np.zeros((180,60,3),np.uint8) ____try: ________img_src = img_src[20:60, 20-round(75*math.cos(math.radians(90-Roll))):140-round(75*math.cos(math.radians(90-Roll)))] ________# print("img_src.shape", img_src.shape) ________img_src = cv2.cvtColor(img_src ,cv2.COLOR_BGR2RGB) ____except Exception as err: ________print(err) ```
fourteenlength

2020/11/14 07:31 編集

variable, img_src0, elapsed_time = Image_Processing.I_P(self.auto,self.img_src,self.Roll) の後にimg_src0を使う予定はあるのでしょうか?少なくとも今はなさそうですし予定がないのであればimg_src0関連の処理を全部消すのもありかと…。 画像をどう使うのか分かりませんが、 1.クラッシュしなければいい(深追いしない、ただのデバグ用) エラーが起きていたような条件のimg_src0は使う予定はそもそもない、であればゼロにならないように画像の辺の最小値を1にするような前処理(Rollの範囲を制限する前処理)を挟んだらいいと思います。もしくはダミー画像で差し替える等でしょうか。 2.クラッシュも困るし、img_src0をいかなる時も使いたい Rollの値が212~328に収まる条件を探るべきです。
pythonnoob1

2020/11/14 07:39

fourteenlength様、ありがとうございます!!大変参考になりました。今回のエラーの原因であるということを考慮し、参考にさせて頂きます!! img_src0は使わないので、処理を消しときます。ありがとうございます!!
fourteenlength

2020/11/14 07:42 編集

(私なら間違いなく1を選びますが o_0 )yuki23さんの考え方は非常に重要なので、個人的には2の方を進んでほしいです。
pythonnoob1

2020/11/14 07:48

fourteenlength様、返信ありがとうございます。どちらの考え方もとても参考にさせて頂いております。色々なことを視野に入れて考えていきたいと思います。ありがとうございます!!
fourteenlength

2020/11/17 10:54

このコード(回答欄込み)でエラーは発生しますか?
pythonnoob1

2020/11/17 12:06

fourteenlength様、返信ありがとうございます。 先程、一部修正(yuki23様とのやりとり参照)させて頂きました。モーターは繋いでいませんが、その場合はエラーが出ませんでした?これが、偶然なのかは分かりませんが後日モーターを繋げて実験したいと思います。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Raspberry Pi

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