Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

二個のArUcoマーカーを角として領域を切り取る その2:領域内のマーカー位置を表示

shuzo-kino.hateblo.jp
の続き

実際のところ

まず模擬的な移動マーカーを生成

$ composite -geometry 48x48+270+220 ar12.png target.png target_1.png
$ composite -geometry 48x48+360+260 ar12.png target.png target_2.png
$ composite -geometry 48x48+320+200 ar12.png target.png target_3.png

Python

idでそれぞれ判定し、領域中XYの何%の位置にいるかを出力するという処理

import sys
import cv2
import numpy as np

aruco = cv2.aruco
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)

img_src = cv2.imread(sys.argv[1], 1)

corners, ids, rejectedImgPoints = aruco.detectMarkers( img_src, dictionary )

## マーカーIDから座標情報を変数に格納
for cnt, val in enumerate(ids) :
  buf = int(val)
  if (buf == 2):
    center_one = np.mean(corners[cnt][0],axis=0)
  if (buf == 42):
    center_two = np.mean(corners[cnt][0],axis=0)
  if (buf == 12):
    center_dist = np.mean(corners[cnt][0],axis=0)

#左上のマーカーのXY
cent_one_x = int(center_one[0])
cent_one_y = int(center_one[1])

#右下のマーカーのXY
cent_two_x = int(center_two[0])
cent_two_y = int(center_two[1])

#追跡対象マーカーの重心情報
print( "DIST {}".format(center_dist) )
#領域のサイズ
size_x = cent_two_x - cent_one_x
size_y = cent_two_y - cent_one_y
#追跡対象マーカーが切り抜き範囲で何パーセントあたりにいるか
val_x = (center_dist[0] - cent_one_x) / (size_x)
val_y = (center_dist[1] - cent_one_y) / (size_y)
print(val_x, val_y)

#画像の書き込み
im_new = img_src[cent_one_y:cent_two_y, cent_one_x:cent_two_x, :]

cv2.imwrite("result.png", im_new)

実行結果

$ python3 detectAr.py target_3.png
DIST [343.5 223.5]
0.4124236252545825 0.19978858350951373