計算機視覺之單應性矩陣求解原理及其程式碼實現
阿新 • • 發佈:2018-12-15
關於原理部分,建議大家參考
寫的都很好了
關於求解式子:Ah = 0
使用最小二乘svd分解
最後附上程式碼:
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import cv2 if __name__ == '__main__': image1 = cv2.imread('image1.jpg') image2 = cv2.imread('image2.jpg') image1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) image2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) w = 9 h = 6 number_of_points = 4 ret1,corners1 = cv2.findChessboardCorners(image1,(w,h),None) ret2,corners2 = cv2.findChessboardCorners(image2,(w,h),None) one = np.ones((54,1,1)) corners1 = np.concatenate((corners1,one),axis=2)[0:number_of_points] corners2 = np.concatenate((corners2,one),axis=2)[0:number_of_points] n = corners1.shape[0] if ret1 and ret2: #homography, status = cv2.findHomography(corners1,corners2) A = np.zeros((2*n,9)) for i in range(0,2*n-1,2): A[i] = [-corners1[i/2][0][0],-corners1[i/2][0][1],-1, 0, 0, 0, corners1[i/2][0][0]*corners2[i/2][0][0], corners1[i/2][0][1]*corners2[i/2][0][0], corners2[i/2][0][0] ] for i in range(1,2*n,2): A[i] = [0,0,0, -corners1[i/2][0][0],-corners1[i/2][0][1],-1, corners1[i/2][0][0] * corners2[i/2][0][1], corners1[i/2][0][1] * corners2[i/2][0][1], corners2[i/2][0][1] ] U,S,V = np.linalg.svd(A) h = V.T[:,8] H = np.reshape(h,(3,3)) H = H / H[2,2] print H