1. 程式人生 > >計算機視覺之單應性矩陣求解原理及其程式碼實現

計算機視覺之單應性矩陣求解原理及其程式碼實現

關於原理部分,建議大家參考

寫的都很好了

關於求解式子: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















Reference: