テンプレートマッチングを使用して2つの画像を縫い合わせようとしていますcv2.getAffineTransform()
に渡す3点のセットを見つけてcv2.warpAffine()
に渡して画像を整列させます。warpAffineを使用して切り取らずにステッチ画像を表示する
私の画像に参加すると、私のアフィニティ画像の大部分は表示されません。私は点を選択するためにさまざまなテクニックを使って試しました、順序や引数などを変更しましたが、アフィン画像の薄いスライダーを表示することしかできません。
誰かが私のアプローチが有効なものかどうかを教えてもらえますか?エラーが発生している可能性がある場所を教えてください。どのような問題が発生する可能性がありますかについてのすべての推測は非常に高く評価されるだろう。前もって感謝します。
これは私が得たfinal resultです。
EDIT:ここでは、元の画像(1、2)と私が使用するコードです。ここ変数trans
array([[ 1.00768049e+00, -3.76690353e-17, -3.13824885e+00],
[ 4.84461775e-03, 1.30769231e+00, 9.61912797e+02]])
そしてここでの結果は、ここでcv2.getAffineTransform
に渡されるポイントであるです:unified_pair1
array([[ 671., 1024.],
[ 15., 979.],
[ 15., 962.]], dtype=float32)
unified_pair2
array([[ 669., 45.],
[ 18., 13.],
[ 18., 0.]], dtype=float32)
import cv2
import numpy as np
def showimage(image, name="No name given"):
cv2.imshow(name, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
return
image_a = cv2.imread('image_a.png')
image_b = cv2.imread('image_b.png')
def get_roi(image):
roi = cv2.selectROI(image) # spacebar to confirm selection
cv2.waitKey(0)
cv2.destroyAllWindows()
crop = image_a[int(roi[1]):int(roi[1]+roi[3]), int(roi[0]):int(roi[0]+roi[2])]
return crop
temp_1 = get_roi(image_a)
temp_2 = get_roi(image_a)
temp_3 = get_roi(image_a)
def find_template(template, search_image_a, search_image_b):
ccnorm_im_a = cv2.matchTemplate(search_image_a, template, cv2.TM_CCORR_NORMED)
template_loc_a = np.where(ccnorm_im_a == ccnorm_im_a.max())
ccnorm_im_b = cv2.matchTemplate(search_image_b, template, cv2.TM_CCORR_NORMED)
template_loc_b = np.where(ccnorm_im_b == ccnorm_im_b.max())
return template_loc_a, template_loc_b
coord_a1, coord_b1 = find_template(temp_1, image_a, image_b)
coord_a2, coord_b2 = find_template(temp_2, image_a, image_b)
coord_a3, coord_b3 = find_template(temp_3, image_a, image_b)
def unnest_list(coords_list):
coords_list = [a[0] for a in coords_list]
return coords_list
coord_a1 = unnest_list(coord_a1)
coord_b1 = unnest_list(coord_b1)
coord_a2 = unnest_list(coord_a2)
coord_b2 = unnest_list(coord_b2)
coord_a3 = unnest_list(coord_a3)
coord_b3 = unnest_list(coord_b3)
def unify_coords(coords1,coords2,coords3):
unified = []
unified.extend([coords1, coords2, coords3])
return unified
# Create a 2 lists containing 3 pairs of coordinates
unified_pair1 = unify_coords(coord_a1, coord_a2, coord_a3)
unified_pair2 = unify_coords(coord_b1, coord_b2, coord_b3)
# Convert elements of lists to numpy arrays with data type float32
unified_pair1 = np.asarray(unified_pair1, dtype=np.float32)
unified_pair2 = np.asarray(unified_pair2, dtype=np.float32)
# Get result of the affine transformation
trans = cv2.getAffineTransform(unified_pair1, unified_pair2)
# Apply the affine transformation to original image
result = cv2.warpAffine(image_a, trans, (image_a.shape[1] + image_b.shape[1], image_a.shape[0]))
result[0:image_b.shape[0], image_b.shape[1]:] = image_b
showimage(result)
cv2.imwrite('result.png', result)
出典:アプローチの助言に基づいてドキュメントからhere、このtutorialこのexampleを受けました。
最後の質問からソリューションを実装しています。提案のために、人々はあなたのコードのすべてを調べる必要がないので、あなたが作成した変換を含め、正しい座標であなたを得るためにその変換を取得しようとするコードだけを表示することができます。私はあなたがすぐに答えを得ることができなければならないので、それが必要かどうかはわかりませんが。主な問題は、チュートリアルでは、左から右に向かっていると仮定しています。シフトするピクセル数は実際には何ピクセルかわかりません。あなたは実際にこれを計算することができます。 –
@AlexanderReynoldsあなたに感謝してくれてありがとう、私はwarpMatrixを生成するために使用された変数が元の質問だけでなく、変換行列 'trans'に追加されたものを追加しました。 'cv2.getAffineTransformation'によって生成された変換行列も画像をシフトすると仮定しました。シフトを計算する方法について知っていますか? – Bprodz
はい、あります。今すぐ答えを書く。 :) –