目录

学习目标:

学习内容:

学习时间:

学习产出:

一、前期准备

二、采集相关数据

三、进行标定

四、用cv::undistort方法去除畸变

五、效果

六、心得


学习目标:

  • pnp解算
  • 相机标定
  • 去畸变

学习内容:

直接用电脑的摄像头标定一个相机,标定完后使用cv::undistort方法去除相机的畸变。

学习时间:

  • 2022年8月1日到2022年8月4日

学习产出:

一、前期准备

这次长话短说吧,网上相关资料很多,可以参考https://blog.csdn.net/LuohenYJ/article/details/104697062

标定板我用的

可以去这个网站:Camera Calibration Pattern Generator – calib.io去生成

摄像头是电脑的摄像头。

二、采集相关数据

#include "opencv2/opencv.hpp"
#include <string>
#include <iostream>using namespace cv;
using namespace std;int main()
{VideoCapture inputVideo(0);//inputVideo.set(CV_CAP_PROP_FRAME_WIDTH, 320);//inputVideo.set(CV_CAP_PROP_FRAME_HEIGHT, 240);if (!inputVideo.isOpened()){cout << "Could not open the input video " << endl;return -1;}Mat frame;string imgname;int f = 1;while (1) //Show the image captured in the window and repeat{inputVideo >> frame;              // readif (frame.empty()) break;         // check if at endimshow("Camera", frame);char key = waitKey(1);if (key == 27)break;if (key == 'q' || key == 'Q'){imgname = to_string(f++) + ".jpg";imwrite(imgname, frame);}}cout << "Finished writing" << endl;return 0;
}

三、进行标定

//加载图片//
#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;// 保存多张图片对象点列表
vector<vector<Point3f>> objectPoints;
// 保存多张图片的角点列表
vector<vector<Point2f>> cornerPoints;int main(){// 图片像素尺寸Size imgSize;// 图片路径cv::String src_path = "./assets/camerargb_*.jpg";std::vector<String> filenames;cv::glob(src_path, filenames);//获取路径下所有文件名cout << "filenames.size:" << filenames.size() << endl;for (auto& imgName : filenames) {// 读取图片Mat img = imread(imgName, IMREAD_COLOR);// 获取图片像素尺寸imgSize = img.size();std::cout << "name: " << imgName<< " imgSize: " << imgSize << std::endl;//...}return 0;
}//查找角点//
// 棋盘格的尺寸(宽6,高9)
const Size patternSize(6, 9);
// 黑方格的大小 20mm
const int squareSize = 20;
/*** 在指定图片中查找角点,并将结果输出到corners中* @param img     待检测图片* @param corners 检测到的焦点列表* @return 是否检测到角点(两个黑方格的交点)*/
bool findCorners(Mat &img, vector<Point2f> &corners) {Mat gray;// 将图片转成灰度图cvtColor(img, gray, COLOR_RGB2GRAY);// 查找当前图片所有的角点bool patternWasFound = findChessboardCorners(gray, patternSize, corners);if (patternWasFound) { // 找到角点// 提高角点的精确度// 原理:https://docs.opencv.org/4.1.0/dd/d1a/group__imgproc__feature.html#ga354e0d7c86d0d9da75de9b9701a9a87ecornerSubPix(gray, corners, Size(11, 11), Size(-1, -1),TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));}// 将所有的焦点在原图中绘制出来drawChessboardCorners(img, patternSize, corners, patternWasFound);// 绘制完角点之后,显示原图imshow("src", img);if (!patternWasFound){cout << "角点检测失败!" << endl;}return patternWasFound;
}// 保存多张图片对象点列表
vector<vector<Point3f>> objectPoints;
// 保存多张图片的角点列表
vector<vector<Point2f>> cornerPoints;void calcObjectPoints(vector<Point3f> &objPoint) {// 计算uv空间中角点对应的相机坐标系坐标值,设Z为0for (int i = 0; i < patternSize.height; ++i)for (int j = 0; j < patternSize.width; ++j)objPoint.emplace_back(j * squareSize, i * squareSize, 0);
}// 图片像素尺寸
Size imgSize;int main(){// 图片路径cv::String src_path = "./assets/camerargb_*.jpg";std::vector<String> filenames;cv::glob(src_path, filenames);//获取路径下所有文件名cout << "filenames.size:" << filenames.size() << endl;for (auto& imgName : filenames) {// 读取图片Mat img = imread(imgName, IMREAD_COLOR);// 获取图片像素尺寸imgSize = img.size();std::cout << "name: " << imgName<< " imgSize: " << imgSize << std::endl;// 声明每张图片的角点vector<Point2f> corners;bool found = findCorners(img, corners);if (found) {vector<Point3f> objPoints;calcObjectPoints(objPoints);// 找到角点,证明这张图是有效的objectPoints.push_back(objPoints);cornerPoints.push_back(corners);}}return 0;
}//执行相机标定//
Mat cameraMatrix; // 相机参数矩阵
Mat disCoffes; // 失真系数 distortion coefficients
Mat rvecs; // 图片旋转向量
Mat tvecs; // 图片平移向量calibrateCamera(objectPoints, cornerPoints, imgSize, cameraMatrix, disCoffes, rvecs, tvecs);cout << "标定矩阵:" << cameraMatrix << endl;
cout << "畸变矩阵:" << disCoffes << endl;
// save2xml(cameraMatrix, distCoffes);waitKey();//保存标定结果//
void save2xml(const Mat &cameraMatrix, const Mat &disCoffes) {// 获取当前时间time_t tm;time(&tm);struct tm *t2 = localtime(&tm);char buf[1024];strftime(buf, sizeof(buf), "%c", t2);// 写出数据String inCailFilePath = "./inCailFilePath.xml";FileStorage inCailFs(inCailFilePath, FileStorage::WRITE);inCailFs << "calibration_time" << buf;inCailFs << "cameraMatrix" << cameraMatrix;inCailFs << "distCoffes" << disCoffes;inCailFs.release();
}//我最后输出了yml文件,也可以是xml文件格式//

