今回から、チェスボードを基準とした簡易体積算出アルゴリズムを実装していきます。
実装にあたっての戦略
前回は幾何学的算出の実現可能性について検討しました。
実装にあたり、流れを整理しましょう。
まず、チェスボードの印刷と撮影を行い、検証用データを収集します。
次に、その画像からOpenCVを用いてチェスボードの角を認識させ、その座標を取得します。
そして、家電の各頂点をマウスで7点マークしてその座標を取得します。
すると、チェスボードを貼り付けた面の面積を算出することができます。
最後に、その1辺と頂点を共有している辺を単純な比率で計算すると3辺の長さを算出でき、面積を求めることができるため、このような流れで実装していきたいと思います。
実践
前項で立てた戦略を基に実装していきます。
まずはチェスボードをA4用紙に印刷し、実家にある4つの家電と大型本1冊に貼って撮影しました。
これらでチェスボードが認識されるかを確かめたところ、認識が良い時はチェスボードの3行6列、認識が悪い時は3行3列で認識させた結果、全ての画像で認識ができました。
実装したコードは下記です。
detect_corner.py from pathlib import Path import cv2 import matplotlib.pyplot as plt import numpy as np import csv #画像ファイル名 img_name = "IMG_7124.jpg" img = cv2.imread(img_name) # チェスボードの設定 cols = 6 # 列方向の交点数 rows = 3 # 行方向の交点数 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(img, (cols, rows)) if ret: # すべての交点の検出に成功 print("Success!!") # 検出結果を描画する。 dst = cv2.drawChessboardCorners(img.copy(), (cols, rows), corners, ret) cv2.imwrite(img_name[0:8]+"_ans.jpg",cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)) size = corners.shape corner_a = np.reshape(corners,[size[0],size[2]]) print(corner_a) with open(img_name[0:8]+'_corner_dot.csv', 'w') as f: writer = csv.writer(f) writer.writerows(corner_a) plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)) plt.show() else: print("Failed to detect chessboard corners.")
この後は家電の頂点をマークしてその座標を取得していきますが、
マウスクリックによる座標の取得はできたものの表示サイズが大きすぎるため、縮小する必要がありました。
また、それに伴ってマウスの座標も変化するため、デバッグが必要です。
次回は、マウスクリックからの座標取得のデバッグ及び、チェスボードの座標の間隔による座標統合を行います。