概述
相机校正流程(硬件)
Hessian角点检测
请看链接角点检测
goodFeaturesToTrack(gray,c,1000,0.1,5,Mat(),3,false,0.04);//Hessian强角点检测
//参数说明
//gray 输入图像
//c 输出角点坐标
//查找的角点总数
//0.1 检测到的角点的质量水平(0.01-0.1之间)
//Mat() 范围 Mat() 表示所有
//3 窗口默认为3
//false 是否开启True:Hessian角点检测 false则使用Shi Tomasi算法
//0,004 Hessian角点的k值默认为 0。004
原理opencv亚像素角点
函数:
void cv::cornerSubPix( InputArray _image, InputOutputArray _corners,
Size win, Size zeroZone, TermCriteria criteria )
cv::cornerSubPix(grayImg, pts, cv::Size(11, 11), cv::Size(-1, -1),
cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
//参数说明
//grayImg 输入图像
//pts 整数角点 由goodFeaturesToTrack函数计算出来,在函数计算结果保存在此变量中
// cv::Size(11, 11) x,y方向窗口
//cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)
//设置结束模式:CV_TERMCRIT_EPS:小于误差阈值结束;CV_TERMCRIT_ITER 达到迭代次数结束
单应矩阵:计算相机的内外参
最小中值鲁棒算法
PROSAC
Mat cv::findHomography ( InputArray srcPoints,
InputArray dstPoints,
int method = 0,
double ransacReprojThreshold = 3,
OutputArray mask = noArray(),
const int maxIters = 2000,
const double confidence = 0.995
)
//参数说明:
//srcPoints 原平面坐标
//dstPoints 目标平面坐标
//method:方法:0最小二乘法 1:基于RANSAC的鲁棒算法 2LMEDS - 最小中值鲁棒算法3 RHO: PROSAC-基于PROSAC的鲁棒算法
//ransacReprojThreshold:最大允许重投影错误阈值(仅用于RANSAC和RHO方法)该参数通常设置在1到10的范围内
//mask 掩码;可选通常由鲁棒算法(RANSAC或LMEDS)设置。
//maxIters RANSAC算法迭代次数,默认2000
//confidence 置信度 0-1
张定友标定:
- 通过移动相机或者平面拍摄标定板各种角度的图片,一般拍摄20张;
- 检测图片中的特征点;
- 计算理想无畸变的情况下5个内部参数和所有的外部参数;
- 通过最小二乘法估算,实际存在径向畸变下的畸变系数;
- 极大似然法,优化估计,提升估计精度;
代码:
int main(void)
{int i;
Mat image0=imread("image0.png");
Mat image1=imread("image0.1.png");
Mat imageout;
vector<int> x,x1;
vector<int> y,y1;
Mat aChannels[3];Mat gray,gray1; vector<Point2f> pts_src;vector<Point2f> pts_dst;
Mat b;Mat c;cv::Mat d ;
get_image_points(image0,x,y);
get_image_points(image1,x1,y1);
cvtColor(image0,gray,COLOR_BGR2GRAY);
cvtColor(image1,gray1,COLOR_BGR2GRAY);
findChessboardCorners(gray,Size(8,6),pts_src);
findChessboardCorners(gray1,Size(8,6),pts_dst);
cout<<pts_src.size()<<endl;
cout<<pts_dst.size()<<endl;
Mat h=findHomography(pts_src,pts_dst);
cout<<h<<endl;
imshow("image0",image0);
imshow("image1",image1);
warpPerspective(image0,imageout,h,image0.size());
imshow("imageout",imageout);
waitKey();
}
最后
以上就是无辜酸奶为你收集整理的相机矫正(c++ 实现)的全部内容,希望文章能够帮你解决相机矫正(c++ 实现)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复