uvc鱼眼相机畸变矫正标定、透视图变换为IPM图(鸟瞰图/俯视图)

news/2024/11/9 3:37:53/

最近在搞,uvc鱼眼相机畸变矫正标定、透视图变换为IPM图(鸟瞰图/俯视图),可给恶心坏了,先说说两个畸变矫正的函数吧,如下:fisheye::initUndistortRectifyMap(),  (注意我用的是鱼眼相机,你的如果是普通uvc相机,就用initUndistortRectifyMap()这个函数,前边没有fisheye::)和 getOptimalNewCameraMatrix();

fisheye::initUndistortRectifyMap()函数的使用方法:

fisheye::initUndistortRectifyMap(intrinsic_matrix,distortion_coeffs,R,intrinsic_matrix,image_size,CV_32FC1,mapx,mapy);

或者:


fisheye::initUndistortRectifyMap(intrinsic_matrix, distortion_coeffs, R,getOptimalNewCameraMatrix(intrinsic_matrix, distortion_coeffs, image_size, 0, image_size, 0), image_size, CV_32FC1, mapx, mapy);

两者的差别在哪里呢?就在fisheye::initUndistortRectifyMap()函数的第四个参数,第一种调用方法的第四个参数直接将原相机内参intrinsic_matrix作为输入参数,第二种方法的第四个参数的输入是 getOptimalNewCameraMatrix(),这个函数的作用是算出一个新的内参矩阵,通过调整他的第四个参数(0~1),可以调整畸变裁剪后的图像视野大小,0视野最小,1视野最大。

 

这两个函数在这里搜索,查看每个参数的意思。

后续在更新~~~

 

2019.7.9

都快忘了这茬,今天把坑补上,

完整的代码在https://github.com/LixinLu42/PerspectiveTransform,另欢迎骚扰我的github

