[透视变换]象棋棋盘矫正Python&OpenCV

import cv2
import numpy as np
import glob
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# print(cv2.TERM_CRITERIA_EPS,'',cv2.TERM_CRITERIA_MAX_ITER)

#w h分别是棋盘格模板长边和短边规格(角点个数)
w = 11
h = 8

imgpoints = [] # 在图像平面的二维点

img = cv2.imread('D:\\ML\\Project_python\\zjk\\qi\\WIN_20191007_10_39_33_Pro.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (w,h))
# 如果找到足够点对,将其存储起来
corners3 = np.array([])
if ret == True:
    #精确找到角点坐标
    corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
    corners3 = np.array([corners[0],corners[10],corners[77],corners[87]])
    # 将角点在图像上显示
    cv2.drawChessboardCorners(img, (2,2), corners3, ret)
    print(corners3)
    # cv2.imshow('findCorners',img)
    # cv2.waitKey()
# cv2.destroyAllWindows()

# print('四个点的坐标是:\n',corners3)
point = np.reshape(corners3,(4,2))
print(point)

dst = np.array([[200, 200],
                [400, 200],
                [200, 400],
                [400, 400]], dtype = "float32")
M = cv2.getPerspectiveTransform(point, dst)
print('变换矩阵是', M)
warped = cv2.warpPerspective(img, M, (1000, 1000))

img = cv2.resize(img,(400,400))
cv2.imshow('img',img)
cv2.imshow('fin',warped)
cv2.waitKey()
cv2.destroyAllWindows()

[透视变换]象棋棋盘矫正Python&OpenCV_第1张图片

完整源码:

[透视变换][Python][OpenCV]象棋棋盘矫正 (mianbaoduo.com)

透视变换是中心投影的射影变换,在用非齐次射影坐标表达时是平面的分式线性变换。

透视变换常用于,例如在移动机器人视觉导航研究中,由于摄像机与地面之间有一倾斜角,而不是直接垂直朝下(正投影),有时希望将图象校正成正投影的形式,就需要利用透视变换。

把空间坐标系中的三维物体或对象转变为二维图像表示的过程称为投影变换。根据视点(投影中心)与投影平面之间距离的不同,投影可分为平行投影和透视投影,透视投影即透视变换。平行投影的视点(投影中心)与投影平面之间的距离为无穷大,而对透视投影(变换),此距离是有限的。透视投影具有透视缩小效应的特点,即三维物体或对象透视投影的大小与形体到视点(投影中心)的距离成反比。例如,等长的两直线段都平行于投影面。但离投影中心近的线段透视投影大,而离投影中心远的线段透视投影小。该效应所产生的视觉效果与人的视觉系统类似。与平行投影相比,透视投影的深度感更强,看上去更真实,但透视投影图不能真实地反映物体的精确尺寸和形状。

对于透视投影,一束平行于投影面的平行线的投影可保持平行,而不平行于投影面的平行线的投影会聚集到一个点,该点称为灭点(Vanishing Point)。可将灭点看作是无限远处一点在投影面上的投影。透视投影的灭点可以有无限多个,不同方向的平行线在投影面上就能形成不同的灭点,坐标轴方向的平行线在投影面上形成的灭点又称作主灭点。透视投影按主灭点的个数可分为一点透视、二点透视和三点透视。

以一点透视为例。一点透视只有一个主灭点,即投影面与一个坐标轴正交.与另外两个坐标轴平行。进行一点透视投影变换,要很好地考虑图面布局,以避免三维形体或对象的平面域或直线积聚成点而影响直观性。具体地说,就是要考虑下列几点:①三维形体或对象与画面的相对位置;②视距,即视点(投影中心)与投影面的距

离;③视点的高度。 [1]  [2] 

透视变换同样是一种改变对象尺寸和形状的操作,一个平面图形经透视变换后可产生立体效果。以矩形为例,错切变换只移动同一条边上的两个顶点,且这两个顶点的移动方向相同,对边的两个顶点保持不动。但是,透视变换可能要移动矩形的全部顶点,且同一边上两个顶点的移动方向相反。

事实上,在对象作透视变换时,其限制框的四个角点不一定非要限制在它们的边长方向,四个角点也可发生移动,从而获得更复杂的透视变换效果。 [3] 

线性变换的最一般形式是透视变换。其主要特点是,直线经变换后仍然是直线,但平行的直线经变换后却可能相交。对于断层成象图象数据的处理透视变换用处不是很大。透视变换主要用在如下几方面:

(1)点源与物体作用,在一个平面上产生投影图象的放射成象。

(2)对于照片,采集光线全部通过透镜的焦点的情况。 [4] 

相关参考

(56条消息) (十四)透视变换_淡定的炮仗的博客-CSDN博客_透视变换

(56条消息) 【图像处理】透视变换 Perspective Transformation_xiaowei_cqu的博客-CSDN博客_透视变换

(56条消息) 透视变换原理实例代码详解_修炼之路的博客-CSDN博客_透视变换原理

(56条消息) 算法笔记 : 透视变换(透射变换)_巽笙大仙的博客-CSDN博客_透射变换

(56条消息) 透视变换(perspective transformation)_码灵薯的博客-CSDN博客_透视变换公式

你可能感兴趣的:(OpenCV,opencv,python,计算机视觉)