首页 > 其他分享 >单目相机校准

单目相机校准

时间:2024-07-01 21:58:35浏览次数:9  
标签:std vector 校准 int 相机 单目 images include cv

参考链接

opencv4.0 中文文档 https://apachecn.github.io/opencv-doc-zh/#/docs/4.0.0/7.1-tutorial_py_calibration 使用的是python版本

原文档https://docs.opencv.org/4.x/d4/d94/tutorial_camera_calibration.html

http://t.csdnimg.cn/HKECW

标定

棋盘https://docs.opencv.org/4.x/pattern.png

程序

#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <iostream>

using namespace std;
using namespace cv;

// Defining the dimensions of checkerboard
// 定义棋盘格的尺寸
int CHECKERBOARD[2] {6,9};

int main()
{
	// Creating vector to store vectors of 3D points for each checkerboard image
	// 创建矢量以存储每个棋盘图像的三维点矢量
	std::vector<std::vector<cv::Point3f> > objpoints;

	// Creating vector to store vectors of 2D points for each checkerboard image
	// 创建矢量以存储每个棋盘图像的二维点矢量
	std::vector<std::vector<cv::Point2f> > imgpoints;

	// Defining the world coordinates for 3D points
	// 为三维点定义世界坐标系
	std::vector<cv::Point3f> objp;
	for (int i{ 0 }; i < CHECKERBOARD[1]; i++)
	{
		for (int j{ 0 }; j < CHECKERBOARD[0]; j++)
		{
			objp.push_back(cv::Point3f(j, i, 0));
		}
	}

	// Extracting path of individual image stored in a given directory
	// 提取存储在给定目录中的单个图像的路径
	std::vector<cv::String> images;

	// Path of the folder containing checkerboard images
	// 包含棋盘图像的文件夹的路径
	std::string path = "../images/CameraCalibration/*.jpg";

	// 使用glob函数读取所有图像的路径
	cv::glob(path, images);
	cout << images[0] << endl;
	cv::Mat frame, gray;
	// vector to store the pixel coordinates of detected checker board corners
	// 存储检测到的棋盘转角像素坐标的矢量
	std::vector<cv::Point2f> corner_pts;
	bool success;

	frame = cv::imread(images[0]);
	cv::cvtColor(frame,gray,cv::COLOR_BGR2GRAY);

	// Looping over all the images in the directory
	// 循环读取图像
	for (int i{ 0 }; i < images.size(); i++)
	{
		frame = cv::imread(images[i]);
		if (frame.empty())
		{
			continue;
		}
		if (i == 40)
		{
			int b = 1;
		}
		cout << "the current image is " << i << "th" << endl;
		cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);       // COLOR_BGR2GRAY 从BGR 转换到灰度图
		cv::resize(gray, gray, cv::Size(), 0.125, 0.125, cv::INTER_LINEAR);
		cv::imshow("gray", gray);
		cv::waitKey(1);
		// Finding checker board corners
		// 寻找角点
		// If desired number of corners are found in the image then success = true
		// 如果在图像中找到所需数量的角,则success = true
		// opencv4以下版本,flag参数为CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_NORMALIZE_IMAGE
		success = cv::findChessboardCorners(gray, cv::Size(CHECKERBOARD[0], CHECKERBOARD[1]), corner_pts, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FAST_CHECK | CALIB_CB_NORMALIZE_IMAGE);

		/*
		 * If desired number of corner are detected,
		 * we refine the pixel coordinates and display
		 * them on the images of checker board
		*/
		// 如果检测到所需数量的角点,我们将细化像素坐标并将其显示在棋盘图像上
		if (success)
		{
			// 如果是OpenCV4以下版本,第一个参数为CV_TERMCRIT_EPS | CV_TERMCRIT_ITER
			cv::TermCriteria criteria(TermCriteria::EPS | TermCriteria::Type::MAX_ITER, 30, 0.001);

			// refining pixel coordinates for given 2d points.
			// 为给定的二维点细化像素坐标
			cv::cornerSubPix(gray, corner_pts, cv::Size(11, 11), cv::Size(-1, -1), criteria);

			// Displaying the detected corner points on the checker board
			// 在棋盘上显示检测到的角点
			cv::drawChessboardCorners(frame, cv::Size(CHECKERBOARD[0], CHECKERBOARD[1]), corner_pts, success);

			objpoints.push_back(objp);
			imgpoints.push_back(corner_pts);
		}

		//cv::imshow("Image", frame);
		//cv::waitKey(0);
	}

	cv::destroyAllWindows();

	cv::Mat cameraMatrix, distCoeffs, R, T;

	/*
	 * Performing camera calibration by
	 * passing the value of known 3D points (objpoints)
	 * and corresponding pixel coordinates of the
	 * detected corners (imgpoints)
	*/
	// 通过传递已知3D点(objpoints)的值和检测到的角点(imgpoints)的相应像素坐标来执行相机校准
	cv::calibrateCamera(objpoints, imgpoints, cv::Size(gray.rows, gray.cols), cameraMatrix, distCoeffs, R, T);

	// 内参矩阵
	std::cout << "cameraMatrix : " << cameraMatrix << std::endl;
	// 透镜畸变系数
	std::cout << "distCoeffs : " << distCoeffs << std::endl;
	// rvecs
	std::cout << "Rotation vector : " << R << std::endl;
	// tvecs
	std::cout << "Translation vector : " << T << std::endl;

	return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(CameraCalibration)

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS "-std=c++11")
set(LIBRARY_OUTPUT_PATH ${PROJECT_NAME_DIR}/lib)