下面简单介绍下大体思路,github上的代码很多注释掉的代码,可以忽略注释的代码,那是我自己调试的过程哈`~~~

相机内参和畸变系数需要畸变矫正得到,我会找时间上一下畸变矫正的代码。回来啦:标定的方法在这里:https://blog.csdn.net/weixin_39608351/article/details/95178269

单应矩阵H 的代码也需要计算,有时间我也会单独提交下,代码来啦:https://github.com/LixinLu42/Get_H

//相机的内参矩阵:intrinsic_matrix
cv::Mat intrinsic_matrix(3, 3, cv::DataType<float>::type); // Intrisic matrix
intrinsic_matrix.at<float>(0, 0) = 526.0460621686325;
intrinsic_matrix.at<float>(1, 0) = 0;
intrinsic_matrix.at<float>(2, 0) = 0;intrinsic_matrix.at<float>(0, 1) = 0;
intrinsic_matrix.at<float>(1, 1) = 527.7225009042863;
intrinsic_matrix.at<float>(2, 1) = 0;intrinsic_matrix.at<float>(0, 2) = 654.1771804245265;
intrinsic_matrix.at<float>(1, 2) = 320.8740042532168;
intrinsic_matrix.at<float>(2, 2) = 1;//相机的畸变参数	:distortion_coeffs
cv::Mat distortion_coeffs(4, 1, cv::DataType<float>::type);   // Distortion vector
distortion_coeffs.at<float>(0) = -0.0467926;
distortion_coeffs.at<float>(1) = 0.00453962;
distortion_coeffs.at<float>(2) = 0.000105393;
distortion_coeffs.at<float>(3) = -0.00195177;//相机经过畸变矫正后设置的新的内参:new_intrinsic_mat
Mat intrinsic_mat(intrinsic_matrix), new_intrinsic_mat;intrinsic_mat.copyTo(new_intrinsic_mat);//通过调节新的内参系数,调节视场大小,乘的系数越小视场越大
new_intrinsic_mat.at<float>(0, 0) *= 0.35*mul;
new_intrinsic_mat.at<float>(1, 1) *= 0.35*mul;
//通过调节新的内参系数,调节校正图中心,建议置于校正图中心
new_intrinsic_mat.at<float>(0, 2) = 0.5 *mul * src.cols;
new_intrinsic_mat.at<float>(1, 2) = 0.5 *mul * src.rows;Mat src1;
//fisheye::undistortImage的功能 = fisheye::initUndistortRectifyMap  + remap的功能
//fisheye::undistortImage(src, src1, intrinsic_matrix, distortion_coeffs, new_intrinsic_mat, size);fisheye::initUndistortRectifyMap(intrinsic_matrix,distortion_coeffs,R,new_intrinsic_mat, size,CV_32FC1,mapx,mapy);
//fisheye::initUndistortRectifyMap(intrinsic_matrix, distortion_coeffs, R,
//getOptimalNewCameraMatrix(intrinsic_matrix, distortion_coeffs,             //image_size, 1, size, 0), image_size, CV_32FC1, mapx, mapy);
imshow("src", src);cv::remap(src, src1, mapx, mapy, INTER_LINEAR);
imshow("remap", src1);
imwrite("remap.jpg", src1);
//Mat srcImage = src1.clone();
Mat grayImage;
cvtColor(src1, grayImage, CV_BGR2GRAY);//H矩阵的初始化
cv::Mat H(3, 3, cv::DataType<double>::type); // Intrisic matrix
H.at<double>(0, 0) = 104.8203858991843;
H.at<double>(1, 0) = -3.994835860613545;
H.at<double>(2, 0) = -0.0009548304773162318;H.at<double>(0, 1) = -315.3103170020404;
H.at<double>(1, 1) = 14.74016444899316;
H.at<double>(2, 1) = -0.04940749328807874;H.at<double>(0, 2) = 5979.5;
H.at<double>(1, 2) = 1407;H.at<double>(2,2) = 12 * mul;//控制图像大小参数Mat a=H.inv();cout << "..........H.............." << endl;cout << H << endl;cout << "..........a.............." << endl;cout << a << endl;cout << "..........end.............."<< endl;//将畸变矫正图变为IPM图warpAffine(tempBirdImage, birdImage, M, tempBirdImage.size());*/namedWindow("birdImage");imshow("birdImage", birdImage);imwrite("birdImage.jpg", birdImage);//imshow("The undistort image", src1);waitKey(0);return 0;
}

 


http://www.ppmy.cn/news/786139.html

相关文章

在计算机编程里pi是什么,计算机编程实现电机调速系统中PI参数的调节

计算机编程实现电机调速系统中PI参数的调节 在一般的电机调速系统中都存在电流反馈和速度反馈,它们大多使用PI调节器,但是调节器参数的确定需要反复调试.如果靠直接在控制程序中不断地改变参数,则需要不断地停机,修改参数,再开机.这样效率低, (本文共6页) 阅读全文>> 永磁…

什么是无刷直流电机?

无刷直流电动机是拆下电刷和换向器的电动机之一&#xff0c;这是直流电动机的缺点。它的特点是&#xff1a; &#xff08;1&#xff09;永磁场型更换直流电机&#xff08;定子侧&#xff09;和电枢绕组&#xff08;转子侧&#xff09;的磁场永磁体&#xff0c;将永磁体放置在转…

什么叫死区时间_死区时间

死区时间 死区时间是 PWM 输出时,为了使 H 桥或半 H 桥的上下管不会因为开关速度问题发生同时 导通而设置的一个保护时段。 由于 IGBT 等功率器件都存在 一定的结电容,所以会造成器件导通关断的延迟现象。 一般在设计电路时已尽量降低该影响, 比如尽量提高控制极驱动电压电流…

自动驾驶中的BEV感知都有哪些?IPM/空间变换/VAE/LSS汇总!

作者 | 一笑泯恩仇 编辑 | 汽车人 原文链接&#xff1a;https://zhuanlan.zhihu.com/p/507722579 点击下方卡片&#xff0c;关注“自动驾驶之心”公众号 ADAS巨卷干货&#xff0c;即可获取 点击进入→自动驾驶之心【BEV感知】技术交流群 后台回复【3D检测综述】获取最新基于点…

菜鸟我眼中的IPM++

大家好,这是我的第一篇CSDN博客,请不要误会,我是个后IPM++(待会解释啥是IPM++),而不是纯技术青年!在给这篇博客取标题的时候,我很纠结!毕竟这是我的第一篇博客,但是最终还是硬着头皮写下了“菜鸟我眼中的IPM++"这个标题。可能大家会疑惑,"PM"是啥呢?…

IPM访谈问题

IPM&#xff1a;Intergrated Project Management&#xff0c;集成项目管理 一、访谈问题&#xff1a; 1、对组织级的过程是如何裁剪的? PM根据客户要求、项目特性&#xff0c;从标准过程资产库中选择匹配的“生命周期模型”和标准过程&#xff0c;并根据裁减指南进行裁减以…

计算机伺服系统的作用是,伺服系统的发展趋势 - 伺服系统什么意思_伺服系统的作用是什么...

伺服系统的发展趋势 1、交流化 伺服技术将继续迅速地由DC伺服系统转向AC伺服系统。从目前国际市场的情况看&#xff0c;几乎所有的新产品都是AC伺服系统。在工业发达国家&#xff0c;AC伺服电机的  市场占有率已经超过80%。在国内生产AC伺服电机的厂家也越来越多&#xff0c;…

什么是scrum中的3355

scrum的3355是指&#xff1a; 3个工件&#xff1a;Product Backlog,Sprint Backlog,潜在可交付的产品增量 3个角色&#xff1a;Product Owner,Scrum Master,Scrum Team 5个会议&#xff1a; Sprint Planning&#xff08;IPM&#xff09;&#xff1a;Sprint计划会议在Sprint…