OpenCV实现相机标定示例详解

 更新时间:2021年11月25日 10:07:28   作者:语音余音玉印  
相机标定是图像处理的基础,现在市面上买到的相机,都存在着或多或少的畸变。本文将介绍如何利用一系列棋盘照片进行摄像机标定的,感兴趣的小伙伴可以关注一下

环境准备

vs2015+opencv4.10安装与配置

相机标定

棋盘格图片

可以自己生成,然后打印到A4纸上。(也可以去TB买一块,平价买亚克力板的,不反光买氧化铝材质,高精度买陶瓷的)

/**
* 生成棋盘格图片
**/
int generateCalibrationPicture()
{
	//Mat frame = imread("3A4.bmp"); // cols*rows = 630*891  
	Mat frame(1600, 2580, CV_8UC3, Scalar(0, 0, 0));
	int nc = frame.channels();
	int nWidthOfROI = 320;
	for (int j = 10; j<frame.rows - 10; j++)
	{
		uchar* data = frame.ptr<uchar>(j);
		for (int i = 10; i<(frame.cols - 10)*nc; i += nc)
		{
			if ((i / nc / nWidthOfROI + j / nWidthOfROI) % 2)
			{
				// bgr  
				data[i / nc*nc + 0] = 255;
				data[i / nc*nc + 1] = 255;
				data[i / nc*nc + 2] = 255;
			}
		}
	}
	imshow("test", frame);
	//imwrite("3.bmp", frame);
	waitKey(0);
	return 0;
}

实时显示相机的画面

准备一个相机,我的是usb相机(罗技100多的)。

int displayCameraRealTime()
{
	//1.从摄像头读入视频
	VideoCapture capture(0);
	if (!capture.isOpened()) {
		std::cout << "无法开启摄像头!" << std::endl;
		return -1;
	}
	//2.循环显示每一帧
	while (1)
	{
		Mat cam;
		capture >> cam;//获取当前帧图像
		namedWindow("实时相机画面", WINDOW_AUTOSIZE);
		imshow("实时相机画面", cam);//显示当前帧图像
							  //imwrite(to_string(i) + ".png", cam);
		waitKey(20);//延时20ms
	}
}

效果如下图:

在线标定

把打印的棋盘格固定在板子上

/**
* 实时检测角点,按键保存角点参数,达到数量执行标定并保存标定结果
* @param numBoards			需要几张标定图片,即获取几组角点参数
* @param boardSize			格子尺寸Size 7*4
* @param squareSize			格子尺寸 mm
* @param flipHorizontal		是否翻转
*/
int calibrateCameraRealTime(int numBoards, cv::Size boardSize, float squareSize = 1, int delay = 50, bool flipHorizontal = false);

实时显示相机画面,按键保存能检测到角点的 棋盘格图片

int saveChessboardImages(cv::Size boardSize, string savePath)
{
	//1.从摄像头读入视频
	VideoCapture capture(0);
	if (!capture.isOpened()) {
		std::cout << "无法开启摄像头!" << std::endl;
		return -1;
	}
	if (savePath != "./")
	{
		myMkdir(savePath);
	}
	//2.循环显示每一帧
	while (1) {
		Mat image0, image;
		capture >> image0;
		// 将图像复制到image
		image0.copyTo(image);
		// 查找标定板(不对称圆网格板)
		vector<Point2f> corners;
		//bool found = findCirclesGrid(image, boardSize, corners, CALIB_CB_ASYMMETRIC_GRID);
		bool found = findChessboardCorners(image, boardSize, corners, CALIB_CB_FAST_CHECK);
		// 画上去
		drawChessboardCorners(image, boardSize, corners, found);
		int action = waitKey(30) & 255;
		// 判断动作
		if (action == ACTION_SPACE) { // 用户按下了空格
			if (found) {
				// 保存图片
				string imgFileName = savePath + getCurrentTime() + ".png";
				imwrite(imgFileName, image0);
				cout << imgFileName << " saved" << endl;
			}
			else {
				printf("%s\n", "未检测到角点");
			}
		}
		else if (action == ACTION_ESC) { // 用户按下了ESC
			break;
		}
		cv::imshow("Calibration", image);
	}
	cv::destroyAllWindows();
	return 1;
}

离线标定

/**
* 离线相机标定
* @param imagePath    标定图片存放路径
* @param boardSize    格子尺寸Size 7*4
* @param squareSize   格子尺寸 mm
*/
int calibrateCameraOffLine(string imagePath, const Size boardSize, float squareSize = 1);

畸变矫正

/**
* 去畸变 1、本地图片 2、实时相机图像
* @param path		标定参数存放路径
* @param imagePath	需要矫正的图片 存放路径
*/
int undistortRectifyImage(string paraPath, string imagePath = " ");

矫正效果貌似不明显

完整工程地址

到此这篇关于OpenCV实现相机标定示例详解的文章就介绍到这了,更多相关OpenCV 相机标定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt实现文本编辑器(一)

    Qt实现文本编辑器(一)

    在Qt中QMainWindow是一个为用户提供主窗口程序的类,包含了:菜单栏、工具栏、锚接部件、状态栏以及一个中部件。本文将利用QMainWindow制作一个文本编辑器,感兴趣的可以试一试
    2022-01-01
  • C语言数据结构算法之实现快速傅立叶变换

    C语言数据结构算法之实现快速傅立叶变换

    这篇文章主要介绍了C语言数据结构算法之实现快速傅立叶变换的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++ vector容器 find erase的使用操作:查找并删除指定元素

    C++ vector容器 find erase的使用操作:查找并删除指定元素

    这篇文章主要介绍了C++ vector容器 find erase的使用操作:查找并删除指定元素,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 一篇文章教你3分钟如何发布Qt程序

    一篇文章教你3分钟如何发布Qt程序

    这篇文章主要给大家介绍了关于教你3分钟如何发布Qt程序的相关资料,文中通过实例代码结束的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • VC中使用GDI+的配置方法概述

    VC中使用GDI+的配置方法概述

    这篇文章主要介绍了VC中使用GDI+的配置方法,需要的朋友可以参考下
    2014-07-07
  • C语言实现注册登录系统

    C语言实现注册登录系统

    这篇文章主要为大家详细介绍了C语言实现注册登录系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 数据结构 红黑树的详解

    数据结构 红黑树的详解

    这篇文章主要介绍了数据结构 红黑树的详解的相关资料,数据结构中的二叉树查找,红黑树的讲解,需要的朋友可以参考下
    2017-07-07
  • vs2019中使用MFC构建简单windows窗口程序

    vs2019中使用MFC构建简单windows窗口程序

    今天发现网上好多MFC代码都不能用,给大家分享一个简单的MFC窗口语言,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • MFC LoadImage用法案例详解

    MFC LoadImage用法案例详解

    这篇文章主要介绍了MFC LoadImage用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++的继承和派生你了解吗

    C++的继承和派生你了解吗

    这篇文章主要为大家详细介绍了C++继承和派生,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论