四、用cv::undistort方法去除畸变

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>using namespace cv;
using namespace std;int main(int argc, char **argv) {// 读取相机矩阵、畸变系数cv::FileStorage fs("你的yml文件", FileStorage::READ);int image_width{0}, image_height{0};fs["image_width"] >> image_width;fs["image_height"] >> image_height;Size image_size = Size(image_width, image_height);Mat intrinsic_matrix, distortion_coeffs;fs["cameraMatrix"] >> intrinsic_matrix;fs["distCoeffs"] >> distortion_coeffs;fs.release();std::cout << intrinsic_matrix << std::endl;std::cout << distortion_coeffs << std::endl;std::cout << image_size << std::endl;const Mat &image0 = imread("./calib_chess_img/image_0.jpg", IMREAD_COLOR);Mat image;undistort(image0, image, intrinsic_matrix, distortion_coeffs);imshow("original", image0);imshow("undistorted", image);waitKey();return 0;
}

PS:代码仅供参考。

五、效果

六、心得

我觉得做的不是很好很对,很多东西还是得进一步弄好,等我多学点再后续更新吧。

合工大苍穹战队视觉组培训Day9——相机标定相关推荐

  1. 合工大苍穹战队视觉组培训Day8——视觉,目标识别

    学习目标: 目标识别 学习内容: 车牌OCR 学习时间: 2022年7月26日到2022年7月27日 学习产出: 因为之前用FPGA和基于python的cv做过车牌识别(大创),感觉战队C++用的多, ...

  2. 2021苍穹战队视觉组寒假学习计划--环境配置

    2021苍穹战队视觉组寒假学习计划–环境配置 前言 本文为环境配置文章,寒假学习使用平台为Python++Opencv+Pytorch,推荐使用软件为Anaconda+Pytorch+Opencv+P ...

  3. 第十七届全国大学生智能车竞赛智能视觉组培训第一弹

    简 介: 第十七届全国大学生智能车竞赛竞速比赛中,由NXP赞助的智能视觉组的比赛细则已经公布的.为了帮助同学们能够更好地制作比赛作品,在在此过程中得到更好地锻炼,NXP公司近期举行智能视觉组培训.欢迎 ...

  4. 智能车大赛AI视觉组培训第一弹——基础篇

    智能车大赛AI视觉组培训第一弹: ▌基础篇 1.培训简介 ■时间安排: 2021年03月18日 14:00 ■内容简介: 由恩智浦赞助的AI视觉组,今年由于把人工智能应用在智能车竞赛中,使得难度提升了 ...

  5. AI视觉组培训第二弹——入门篇

    ▌入门篇   由恩智浦赞助的AI视觉组,今年把人工智能应用在智能车竞赛中的难度由提高了一步.这里面最重要的部分就是,用人工智能的神经网络进行图片识别.   上一次培训,我们已经介绍了人工智能和神经网络 ...

  6. 2023年智能车大赛智能视觉组培训第一弹——拆题

    1.内容简介 讲座时间: 2023年02月10日 14:00   第十八届全国大学生智能汽车竞赛已拉开帷幕,恩智浦继续为大赛提供赞助和技术支持.   今年是智能视觉组的第三年,经过前两年的探索和迭代, ...

  7. 视觉SLAM——针孔相机模型 相机标定原理 双目相机模型 深度相机对比

    前言 本博客为主要学习<视觉SLAM十四讲>第5讲.<机器人学的状态估计>第6章6.4.1透视相机.<多视图几何>第5章摄像头模型等SLAM内容的总结与整理. 主要 ...

  8. RoboMaster机甲大师——视觉组——摄像头的选型与应用

    RoboMaster机甲大师--视觉组--摄像头的选型与应用 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 本篇文章主要介绍在进行图像处理时 ...

  9. 第16届智能车智能视觉组-上海交通大学AuTop战队算法分享

    简 介: 参加了第十六届智能车竞赛室内视觉AI组别同学留下的对于智能车竞赛参赛感悟与建议.并对于自己参赛过程中学习研究的算法进行开源并给出了详细的介绍. 关键词: 智能车竞赛,SJTU-AuTop,视 ...

