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

回答1件
あなたの回答
tips
プレビュー