利用opencv自带源码进行摄像机定标(2)

本文详细介绍了如何使用OpenCV进行摄像头标定并利用标定结果进行图像矫正。通过使用initUndistortRectifyMap和remap函数替代caUndistort2函数,实现了一次性完成畸变映射计算和图像矫正的过程。示例代码展示了读取摄像头参数、矫正图像及显示矫正前后效果的方法。此外,文章强调了进行矫正前必须先进行定标的重要性,并提供了定标参数的读取方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇文章中讲述了如何利用opencv 自带源码进行摄像头标定,本篇讲一下如何利用标定结果进行图像矫正


1、使用的函数

可以使用caUndistort2()函数一次性完成畸变映射计算和图像矫正,但对于同一个摄像头拍摄出来的图像,进行一次畸变映射即可,不需要每帧图像都进行畸变映射。因此caUndistort2()运行效率不高,聪明的方法是使用畸变映射计算和图像矫正运算两个函数替代caUndistort2()。

畸变映射函数:initUndistortRectifyMap()

矫正函数:remap()

2、示例

CvCapture * capture=cvCreateCameraCapture();

IplImage *image=cvQueryFrame(capture);

initUndistortRectifyMap(/****输入你的参数****/)

while(image){


cvRemap(/****输入你的参数****/)

image=cvQueryFrame(capture);

}

3、效果

矫正前

校正后

 


4、注意

进行矫正前必须先进行定标,获取摄像头的参数,定标过程见上面,定标之后可以通过

FileStorage fs2("%path%/\\cameral2.yml", FileStorage::READ);  来读取定标参数矩阵。定标过程中,尽量将图片占满全屏,或者向屏幕边缘处靠近,因为屏幕边缘处的畸变最大,这样才能更真实的测出摄像头的畸变参数。


下面是我实际使用的代码:

       

      CvCapture * capture=cvCreateCameraCapture();

IplImage *image=cvQueryFrame(capture);


       //读取摄像头参数
FileStorage fs2("D:\\work\\车牌识别\\车牌识别_佟兴宇\\Debug\\cameral2.yml", FileStorage::READ);  
  
int frameCount = (int)fs2["nframes"];  
  
std::string date;  
fs2["calibration_time"] >> date;  
  
Mat cameraMatrix, distCoeffs;  
fs2["camera_matrix"] >> cameraMatrix;  
fs2["distortion_coefficients"] >> distCoeffs;  
  
cout << "frameCount: " << frameCount << endl  
<< "calibration date: " << date << endl  
<< "camera matrix: " << cameraMatrix << endl  
<< "distortion coeffs: " << distCoeffs << endl;  

Mat view,rview, map1, map2;
initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(),
getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0),
imageSize, CV_16SC2, map1, map2);


   

while(image){

remap(view, rview, map1, map2, INTER_LINEAR);
imshow("view",view);
waitKey(15);
imshow("rview",rview);
waitKey(15);

image=cvQueryFrame(capture);

}


        



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值