第六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:摄像头标定_opencv python 标定(1)

# 将彩色图像转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# 查找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)

# 如果成功找到角点,则添加到数据中
if ret:
    obj_points.append(np.zeros((np.prod(pattern_size), 3), np.float32))
    obj_points[-1][:, :2] = np.indices(pattern_size).T.reshape(-1, 2)
    img_points.append(corners)

    # 绘制角点并显示图像
    cv2.drawChessboardCorners(frame, pattern_size, corners, ret)
    cv2.imshow('Chessboard', frame)

    # 延迟一段时间,以便观察图像
    cv2.waitKey(500)

    # 递增已采集的图像数量
    image_count += 1

关闭摄像头

cap.release()
cv2.destroyAllWindows()

进行摄像头内外参数标定

ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)

打印结果

print(“相机内参数矩阵:\n”, camera_matrix)
print(“畸变系数:\n”, dist_coeffs)


在上述示例代码中,首先通过`cv2.VideoCapture()`函数打开摄像头,并设置摄像头的编号。然后进入循环,采集多个棋盘格图像并进行自动角点检测。


在每次循环中,使用`cap.read()`函数读取摄像头图像,并将彩色图像转换为灰度图像。然后使用`cv2.findChessboardCorners()`函数进行棋盘格角点的自动检测。如果成功找到角点,则将其添加到数据中,并绘制在图像上显示出来。


在采集足够数量的图像后,关闭摄像头,并使用`cv2.calibrateCamera()`函数进行摄像头内外参数标定。最后,打印出相机的内参数矩阵和畸变系数。


通过以上扩展示例代码,可以实现采集多个棋盘格图像并进行自动角点检测的功能,以提高摄像头内外参数标定的效率和准确性。在实际应用中,可以根据具体需求进行调整和优化,如调整棋盘格的尺寸、调整采集图像的数量等。


### 四、立体视觉标定示例代码和扩展


