チェスボードの座標の間隔による座標統合について
まず、物体の各辺を知るためには、チェスボードの頂点間の分布を確認する必要があります。
そこで、チェスボード全ての点間距離を求めるのではなく、2辺を切り出して点間距離を計算します。
以下に、csvを読み取って、その座標から頂点間距離を計算するプログラムを示します。
python import cv2 import matplotlib.pyplot as plt import numpy as np import csv import math def distance(value): return math.sqrt(int(value[0])*int(value[0])+int(value[1])*int(value[1])) csv_name = "IMG_7112_corner_dot.csv" corner_dot = np.loadtxt('csv/'+csv_name, delimiter=',', dtype='float') print(corner_dot) extract_col = [12,13,14,15,16,17] extract_row = [12,6,0] distance_col = [] distance_row = [] for i in range(len(extract_col)-1): dist = distance(corner_dot[extract_col[i+1]]-corner_dot[extract_col[i]]) distance_col.append(dist) print(distance_col) for i in range(len(extract_row)-1): dist = distance(corner_dot[extract_row[i+1]]-corner_dot[extract_row[i]]) distance_row.append(dist) print(distance_row)
次に、簡易に計算するために傾きと奥行き情報を無視し、手作業で各家電の辺と最も近いチェスボートの辺を比較して線形的に家電の辺をExcelを用いて推定しました。
推定方法は下記です。
- 高さ,幅に最も近いチェスボードの長さ(pixel)と選択した家電の幅の長さ(pixel)を取得
- チェスボードの長さは実際の長さ(mm)と対応しているため、(家電の幅の長さ) * (チェスボードの実際の長さ) / (チェスボードの長さ)のように算出
算出の結果、幅が630 mm、高さが1187 mmで、幅と高さの誤差の比率はそれぞれ7.9 %と35 %でした。
これに奥行きの情報を付与することにより大きな改善が見込まれます。
奥行きの算出
奥行きを算出したいところですが、対応するチェスボートの辺はありません。
そこで、チェスボートの斜めの点間距離群をもとに算出します。
算出方法は下記です。
- 奥行きと最も近い辺をチェスボードから選択し、その長さ(pixel)を算出
- 幅と奥行がほぼ同一なため、そこから比率を求めて1と同じように算出
算出の結果、奥行きは7.7 %の誤差で、総面積の誤差率は39 %となってしまいました。
これは前回のBBからの体積と同程度の誤差率です。
基準物体の既知長殻の奥行きの歪みの考慮をもっと厳密に行わなければならないと考えられますので、別の手法を検討しなければなりません。
次回の予定
これまでの試行錯誤から、次に検証する方法としては、チェスボードと立方体を組み合わせが良いのではないか考えられます。 次回はこの立方体チェスボードを作成して検証を行います。