OpenCV实现相机标定示例详解

目录
  • 环境准备
  • 相机标定
  • 棋盘格图片
  • 实时显示相机的画面
  • 在线标定
  • 实时显示相机画面,按键保存能检测到角点的 棋盘格图片
  • 离线标定
  • 畸变矫正

环境准备

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 相机标定内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 聊一聊OpenCV相机标定

    相机标定:简单的说,就是获得相机参数的过程.参数如:相机内参数矩阵,投影矩阵,旋转矩阵和平移矩阵等 什么叫相机参数? 简单的说,将现实世界中的人.物,拍成一张图像(二维).人或物在世界中的三维坐标,和图像上对应的二维坐标间的关系.表达两种不同维度坐标间的关系用啥表示?用相机参数. 相机的成像原理 先来看一下,相机的成像原理: 如图所示,这是一个相机模型.将物体简化看成一个点.来自物体的光,通过镜头,击中图像平面(图像传感器),以此成像.d0是物体到镜头的距离,di时镜头到图像平面的距离,f是镜头

  • Python opencv相机标定实现原理及步骤详解

    相机标定相机标定的目的 获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像. 相机标定的输入 标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上). 相机标定的输出 摄像机的内参.外参系数. 拍摄的物体都处于三维世界坐标系中,而相机拍摄时镜头看到的是三维相机坐标系,成像时三维相机坐标系向二维图像坐标系转换.不同的镜头成像时的转换矩阵不同,同时可能引

  • OpenCV实现相机标定板

    本文实例为大家分享了OpenCV实现相机标定板的具体代码,供大家参考,具体内容如下 1.代码实现 #include <opencv.hpp> #include "highgui.h" #include "cxcore.h" using namespace cv; int main0(int argc, char *argv[]) { int width = 140;//width and heigth of single square int heigh

  • OpenCV实现相机标定示例详解

    目录 环境准备 相机标定 棋盘格图片 实时显示相机的画面 在线标定 实时显示相机画面,按键保存能检测到角点的 棋盘格图片 离线标定 畸变矫正 环境准备 vs2015+opencv4.10安装与配置 相机标定 棋盘格图片 可以自己生成,然后打印到A4纸上.(也可以去TB买一块,平价买亚克力板的,不反光买氧化铝材质,高精度买陶瓷的) /** * 生成棋盘格图片 **/ int generateCalibrationPicture() { //Mat frame = imread("3A4.bmp&q

  • python计算机视觉opencv卡号识别示例详解

    目录 一.模板预处理 1.将模板设置为二值图 2.检测模板的轮廓 3.对模板轮廓排序,并将数字和轮廓一一对应,以字典存储 4.备注 二.图片预处理 1.初始化卷积核 2.图片预处理第一部分 3.图像预处理第二部分 三.轮廓处理 1.大轮廓过滤 2.小轮廓分割 模板图片如下: 需识别的图片如下: 一.模板预处理 1.将模板设置为二值图 2.检测模板的轮廓 3.对模板轮廓排序,并将数字和轮廓一一对应,以字典存储 排序的函数如下: 排序并存储: 4.备注 ①每一个数字对应的是二值图截出来的那个数字图的

  • Python OpenCV实现图形检测示例详解

    目录 1. 轮廓识别与描绘 1.1 cv2.findComtours()方法 1.2 cv2.drawContours() 方法 1.3 代码示例 2. 轮廓拟合 2.1 矩形包围框拟合 - cv2.boundingRect() 2.2圆形包围框拟合 - cv2.minEnclosingCircle() 3. 凸包 绘制 4. Canny边缘检测 - cv2.Canny() 4.1 cv2.Canny() 用法简介 4.2 代码示例 5. 霍夫变换 5.1 概述 5.2 cv2.HoughLin

  • OpenCV形状检测的示例详解

    目录 1.基于OpenCV的形状检测Python版本 1.1.定义我们的形状检测器类ShapeDetector 1.2.基于OpenCV的形状检测器 2.基于OpenCV的形状检测C++版本 2.1代码实现 2.2主要函数解析 2.3结果展示 1.基于OpenCV的形状检测Python版本 目录结构 1.1.定义我们的形状检测器类ShapeDetector 开始定义我们的 ShapeDetector 类.我们将跳过这里的 init 构造函数,因为不需要初始化任何东西. # 导入必要的包 impo

  • uniapp自定义相机实现示例详解

    目录 自定义相机 起因 利用livePusher实现 使用 效果图 拓展 实现多种自定义相机 水印相机 身份证相机 人像相机 自定义相机 起因 由于最近用uniapp调用原生相机容易出现闪退问题,找了很多教程又是压缩图片又是优化代码,我表示并没有太大作用!! 于是开启了我的解决之路 利用livePusher实现 实现自定义相机 拓展性挺强的,可以实现自定义水印.身份证拍摄.人像拍摄等 这里我简单实现一个相机功能主要用于解决闪退 Tip:这里需要创建nvue文件哦~ 创建camera.nvue <

  • python opencv图像处理基本操作示例详解

    目录 1.图像基本操作 ①读取图像 ②显示图像 ③视频读取 ④图像截取 ⑤颜色通道提取及还原 ⑥边界填充 ⑦数值计算 ⑧图像融合 2.阈值与平滑处理 ①设定阈值并对图像处理 ②图像平滑-均值滤波 ③图像平滑-方框滤波 ④图像平滑-高斯滤波 ⑤图像平滑-中值滤波 3.图像的形态学处理 ①腐蚀操作 ②膨胀操作 ③开运算和闭运算 4.图像梯度处理 ①梯度运算 ②礼帽与黑帽 ③图像的梯度处理 5.边缘检测 ①Canny边缘检测 1.图像基本操作 ①读取图像 ②显示图像 该函数中,name是显示窗口的名字

  • 基于Opencv图像识别实现答题卡识别示例详解

    目录 1. 项目分析 2.项目实验 3.项目结果 总结 在观看唐宇迪老师图像处理的课程中,其中有一个答题卡识别的小项目,在此结合自己理解做一个简单的总结. 1. 项目分析 首先在拿到项目时候,分析项目目的是什么,要达到什么样的目标,有哪些需要注意的事项,同时构思实验的大体流程. 图1. 答题卡测试图像 比如在答题卡识别的项目中,针对测试图片如图1 ,首先应当实现的功能是: 能够捕获答题卡中的每个填涂选项. 将获取的填涂选项与正确选项做对比计算其答题正确率. 2.项目实验 在对测试图像进行形态学操

  • C++ OpenCV生成蒙太奇图像的示例详解

    目录 前言 一.输入模板图像 二.读取素材图像 三.生成蒙太奇模板 四.生成蒙太奇图像 五.源码 总结 前言 本文将使用OpenCV C++ 生成蒙太奇图像. 一.输入模板图像 原图如图所示.我们将对此图生成蒙太奇图像. Mat src = imread("Taylor.jpg"); if (src.empty()) { cout << "No image!" << endl; system("pause"); retur

  • C++ OpenCV实现物体尺寸测量示例详解

    目录 前言 一.图像透视矫正 二.物体定位 三.尺寸测量 四.效果显示 五.源码 总结 前言 本文将使用OpenCV C++ 进行物体尺寸测量.具体来说就是先定位到待测物体的位置,然后测量物体的宽高. 一.图像透视矫正 原图如图所示.本案例的需求是测量图片中两张卡片的尺寸.首先,我们得定位到两张卡片的位置.第一步,我们首先得将白色A4纸切割出来,这样方便定位到两张卡片所在位置.这里用到的算法是图像透视矫正,具体可以参考OpenCV C++案例实战四<图像透视矫正> //图像矫正 void ge

  • Python OpenCV形态学运算示例详解

    目录 1. 腐蚀 & 膨胀 1.1什么是腐蚀&膨胀 1.2 腐蚀方法 cv2.erode() 1.3 膨胀方法 cv2.dilate() 2. 开运算 & 闭运算 2.1 简述 2.2 开运算 2.3 闭运算 3. morphologyEx()方法 3.1 morphologyEx()方法 介绍 3.2 梯度运算 3.3 顶帽运算 3.4 黑帽运算 1. 腐蚀 & 膨胀 1.1什么是腐蚀&膨胀 腐蚀&膨胀是图像形态学中的两种核心操作 腐蚀可以描述为是让图像沿

随机推荐