双目视觉标定,矫正,深度图(Vs +OpenCV C++ Python实现)

本文介绍了双目视觉相机的标定过程,包括使用OpenCV的张正友法进行标定,提取角点信息,亚像素角点信息,以及相机标定的步骤。详细讲解了相机标定的目的、输入和输出,提供了C++和Python的代码示例,并展示了标定后的图像矫正效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码是最为耐心、最能忍耐和最令人愉快的伙伴,在任何艰难困苦的时刻,它都不会抛弃你(开场白)
长时间不写博客,我总感觉自己没有做事情,最近一直在做目标检测,想结合一下双目视觉,做立体检测,于是就研究了一下双目视觉,参考了很多人的相关博客,在这里,特意表示感谢一下。
使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些?

相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。

相机标定的输入:标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上)。

相机标定的输出:摄像机的内参、外参系数。

这三个基础的问题就决定了使用Opencv实现张正友法标定相机的标定流程、标定结果评价以及使用标定结果矫正原始图像的完整流程:

  1. 准备标定图片

  2. 对每一张标定图片,提取角点信息
    3.对每一张标定图片,进一步提取亚像素角点信息

  3. 在棋盘标定图上绘制找到的内角点(非必须,仅为了显示)

  4. 相机标定

  5. 对标定结果进行评价

  6. 查看标定效果——利用标定结果对棋盘图进行矫正

  7. 准备标定图片

标定图片需要使用标定板在不同位置、不同角度、不同姿态下拍摄,最少需要3张,以10~20张为宜。标定板需要是黑白

C++中使用OpenCV进行相机标定和图片矫正是一个常见的计算机视觉任务。相机标定的主要目的是确定相机的内参和外参,从而矫正由于镜头畸变导致的图像失真。以下是一个基本的步骤和代码示例,帮助你理解如何使用OpenCV进行相机标定和图片矫正。 ### 步骤: 1. **准备标定板**:通常使用棋盘格作为标定板。确保标定板在不同的位置和角度下被拍摄多张图片。 2. **检测棋盘格角点**:使用OpenCV提供的函数检测棋盘格的角点。 3. **相机标定**:使用检测到的角点进行相机标定,计算相机的内参和畸变系数。 4. **图片矫正**:使用标定结果对图片进行矫正,去除畸变。 ### 代码示例: ```cpp #include <opencv2/opencv.hpp> #include <vector> #include <string> int main() { // 1. 读取标定图片 std::vector<std::string> imageFiles; // 假设标定图片存放在calib_images文件夹下 cv::glob("calib_images/*.jpg", imageFiles); // 2. 检测棋盘格角点 cv::Size patternSize(9, 6); // 棋盘格内角点的行数和列数 std::vector<std::vector<cv::Point2f>> imagePoints; std::vector<cv::Point3f> objectPoint; for (int i = 0; i < patternSize.height; ++i) { for (int j = 0; j < patternSize.width; ++j) { objectPoint.push_back(cv::Point3f(j, i, 0)); } } for (const auto& file : imageFiles) { cv::Mat image = cv::imread(file); cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); std::vector<cv::Point2f> corners; bool found = cv::findChessboardCorners(gray, patternSize, corners); if (found) { imagePoints.push_back(corners); cv::drawChessboardCorners(image, patternSize, corners, found); cv::imshow("Chessboard", image); cv::waitKey(100); } } // 3. 相机标定 std::vector<std::vector<cv::Point3f>> objectPoints(imagePoints.size(), objectPoint); cv::Mat cameraMatrix, distCoeffs; std::vector<cv::Mat> rvecs, tvecs; cv::calibrateCamera(objectPoints, imagePoints, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs); // 4. 图片矫正 for (const auto& file : imageFiles) { cv::Mat image = cv::imread(file); cv::Mat undistorted; cv::undistort(image, undistorted, cameraMatrix, distCoeffs); cv::imshow("Original", image); cv::imshow("Undistorted", undistorted); cv::waitKey(0); } return 0; } ``` ### 代码说明: 1. **读取标定图片**:使用`cv::glob`函数读取所有标定图片。 2. **检测棋盘格角点**:使用`cv::findChessboardCorners`函数检测棋盘格的角点。 3. **相机标定**:使用`cv::calibrateCamera`函数进行相机标定,计算相机的内参和畸变系数。 4. **图片矫正**:使用`cv::undistort`函数对图片进行矫正
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao__run

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值