基于matlab的单目相机标定
链接:
单目相机标定(使用Matlab)
用Matlab对单目相机参数的标定步骤(保姆级教程)
1.准备代码
调用摄像头代码(用于测试摄像头是否可用):
#https://blog.csdn.net/qq_37759113/article/details/124366513
import cv2
def read_usb_capture():
# 选择摄像头的编号
camera = cv2.VideoCapture(0)
# # 设置分辨率
#camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
#camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 960)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1200)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 900)
# 添加这句是可以用鼠标拖动弹出的窗体
cv2.namedWindow('real_img', cv2.WINDOW_NORMAL)
while(camera.isOpened()):
# 读取摄像头的画面
ret, frame = camera.read()
# 真实图
cv2.imshow('real_img', frame)
# 按下'q'就退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放画面
camera.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
read_usb_capture()
使用摄像头拍照代码:
#https://www.jb51.net/article/256780.htm
import cv2
import sys
#引入库
cap = cv2.VideoCapture(0) #读取笔记本内置摄像头或者0号摄像头
i = 0
while True:
ret, frame = cap.read()
if (ret):
cv2.namedWindow("Video01",0) #创建一个名为Video01的窗口,0表示窗口大小可调
#cv2.resizeWindow("Video01",640,480) ##创建一个名为Video01的窗口,设置窗口大小为 1920 * 1080 与上一个设置的 0 有冲突
#cv2.resizeWindow("Video01",640,330)
cv2.imshow("Video01", frame)
#等待按键按下
c = cv2.waitKey(1) & 0xff
#若按下w则保存一张照片
if c ==ord("w"):
cv2.imwrite("C:/Users/wuxiao/Desktop/test/%d.bmp" %i, frame) #自己设置拍摄的照片的存储位置
print("Save images %d succeed!" %i)
i+=1
#若按下Q键,则退出循环
if c == ord("q"):
break
#随时准备按q退出
cap.release()
#关掉所有窗口
cv2.destroyAllWindows()
图像剪裁代码(用于双目相机):
#https://www.jb51.net/article/256780.htm
import numpy as np
import cv2
#img1 = cv2.imread(r"/Users/inbc/Desktop/zuo/Left1.bmp")
#img2 = cv2.imread(r"/Users/inbc/Desktop/you/Right1.bmp")
for i in range(0,31) :
#imgT = cv2.imdecode(np.fromfile('./images/%d.bmp' %i ,dtype=np.uint8), -1)
imgT = cv2.imdecode(np.fromfile('C:/Users/wuxiao/Desktop/stereo/%d.bmp' %i ,dtype=np.uint8), -1) #读取拍摄的左右双目照片
# cv2.imshow("zuo", img1[300:1200, 500:2000])
# cv2.imshow("you", img2[300:1200, 500:2000])
# cv2.waitKey(0)
#设置左右照片的存储位置
cv2.imwrite("C:/Users/wuxiao/Desktop/stereo/zuo/reLeft%d.bmp" %i ,imgT[0:480, 0:320] )#imgL的第一个参数是图片高度像素范围,第二个参数是图片宽度的像素范围
cv2.imwrite("C:/Users/wuxiao/Desktop/stereo/you/reRight%d.bmp" %i ,imgT[0:480, 320:640] )
print("Resize images%d Fnished!" %i)
print("Fnished All!!!")
2.具体操作
链接:
单目相机标定(使用Matlab)
用Matlab对单目相机参数的标定步骤(保姆级教程)
补充:
2.1. 删除误差过大的图片的操作
如右上角所示,单张图像误差会有较大的,点击柱状图中误差较大的一项,在最左边会蓝色显示该图片,右键点击“Remove and Recalibrate”即可删去该图(即计算内参时不考虑该图)
2.2. 内参中需要关注的三组参数
直接在命令行内输入:
cameraParams.IntrinsicMatrix%相机内参
cameraParams.RadialDistortion%相机径向畸变参数
cameraParams.TangentialDistortion%相机切向畸变参数
注意
matlab计算的内参矩阵与opencv的内参数据互为转置关系