![在这里插入图片描述](https://img-blog.csdnimg.cn/e77ec52603f74439a7ee016ce38cfd94.jpg)以下是一个使用OpenCV进行立体视觉标定的示例代码:



import numpy as np
import cv2

定义棋盘格的尺寸

pattern_size = (9, 6) # 棋盘格内角点数量

存储左右相机图像的角点坐标

left_img_points = [] # 左相机图像坐标系
right_img_points = [] # 右相机图像坐标系

设置摄像头编号

left_camera_id = 0
right_camera_id = 1

打开左右相机

left_cap = cv2.VideoCapture(left_camera_id)
right_cap = cv2.VideoCapture(right_camera_id)

采集多个棋盘格图像并进行角点检测

num_images = 10 # 采集图像的数量
image_count = 0 # 当前已采集的图像数量

while image_count < num_images:
# 读取左右相机图像
ret1, left_frame = left_cap.read()
ret2, right_frame = right_cap.read()

# 将彩色图像转换为灰度图像
left_gray = cv2.cvtColor(left_frame, cv2.COLOR_BGR2GRAY)
right_gray = cv2.cvtColor(right_frame, cv2.COLOR_BGR2GRAY)

# 查找棋盘格角点
ret1, left_corners = cv2.findChessboardCorners(left_gray, pattern_size, None)
ret2, right_corners = cv2.findChessboardCorners(right_gray, pattern_size, None)

# 如果成功找到角点,则添加到数据中
if ret1 and ret2:
    left_img_points.append(left_corners)
    right_img_points.append(right_corners)

    # 绘制角点并显示图像
    cv2.drawChessboardCorners(left_frame, pattern_size, left_corners, ret1)
    cv2.imshow('Left Chessboard', left_frame)
    cv2.drawChessboardCorners(right_frame, pattern_size, right_corners, ret2)
    cv2.imshow('Right Chessboard', right_frame)

    # 延迟一段时间,以便观察图像
    cv2.waitKey(500)

    # 递增已采集的图像数量
    image_count += 1

关闭左右相机

left_cap.release()
right_cap.release()
cv2.destroyAllWindows()

进行立体视觉标定

ret, left_camera_matrix, left_dist_coeffs, right_camera_matrix, right_dist_coeffs, R, T, E, F = cv2.stereoCalibrate(
objectPoints=None,
imagePoints1=left_img_points,
imagePoints2=right_img_points,
imageSize=left_gray.shape[::-1],
cameraMatrix1=None,
distCoeffs1=None,
cameraMatrix2=None,
distCoeffs2=None
)

打印结果

print(“左相机内参数矩阵:\n”, left_camera_matrix)
print(“左相机畸变系数:\n”, left_dist_coeffs)
print(“右相机内参数矩阵:\n”, right_camera_matrix)
print(“右相机畸变系数:\n”, right_dist_coeffs)
print(“旋转矩阵:\n”, R)
print(“平移向量:\n”, T)
print(“本征矩阵:\n”, E)
print(“基础矩阵:\n”, F)


在上述示例代码中,首先通过`cv2.VideoCapture()`函数打开左右相机,并设置相机的编号。然后进入循环,采集多个棋盘格图像并进行角点检测。


在每次循环中,使用`cap.read()`函数读取左右相机图像,并将彩色图像转换为灰度图像。然后使用`cv2.findChessboardCorners()`函数进行棋盘格角点的检测。如果成功找到角点,则将其添加到数据中,并绘制在图像上显示出来。


在采集足够数量的图像后,关闭左右相机,并使用`cv2.stereoCalibrate()`函数进行立体视觉标定。该函数接受左右相机图像的角点坐标、图像尺寸等作为输入,并返回左右相机的内参数矩阵(camera\_matrix)、畸变系数(dist\_coeffs)、旋转矩阵(R)、平移向量(T)、本征矩阵(E)和基础矩阵(F)。


通过打印结果,可以查看左右相机的内参数矩阵、畸变系数以及立体相机系统的旋转矩阵、平移向量等参数。


希望以上示例能帮助你了解如何使用OpenCV进行立体视觉标定。请注意根据实际情况和需求进行调整和优化。  
 以下是一个扩展示例代码,使用OpenCV进行立体视觉标定时采集多种姿态的棋盘格图像,并进行亚像素级别的角点检测:



import numpy as np
import cv2

定义棋盘格的尺寸

pattern_size = (9, 6) # 棋盘格内角点数量

存储左右相机图像的角点坐标

left_img_points = [] # 左相机图像坐标系
right_img_points = [] # 右相机图像坐标系

设置摄像头编号

left_camera_id = 0
right_camera_id = 1

打开左右相机

left_cap = cv2.VideoCapture(left_camera_id)
right_cap = cv2.VideoCapture(right_camera_id)

采集多种姿态的棋盘格图像并进行角点检测

num_images = 10 # 采集图像的数量
image_count = 0 # 当前已采集的图像数量

while image_count < num_images:
# 读取左右相机图像
ret1, left_frame = left_cap.read()
ret2, right_frame = right_cap.read()

# 将彩色图像转换为灰度图像
left_gray = cv2.cvtColor(left_frame, cv2.COLOR_BGR2GRAY)
right_gray = cv2.cvtColor(right_frame, cv2.COLOR_BGR2GRAY)

# 查找棋盘格角点
ret1, left_corners = cv2.findChessboardCorners(left_gray, pattern_size, None)
ret2, right_corners = cv2.findChessboardCorners(right_gray, pattern_size, None)

# 如果成功找到角点,则添加到数据中
if ret1 and ret2:
    # 亚像素级别的角点精确定位
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    cv2.cornerSubPix(left_gray, left_corners, (11, 11), (-1, -1), criteria)
    cv2.cornerSubPix(right_gray, right_corners, (11, 11), (-1, -1), criteria)

    left_img_points.append(left_corners)
    right_img_points.append(right_corners)

    # 绘制角点并显示图像
    cv2.drawChessboardCorners(left_frame, pattern_size, left_corners, ret1)
    cv2.imshow('Left Chessboard', left_frame)
    cv2.drawChessboardCorners(right_frame, pattern_size, right_corners, ret2)
    cv2.imshow('Right Chessboard', right_frame)

    # 延迟一段时间,以便观察图像
    cv2.waitKey(500)

    # 递增已采集的图像数量
    image_count += 1

关闭左右相机

left_cap.release()
right_cap.release()
cv2.destroyAllWindows()

进行立体视觉标定

ret, left_camera_matrix, left_dist_coeffs, right_camera_matrix, right_dist_coeffs, R, T, E, F = cv2.stereoCalibrate(
objectPoints=None,
imagePoints1=left_img_points,
imagePoints2=right_img_points,
imageSize=left_gray.shape[::-1],
cameraMatrix1=None,
distCoeffs1=None,
cameraMatrix2=None,
distCoeffs2=None
)

打印结果

print(“左相机内参数矩阵:\n”, left_camera_matrix)
print(“左相机畸变系数:\n”, left_dist_coeffs)
print(“右相机内参数矩阵:\n”, right_camera_matrix)
print(“右相机畸变系数:\n”, right_dist_coeffs)
print(“旋转矩阵:\n”, R)
print(“平移向量:\n”, T)
print(“本征矩阵:\n”, E)
print(“基础矩阵:\n”, F)


在上述示例代码中,除了采集多种姿态的棋盘格图像,还使用了`cv2.cornerSubPix()`函数对粗略检测到的角点进行亚像素级别的精确定位。通过设置适当的参数,可以提高角点位置的精确度。


通过以上扩展示例代码,可以实现采集多种姿态的棋盘格图像并进行亚像素级别的角点检测,以提高立体视觉标定的效果。在实际应用中,可以根据具体需求进行调整和优化,如调整棋盘格的尺寸、调整采集图像的数量、调整亚像素精确度的参数等。


### 五、归纳总结


![在这里插入图片描述](https://img-blog.csdnimg.cn/afc4ab9e255d48acb77f0ea9d52f8936.jpg)OpenCV摄像头标定是指通过采集一系列棋盘格图像,并利用这些图像的角点信息来计算摄像头的内外参数,从而实现图像畸变校正和立体视觉等应用。以下是OpenCV摄像头标定的关键步骤和要点:


做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。



别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。

* * *



**(1)Python所有方向的学习路线(新版)**

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



最近我才对这些路线做了一下新的更新,知识体系更全面了。



![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc093dcfa1f476694c574db1242c05b.png)



**(2)Python学习视频**



包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。



![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)



**(3)100多个练手项目**

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。



![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)



**(4)200多本电子书**  

  

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。



基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。



**(5)Python知识点汇总**

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。



![在这里插入图片描述](https://img-blog.csdnimg.cn/c741a91b05a542ba9dc8abf2f2f4b1af.png)



**(6)其他资料**



还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。



![在这里插入图片描述](https://img-blog.csdnimg.cn/9fa77af248b84885a6ec779b2ead064d.png)

**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值