计算机视觉基础 相机模型

相机模型

相机与图像之间的关系
在这里插入图片描述
相机成像的大致流程
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

世界坐标系到摄像机坐标系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

摄像机坐标系到图像物理坐标系

在这里插入图片描述
主要是根据相似三角形列出等式。

图像物理坐标系到图像像素坐标系

在这里插入图片描述

摄像机坐标系到图像像素坐标系

在这里插入图片描述

世界坐标系到图像像素坐标系

在这里插入图片描述

相机成像原理

在这里插入图片描述

镜头畸变

(简单了解)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

透视变换

定义

透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解释:我们的目标是要求出warpMatrix矩阵,所以要找到现图像和将要变化的图像的顶点坐标。因为有8个未知数(3X3的矩阵总共9个参数,我们将A33置为1),所以要找到原坐标和现坐标各4对。带入便可求出warpMatrix矩阵

代码展示

import cv2
import numpy as np

img = cv2.imread('lenna.png')

result3 = img.copy()

'''
注意这里src和dst的输入并不是图像,而是图像对应的顶点坐标。
'''
src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
dst = np.float32([[0, 0], [300, 0], [0, 400], [300, 400]])
print(img.shape)
# 生成透视变换矩阵;进行透视变换
m = cv2.getPerspectiveTransform(src, dst)
print("warpMatrix:")
print(m)
result = cv2.warpPerspective(result3, m, (300, 400))
cv2.imshow("src", img)
cv2.imshow("result", result)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述

import numpy as np
  
def WarpPerspectiveMatrix(src, dst):
    assert src.shape[0] == dst.shape[0] and src.shape[0] >= 4
     
    nums = src.shape[0]
    A = np.zeros((2*nums, 8)) # A*warpMatrix=B
    B = np.zeros((2*nums, 1))
    for i in range(0, nums):
        A_i = src[i,:]
        B_i = dst[i,:]
        A[2*i, :] = [A_i[0], A_i[1], 1, 0, 0, 0,
                       -A_i[0]*B_i[0], -A_i[1]*B_i[0]]
        B[2*i] = B_i[0]
         
        A[2*i+1, :] = [0, 0, 0, A_i[0], A_i[1], 1,
                       -A_i[0]*B_i[1], -A_i[1]*B_i[1]]
        B[2*i+1] = B_i[1]
  
    A = np.mat(A)
    #用A.I求出A的逆矩阵,然后与B相乘,求出warpMatrix
    warpMatrix = A.I * B #求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32
     
    #之后为结果的后处理
    warpMatrix = np.array(warpMatrix).T[0]
    warpMatrix = np.insert(warpMatrix, warpMatrix.shape[0], values=1.0, axis=0) #插入a_33 = 1
    warpMatrix = warpMatrix.reshape((3, 3))
    return warpMatrix
  
if __name__ == '__main__':
    print('warpMatrix')
    src = [[10.0, 457.0], [395.0, 291.0], [624.0, 291.0], [1000.0, 457.0]]
    src = np.array(src)
     
    dst = [[46.0, 920.0], [46.0, 100.0], [600.0, 100.0], [600.0, 920.0]]
    dst = np.array(dst)
     
    warpMatrix = WarpPerspectiveMatrix(src, dst)
    print(warpMatrix)

应用

在这里插入图片描述
透视变换可以将左图栏杆弯曲的部分投影到新的平面,达到呈直线的效果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值