以下の方法を使用して成功しましたが、以下の方法のような近似ではなく、正確な回転角度を提供するためのより時間効率の良い代替手段が他にあるはずです。フィードバックをお待ちしております。
この手順は、次の手順に基づいています。
- テンプレート イメージをインポートします (例: 方向が 0º の場合)。
- 同じ画像の個別の配列を作成しますが、それぞれが最も近いものと比較して 360º/rotatesteps で回転します (つまり、30 から 50 の回転した画像)
# python 3 / opencv 3
# Settings:
rotate_steps = 36
step_angle = round((360/rotate_steps), 0) # one image at each 10º
# Rotation function
def rotate_image(image, angle):
# ../..
return rotated_image
# Importing a sample image and creating a n-dimension array where to store images in:
image = cv2.imread('sample_image.png')
image_Array = np.zeros((image.shape[1], image.shape[0], 1), dtype='uint8')
# Rotating sample image and saving it into the array as a new channel:
while rotation_angle <= (360 - step_angle):
angles.append(rotation_angle)
image_array[:,:,channel] = rotate_image(image.copy(), rotation_angle)
# ../..
だから私は得る:
角度 = [0, 10.0, 20.0, 30.0, .../..., 340.0, 350.0]
image_array = [image_1, image_2, image_3, ...] ここで、image_i は numpy 配列の別のチャネルです。
- 以前に回転して配列に保存したサンプル画像と比較して、角度を見ている「test_image」を取得します
- 一連の cv2.matchTemplate() と cv2.minMaxLoc() に従って、回転した画像の角度が「test_image」に最もよく一致するものを見つけます。
for i in range(len(angles)):
res = cv2.matchTemplate(test_image, image_array[:,:,i], cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# ../..
- そして最後に、サンプル画像に一致する離散化された角度を、「max_val」の最高値を持つテンプレート画像に対応するものとして選択します。
これは、結果の精度が、回転したテンプレート画像の量に応じてより高い/より低い精度の近似に基づいていること、および回転したテンプレートの数が増加したときにかかる立ち上がり時間に基づいていることを念頭に置いてうまく機能することが証明されています...
画像の一種の「方向ベクトル」を生成するなど、さまざまな方法に基づいた他のよりスマートな代替手段があるに違いないと確信しており、結果の数値だけをサンプルテンプレートから以前に知られている数値と比較します...
あなたのフィードバックは非常に高く評価されます。