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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

error:(-215:Assertion failed) !_image.empty() in function 'detectMarkers'でスクリプトが動きません

kinora
kinora

総合スコア3

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1回答

0グッド

1クリップ

394閲覧

投稿2022/11/16 02:45

前提

OpenCVで映像を読み込み, マーカを認識させる.

実現したいこと

Webカメラを用いて, マーカを認識させたい.

発生している問題・エラーメッセージ

cv2.error: OpenCV(4.5.5) /tmp/pip-wheel-yqhq3sgl/opencv-contrib-python_c4e7c7ffd9b7480c9c72164eb700cd45/opencv_contrib/modules/aruco/src/aruco.cpp:1031:error:(-215:Assertion failed) !_image.empty() in function 'detectMarkers'

該当のソースコード

python

1 2import numpy as np 3import cv2 4from cv2 import aruco 5 6def main(): 7 cap = cv2.VideoCapture(1) #使うカメラによって数値を変更 8 # マーカーサイズ 9 marker_length = 0.056 # [m] 10 # マーカーの辞書選択 11 dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50) 12 13 #camera_matrix = np.load("mtx.npy") 14 #distortion_coeff = np.load("dist.npy") 15 #カメラキャリブレーションを行った場合、上記を使用。 16 camera_matrix = np.array( [[1.42068235e+03,0.00000000e+00,9.49208512e+02], 17 [0.00000000e+00,1.37416685e+03,5.39622051e+02], 18 [0.00000000e+00,0.00000000e+00,1.00000000e+00]] ) 19 distortion_coeff = np.array( [1.69926613e-01,-7.40003491e-01,-7.45655262e-03,-1.79442353e-03, 2.46650225e+00] ) 20 21 while True: 22 ret, img = cap.read() 23 corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary) 24 aruco.drawDetectedMarkers(img, corners, ids, (0,255,255)) 25 26 if len(corners) > 0: 27 # マーカーごとに処理 28 for i, corner in enumerate(corners): 29 30 rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corner, marker_length, camera_matrix, distortion_coeff) 31 32 # 不要なaxisを除去 33 tvec = np.squeeze(tvec) 34 rvec = np.squeeze(rvec) 35 # 回転ベクトルからrodoriguesへ変換 36 rvec_matrix = cv2.Rodrigues(rvec) 37 rvec_matrix = rvec_matrix[0] # rodoriguesから抜き出し 38 # 並進ベクトルの転置 39 transpose_tvec = tvec[np.newaxis, :].T 40 # 合成 41 proj_matrix = np.hstack((rvec_matrix, transpose_tvec)) 42 # オイラー角への変換 43 euler_angle = cv2.decomposeProjectionMatrix(proj_matrix)[6] # [deg] 44 45 print("ID : " + str(ids[i])) 46 47 # 可視化 48 draw_pole_length = marker_length/2 # 現実での長さ[m] 49 aruco.drawAxis(img, camera_matrix, distortion_coeff, rvec, tvec, draw_pole_length) 50 51 cv2.imshow('drawDetectedMarkers', img) 52 if cv2.waitKey(10) & 0xFF == ord('q'): 53 break 54 cv2.destroyAllWindows() 55 56if __name__ == '__main__': 57 main()

試したこと

エラーが出る前に, このスクリプトは数回動いていました. ある時, いきなりエラーを出力し, 動かなくなってしまいました.

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

自分で調べたことで, !_image.empty() in function 'detectMarkers'というエラーはdetectMarkersにイメージが格納されていないということはわかりました.
ですが, image.emptyというエラーを解決しという記事を見つけることができず, また解決策が分かりません.
初めてラズパイ, パイソンを触っているものです.
お手柔らかにご教授願います.

以下のような質問にはグッドを送りましょう

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

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

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jbpb0

2022/11/17 02:29

> error:(-215:Assertion failed) !_image.empty() in function 'detectMarkers' は、 > ret, img = cap.read() で「img」が取得できてないため、 > corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary) の「img」が空だというエラーだと思います http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html#id5 の「動画を保存する」のコードのように、「ret」を確認して、データが取得できた場合のみ処理を行うようにしてみてください
kinora

2022/11/17 07:15

ご回答ありがとうございました. while(cap.isOpened()): ret, frame = cap.read() if ret==True: frame = cv2.flip(frame,0) # write the flipped frame out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break こちらのことでしょうか. 本当に申し訳ないのですが, こちらのスクリプトをどこに, どのように改変すればよいのでしょうか.
jbpb0

2022/11/17 09:04 編集

while True: ↓ 変更 (インデントを合わせる) while(cap.isOpened()): ret, img = cap.read() のすぐ下に下記を追加 (インデントを合わせる) if ret==True: corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary) から cv2.imshow('drawDetectedMarkers', img) までのインデントを増やす でいいと思いますが、変更後に、変数名やインデントに矛盾が無いかチェックしてください

回答1

0

ベストアンサー

こういうことだったりしませんか?(厳密には別案件ですが、類似原因によるものなので参考になると思います。)

リファレンスを確認した所.cap.read()は失敗時に空データを返す(=エラー終了してくれない) らしいのでimgが空=cap.read()が成功しているかどうか確認して、直接の原因がどこにあるか割り出す必要があると思います。
主原因を割り出さないと正しい対処を調べるのは至難の業かと。

(一応原因特定の例:imgが空→途中から動かなくなった=最初は動いていた→カメラが途中から切断されている?→カメラの接続を確認(コードが抜けてないか?接触が甘くなってないか?再び差し直したら動くか?))

投稿2022/11/16 05:02

編集2022/11/16 05:20
pig_vba

総合スコア670

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

pig_vba

2022/11/17 07:53

デバッグで直後の行で中断してウォッチ式から確認してもいいですし、printでコンソールに出力してもいいと思います。空かどうか判定するだけなら選択肢は結構多いので好きな手段をとってください 一番早い方法はこれだと思います。 https://teratail.com/questions/92319
kinora

2022/11/17 07:54

すみません, 解決しました. ありがとうございました.
pig_vba

2022/11/17 08:01

無事解決できたようで何よりです

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。