相机标定的原理、程序实现、畸变矫正(二,程序实现)

  1. 原理
  2. 标定
  3. 畸变修复
    (有什么其他要补充的或者要提问,留言就行)
    github工程:

原理

https://blog.youkuaiyun.com/shiyuqing457/article/details/106764866

标定程序

opencv版本4.0
程序思路(最下方会有全部代码,复制可直接用)
1、读取图片
2、提取图像的棋盘格格点
3、进行图像标定

对每个函数进行分开说明

读取图片

#include "opencv.hpp"
#include <iostream>
#include <fstream>
#include <iostream>  
#include <io.h>  
#include <string>  
#include<vector>

using namespace cv;
using namespace std;

void get_file(string &src_dir, string &file_type, vector<string> &file_name)
{
   
   
	struct _finddata_t FileInfo;
	long handle;
	string src_tmp = src_dir + "\\*" + file_type;
	string src_full_name;
	handle = _findfirst(src_tmp.c_str(), &FileInfo);
	if (!handle)
		cout << "the dir is not exist" << endl;
	src_full_name = src_dir + "\\" + FileInfo.name;   //将路径连接起来,存入容器
	file_name.push_back(src_full_name);
	while (!_findnext(handle, &FileInfo))
	{
   
   
		src_full_name = src_dir + "\\"+FileInfo.name;
		file_name.push_back(src_full_name);
	}	
	_findclose(handle);
	/*decltype(file_name.size()) cnt=0;
	for (auto file_num : file_name)
	{
		cout << "the num " << cnt << " file is:" << file_name[cnt] << endl;
		cnt++;
	}*/
}

Struct _finddata_t结构体可以用来处理各种文件的文件信息,使用该结构体需要添加头文件io.h
它的定义如下所示

struct _finddata_t
{
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[_MAX_FNAME];
};
对于该结构体中的各个变量的定义如下所示:

unsigned attrib:无符号整形、位表示。它的作用是表示文件的属性,一般来说,文件的属性有如下几种:

_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)

time_t time_create:表示从1970年1月1日0时0分0秒到现在时刻的秒数。

time_t time_access:文件最后一次被访问的时间

time_t time_write:文件最后一次被修改的时间

_fsize_t size:文件的大小。

char name[_MAX_FNAME]:文件的文件名,这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。

为了使用这个结构体将文件的信息存储到该结构体的内存空间,需要搭配使用_findfirst()、_findnext()、_findclose()三个函数使用。首先用_findfirst函数查找第一个文件,若成功则用返回的句柄,调用_findnext函数查找其他的文件,当查找文件完成之后,就会用_findclose函数结束查找。

long _findfirst( char *filespec, struct _finddata_t *fileinfo );

返回值:如果查找成功,那么就返回一个long型的唯一查找用的句柄。这个句柄会在_findnext函数中被使用。失败的话就会返回0.

参数:filespec:标明文件的字符串。例如:*.c

fileinfo:这里就是用来存放文件信息的结构体的指针。函数成功后,函数会把找到的文件的信息放入这个结构体所分配的内存空间中。

int _findnext( long handle, struct _finddata_t *fileinfo );

返回值:若成功返回0,否则返回-1。

参数:handle:即由_findfirst函数返回回来的句柄。

int _findclose( long handle );

返回值:成功返回0,失败返回-1。

指针与句柄的区别

指针:指针通俗来着就是地址,他是内存的编号,通过指针我们可以直接对内存进行操作,只要地址不变,我们每次操作的物理位置是绝对不变的。

句柄:一般是指向系统的资源的位置,可以说也是地址。但是这些资源的位置真的不变,我们都知道window支持虚拟内存的技术,同一时间内可能有些资源被换出内存,一些被换回来,这就是说同一资源在系统的不同时刻,他在内存的物理位置是不确定的,那么window是如何解决这个问题呢,就是通过句柄来处理资源的物理位置不断变化的这个问题的。window会在物理位置固定的区域存储一张对应表,表中记录了所有的资源实时地址,句柄其实没有直接指向资源的物理地址,而是指向了这个对应表中的一项,这样无论资源怎样的换进换出,通过句柄都可以找到他的实时位置。

提取角点与标定

1、**cv::findChessboardCorners()**棋盘格角点检测

该函数的具体调用形式如下:

bool cv::findChessboardCorners( // 如果找到角点则返回true
	cv::InputArray image, // 输入的棋盘格图像(8UC1或8UC3)
	cv::Size patternSize, // 棋盘格内部角点的行、列数
	cv::OutputArray corners, // 输出的棋盘格角点
	int flags = cv::CALIB_CB_ADAPTIVE_THRESH 
	| cv::CALIB_CB_NORMALIZE_IMAGE
);

第一个参数是输入的棋盘格图像(可以是8位单通道或三通道图像)。
第二个参数是棋盘格内部的角点的行列数(注意:不是棋盘

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值