find_package(OpenCV 4.0 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIR})
include_directories(${PROJECT_NAME_DIR}/include)
add_subdirectory(${PROJECT_SOURCE_DIR}/src)

add_executable(CameraCalibration src/camera_calibration.cpp)
target_link_libraries(CameraCalibration ${OpenCV_LIBS})

结果

报错,

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.2.0) ../modules/calib3d/src/calibration.cpp:3681: error: (-215:Assertion failed) nimages > 0 in function 'calibrateCameraRO'

不知道为啥,

猜测是因为ipone拍摄的相机像素太高,减小尺寸试试

在for循环中加入

		cv::resize(gray, gray, cv::Size(), 0.125, 0.125, cv::INTER_LINEAR);

可以出结果了

标签:std,vector,校准,int,相机,单目,images,include,cv
From: https://www.cnblogs.com/WMAAA/p/18278926

相关文章

  • ubuntu 使用自己的双目相机发布 ROS
    https://blog.csdn.net/KID_yuan/article/details/101272384https://blog.csdn.net/weixin_53073284/article/details/125671358ls/dev/video*//插上摄像头后打开终端查看是否检测到摄像头mkdir-pcamera_ws/src//新建工作空间......
  • 【仿真】UR机器人手眼标定与实时视觉追踪(单目)
    这段代码实现了一个机器人视觉引导系统,主要功能包括:连接仿真环境,控制UR机器人。相机标定:使用棋盘格图案进行相机内参标定通过移动机器人采集多组图像使用calibrateCamera函数计算相机内参手眼标定:采集机器人末端位姿和对应的棋盘格图像使用calibrateHandEye函数计算......
  • 使用D435i相机调节曝光度、色调等信息。
    最近使用D435i相机识别简单的色块的时候发现在自然光下色块颜色对比度不突出,在增加光源的情况下突然发现相机的曝光度是自动改变的。不符合我的期望,查了许多博客和官方文档。可以实现将调节好的曝光度、色调、饱和度等信息保存起来并在rs_camera.launch加载它,以下是实现步骤。......
  • LabVIEW与3D相机开发高精度表面检测系统
    使用LabVIEW与3D相机开发一个高精度表面检测系统。该系统能够实时获取三维图像,进行精细的表面分析,广泛应用于工业质量控制、自动化检测和科学研究等领域。通过真实案例,展示开发过程中的关键步骤、挑战及解决方案,确保系统的高性能和可靠性。随着工业自动化和智能制造的发展,精......
  • Unity相机及物体的移动步骤
    一、在Scenes场景文件夹建立游戏场景 二、在游戏场景里面建立游戏对象并且初始化位置1、建立游戏对象  2、初始化位置 3、把相机拉到游戏对象上(Reset一下位置)【注:这一步是操作相机的移动,物品的操作不用此步骤。】  三、建立CharacterController组件1、有Ca......
  • 相机+IMU+VINS-MONO+VINS-MONO-LET-NET
    docker容器中:终端1:打开相机dockerexec-itd38/bin/bashsource./devel/setup.bashroslaunchastra_cameraastra_pro.launch终端2:打开imudockerexec-itd38/bin/bashln-s/dev/ttyUSB0/dev/fdilink_ahrs#如果/dev/fdilink_ahrs找不到的话执行roslauncha......
  • HALCON-从入门到入门-相机标定-内参外参
    1.废话为什么要进行相机标定几个坐标系像素坐标系(图片坐标系)就是我们在电脑上看到图片的坐标系,以左上角为原点(2d坐标系)单位是像素pixel相机坐标系相机物方视野投影的坐标系,单位是mm世界坐标系就是真实的世界坐标系,单位是mm标定的结果标定的结果中有内参矩阵,外参,畸......
  • [笔记] CCD相机测距相关的一些基础知识
    1.35mm胶片相机等效焦距https://zhuanlan.zhihu.com/p/419616729拿到摄像头拍摄的数码照片后,我们会看到这样的信息:这里显示出了两个焦距:一个是实际焦距:5mm,一个是等效焦距:25mm。实际焦距很容易理解——就是镜头到CCD感光元件所在的焦平面的距离。但是这个35mm等效焦距是什......
  • 单目标应用:基于红嘴蓝鹊优化器RBMO的微电网优化(MATLAB代码)
    一、微电网模型介绍微电网多目标优化调度模型简介_vmgpqv-CSDN博客参考文献:[1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程,2021,37(3):7二、红嘴蓝鹊优化器求解微电网2.1算法简介红嘴蓝鹊优化器(Red-billedBlueMagpieOptimize......
  • 相机外参和内参矩阵介绍
    相机与变换一、内参与外参概念在计算机视觉中,特别是在相机标定和立体视觉领域,内参(intrinsicparameters)和外参(extrinsicparameters)是非常重要的概念。它们与相机的几何属性和姿态有关。内参(IntrinsicParameters):内参是描述相机内部属性的参数,包括焦距、主点(光学中心)坐标、畸......