- 原理
- 标定
- 畸变修复
(有什么其他要补充的或者要提问,留言就行)
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位单通道或三通道图像)。
第二个参数是棋盘格内部的角点的行列数(注意:不是棋盘

最低0.47元/天 解锁文章
4126

被折叠的 条评论
为什么被折叠?



