【机器视觉】——单⽬相机标定(张正友标定)、畸变矫正、重投影误差计算、pnp问题求解、实际。。。
⽬录
⼀、相机标定
相机标定主要是为了计算相机的内参,内参含焦距f、主点像素坐标(u0,v0)、相机坐标在像素坐标上的缩放因⼦(dx,dy),计算得到内参后就可以利⽤内参进⾏尺⼨测量、像素坐标和世界坐标转换、距离测量等。
内参不变,外参对不同拍摄的图像都不⼀样
1、涉及的坐标系
相机标定过程中涉及4个坐标系,如下图所⽰:
转换关系如下:
具体各个坐标系之间的转换参考:
2、张正友标定法
常见的标定⽅法很多,经典的为张正友标定法,论⽂参考:《Flexible Camera Calibration By Viewing a Plane From Unknown Orientations》
求解步骤为:
1)绘制⿊⽩棋盘格;
import cv2 as  cv
import numpy as np
width = 10
height = 10
qipan_cell = 100
width_pix = (width + 1) * qipan_cell + qipan_cell  # add extra  qipan_cell  for reserve blank height_pix = (height + 1) * qipan_cell + qipan_cell
# white = (255,255,255)
# black =  (0,0,0)
image = np.zeros((height_pix, width_pix, 3), dtype=np.uint8)
image.fill(255)
# 创建显⽰窗⼝
win_name = "qipan"
cv.namedWindow("qipan", cv.WINDOW_AUTOSIZE)
cv.imshow(win_name, image)
color = (255, 255, 255)
y0 = 0
fill_color = 0
for j in range(0, height + 1):
y = j * qipan_cell
for i in range(0, width + 1):
# rint(i)
x0 = i * qipan_cell
y0 = y
rect_start = (x0, y0)
x1 = x0 + qipan_cell
y1 = y0 + qipan_cell
rect_end = (x1, y1)
print(x0, y0, x1, y1, fill_color)
# print(fill_color)
image[y0:y1, x0:x1] = fill_color
if width % 2:
if i != width:
fill_color = (0 if (fill_color == 255) else 255)
else:
if i != width + 1:
fill_color = (0 if (fill_color == 255) else 255)
# image[0:20,0:20] = 0
# image[40:60,0:20] = 0
cv.imwrite("qipan_%d_W_%d_H.jpg" % (width, height), image)
cv.imshow(win_name, image)
rectangle函数opencvcv.waitKey()
2)拍摄15-30张不同位姿的棋盘格图像;
3)设置假想模板
该模板假设在成像平⾯上,世界坐标x-y平⾯设置在该模板上,x,y轴分别和图像两条边平⾏,z轴⽅向坐标为0,根据棋盘格内⾓点的个数将图像划分,⽹格点的坐标作为世界坐标patters
这是⼀种⽅法,还有就是直接⼀个像素格⼦对应⼀个⿊⽩棋盘格⼦
注:此时世界坐标系的单位为像素,⽽不是mm
4)抓取图像棋盘格⾓点坐标,作为像素坐标系上的坐标。
cv2.drawChessboardCorners(img, (col, row), corners2, ret)
上图将⾓点绘制出来

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。