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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

2477閲覧

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

kinora

総合スコア3

OpenCV

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

Python 3.x

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

0グッド

1クリップ

投稿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というエラーを解決しという記事を見つけることができず, また解決策が分かりません.
初めてラズパイ, パイソンを触っているものです.
お手柔らかにご教授願います.

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

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

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

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

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

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) までのインデントを増やす でいいと思いますが、変更後に、変数名やインデントに矛盾が無いかチェックしてください
guest

回答1

0

ベストアンサー

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

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

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

投稿2022/11/16 05:02

編集2022/11/16 05:20
pig_vba

総合スコア807

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

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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問