最新文章

  1. nodejs - 创建服务器(1)
  2. CSDN粉丝解答:六月份第一期精选——互联网笔试编程解决、简单bug处理、编程系统设计等
  3. 【CV】目标检测:常用名词与mAP评价指标的引出
  4. Java黑皮书课后题第6章:6.10(使用isPrime方法)程序清单6-7提供了测试某个数字是否是素数的方法isPrime(int number)。使用这个方法求小于10000的素数的个数
  5. python3(七)os模块
  6. 23、java中的网编基础
  7. 前端学习(3011):vue+element今日头条管理--关于编辑器代码段
  8. python-索引1909
  9. 生成内核版本号头文件的方法
  10. 全国计算机一级试题重难点,全国计算机等级考试一级MS选择题(重难点)部分.doc...
  11. [现代程序设计]homework-03
  12. 如何快速清理Mac系统上的大额文件
  13. 保持稳定迭代的秘密:基于Spinnaker的全自动渐进式交付
  14. xml property标签注入一个类变量_依赖注入的学习
  15. 系统详细设计过程指南
  16. Unity分屏之使用TUIO实现互动投影
  17. 八孔g调短洞箫_八孔g调洞箫曲谱_八孔G调箫G调简谱
  18. 林轩田《机器学习基石》(六)—— Theory of generalization
  19. 怎么修改PDF文字,PDF修改文字用什么方法
  20. loss.item()在深度学习作用

热门文章

  1. python及大数据相关书籍推荐
  2. 毕业后升级打怪程序人生
  3. JS标准内置对象 数组 的 34 个方法
  4. 如何利用HackRF分析无线电信号,解读无线语言
  5. html5 i标签什么意思,快速了解HTML5 b和i标签
  6. 关于《一种鱼眼图象到透视投影图象的变换模型》
  7. 用数字万用表测量三极管的方法
  8. 从中医角度体检健身标准
  9. 数据库打不开的解决办法
  10. vscode卡在Setting up SSH Host XX:Copying VS Code Server to host with scp