「ArUco」ライブラリを使用して、マーカの認識を行っています。
他の方が公開されていたARマーカの認識プログラムを用いてマーカまでの距離、及び座標を計測しているのですが、複数マーカーを検出するとIDと距離及び座標の関係が混同してしまいます。
こちらのプログラムを、複数マーカを認識した際にそれぞれのマーカのデータを表示させるようにするためにはどこを変えればよいでしょうか。
ご回答お待ちしております。
質問追記2020/07/16
質問内容が分かりづらいとの事でしたので、内容の追記になります。
現在、カメラからARマーカまでの3次元座標系計測(カメラからのx,y,z座標計測)を行っております。
そこでマーカーの計測部分を下記参考サイト様のプログラムを用いて実施しております。
単独マーカの場合ではIDと3次元座標系のタグ付けが可能なのですが、複数マーカになると(ID)、(x,y,z座標)のデータを個別に出力することが出来ずカメラに移っているID番号と3次元座標データがランダムに1つ表示されてしまいます。
これを、たとえば(ID1のマーカ=(x1,y1,z1)),(ID2のマーカ=(x2,y2,z2))…のように表示させる方法があれば教えていただきたいです。
参考にさせていただいたリンク先↓
https://qiita.com/ReoNagai/items/a8fdee89b1686ec31d10
python
1import numpy as np 2import cv2 3from cv2 import aruco 4 5def main(): 6 cap = cv2.VideoCapture(0) 7 # マーカーサイズ 8 marker_length = 0.056 # [m] 9 # マーカーの辞書選択 10 dictionary = aruco.getPredefinedDictionary(aruco.DICT_ARUCO_ORIGINAL) 11 12 camera_matrix = np.load("mtx.npy") 13 distortion_coeff = np.load("dist.npy") 14 15 while True: 16 ret, img = cap.read() 17 corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary) 18 # 可視化 19 aruco.drawDetectedMarkers(img, corners, ids, (0,255,255)) 20 21 if len(corners) > 0: 22 # マーカーごとに処理 23 for i, corner in enumerate(corners): 24 # rvec -> rotation vector, tvec -> translation vector 25 rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corner, marker_length, camera_matrix, distortion_coeff) 26 27 # < rodoriguesからeuluerへの変換 > 28 29 # 不要なaxisを除去 30 tvec = np.squeeze(tvec) 31 rvec = np.squeeze(rvec) 32 # 回転ベクトルからrodoriguesへ変換 33 rvec_matrix = cv2.Rodrigues(rvec) 34 rvec_matrix = rvec_matrix[0] # rodoriguesから抜き出し 35 # 並進ベクトルの転置 36 transpose_tvec = tvec[np.newaxis, :].T 37 # 合成 38 proj_matrix = np.hstack((rvec_matrix, transpose_tvec)) 39 # オイラー角への変換 40 euler_angle = cv2.decomposeProjectionMatrix(proj_matrix)[6] # [deg] 41 42 print("x : " + str(tvec[0])) 43 print("y : " + str(tvec[1])) 44 print("z : " + str(tvec[2])) 45 print("roll : " + str(euler_angle[0])) 46 print("pitch: " + str(euler_angle[1])) 47 print("yaw : " + str(euler_angle[2])) 48 49 # 可視化 50 draw_pole_length = marker_length/2 # 現実での長さ[m] 51 aruco.drawAxis(img, camera_matrix, distortion_coeff, rvec, tvec, draw_pole_length) 52 53 cv2.imshow('drawDetectedMarkers', img) 54 if cv2.waitKey(10) & 0xFF == ord('q'): 55 break 56 57 cv2.destroyAllWindows() 58 59if __name__ == '__main__': 60 main()
回答1件
あなたの回答
tips
プレビュー