OPENCV3.0 单目摄像头标定(使用官方自带的标定图片)
OPENCV3.0 单目摄像头标定(使用官方自带的标定图片)
转载于:https://blog.csdn.net/zc850463390zc/article/details/48946855
// opencv_test.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <highgui.hpp>
#include "cv.h"
#include <cv.hpp>
#include <iostream>using namespace std;
using namespace cv;const int imageWidth = 640; //摄像头的分辨率
const int imageHeight = 480;
const int boardWidth = 9; //横向的角点数目
const int boardHeight = 6; //纵向的角点数据
const int boardCorner = boardWidth * boardHeight; //总的角点数据
const int frameNumber = 13; //相机标定时需要采用的图像帧数
const int squareSize = 20; //标定板黑白格子的大小 单位mm
const Size boardSize = Size(boardWidth, boardHeight); //Mat intrinsic; //相机内参数
Mat distortion_coeff; //相机畸变参数
vector<Mat> rvecs; //旋转向量
vector<Mat> tvecs; //平移向量
vector<vector<Point2f>> corners; //各个图像找到的角点的集合 和objRealPoint 一一对应
vector<vector<Point3f>> objRealPoint; //各副图像的角点的实际物理坐标集合vector<Point2f> corner; //某一副图像找到的角点Mat rgbImage, grayImage;/*计算标定板上模块的实际物理坐标*/
void calRealPoint(vector<vector<Point3f>>& obj, int boardwidth,int boardheight, int imgNumber, int squaresize)
{
// Mat imgpoint(boardheight, boardwidth, CV_32FC3,Scalar(0,0,0));vector<Point3f> imgpoint;for (int rowIndex = 0; rowIndex < boardheight; rowIndex++){for (int colIndex = 0; colIndex < boardwidth; colIndex++){// imgpoint.at<Vec3f>(rowIndex, colIndex) = Vec3f(rowIndex * squaresize, colIndex*squaresize, 0);imgpoint.push_back(Point3f(rowIndex * squaresize, colIndex * squaresize, 0));}}for (int imgIndex = 0; imgIndex < imgNumber; imgIndex++){obj.push_back(imgpoint);}
}/*设置相机的初始参数 也可以不估计*/
void guessCameraParam(void )
{/*分配内存*/intrinsic.create(3, 3, CV_64FC1);distortion_coeff.create(5, 1, CV_64FC1);/*fx 0 cx0 fy cy0 0 1*/intrinsic.at<double>(0,0) = 256.8093262; //fx intrinsic.at<double>(0, 2) = 160.2826538; //cxintrinsic.at<double>(1, 1) = 254.7511139; //fyintrinsic.at<double>(1, 2) = 127.6264572; //cyintrinsic.at<double>(0, 1) = 0;intrinsic.at<double>(1, 0) = 0;intrinsic.at<double>(2, 0) = 0;intrinsic.at<double>(2, 1) = 0;intrinsic.at<double>(2, 2) = 1;/*k1 k2 p1 p2 p3*/distortion_coeff.at<double>(0, 0) = -0.193740; //k1distortion_coeff.at<double>(1, 0) = -0.378588; //k2distortion_coeff.at<double>(2, 0) = 0.028980; //p1distortion_coeff.at<double>(3, 0) = 0.008136; //p2distortion_coeff.at<double>(4, 0) = 0; //p3
}void outputCameraParam(void )
{/*保存数据*///cvSave("cameraMatrix.xml", &intrinsic);//cvSave("cameraDistoration.xml", &distortion_coeff);//cvSave("rotatoVector.xml", &rvecs);//cvSave("translationVector.xml", &tvecs);/*输出数据*/cout << "fx :" << intrinsic.at<double>(0, 0) << endl << "fy :" << intrinsic.at<double>(1, 1) << endl;cout << "cx :" << intrinsic.at<double>(0, 2) << endl << "cy :" << intrinsic.at<double>(1, 2) << endl;cout << "k1 :" << distortion_coeff.at<double>(0, 0) << endl;cout << "k2 :" << distortion_coeff.at<double>(1, 0) << endl;cout << "p1 :" << distortion_coeff.at<double>(2, 0) << endl;cout << "p2 :" << distortion_coeff.at<double>(3, 0) << endl;cout << "p3 :" << distortion_coeff.at<double>(4, 0) << endl;
}int _tmain(int argc, _TCHAR* argv[])
{Mat img;int goodFrameCount = 0;namedWindow("chessboard");cout << "按Q退出 ..." << endl;while (goodFrameCount < frameNumber){char filename[100];sprintf_s(filename,"image\\left%02d.jpg", goodFrameCount + 1);// cout << filename << endl;rgbImage = imread(filename, CV_LOAD_IMAGE_COLOR);cvtColor(rgbImage, grayImage, CV_BGR2GRAY);imshow("Camera", grayImage);bool isFind = findChessboardCorners(rgbImage, boardSize, corner,0);if (isFind == true) //所有角点都被找到 说明这幅图像是可行的{/*Size(5,5) 搜索窗口的一半大小Size(-1,-1) 死区的一半尺寸TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 20, 0.1)迭代终止条件*/cornerSubPix(grayImage, corner, Size(5,5), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 20, 0.1));drawChessboardCorners(rgbImage, boardSize, corner, isFind);imshow("chessboard", rgbImage);corners.push_back(corner);//string filename = "res\\image\\calibration";//filename += goodFrameCount + ".jpg";//cvSaveImage(filename.c_str(), &IplImage(rgbImage)); //把合格的图片保存起来goodFrameCount++;cout << "The image is good" << endl;}else{cout << "The image is bad please try again" << endl;}// cout << "Press any key to continue..." << endl;// waitKey(0);if (waitKey(10) == 'q'){break;}// imshow("chessboard", rgbImage);}/*图像采集完毕 接下来开始摄像头的校正calibrateCamera()输入参数 objectPoints 角点的实际物理坐标imagePoints 角点的图像坐标imageSize 图像的大小输出参数cameraMatrix 相机的内参矩阵distCoeffs 相机的畸变参数rvecs 旋转矢量(外参数)tvecs 平移矢量(外参数)*//*设置实际初始参数 根据calibrateCamera来 如果flag = 0 也可以不进行设置*/guessCameraParam(); cout << "guess successful" << endl;/*计算实际的校正点的三维坐标*/calRealPoint(objRealPoint, boardWidth, boardHeight,frameNumber, squareSize);cout << "cal real successful" << endl;/*标定摄像头*/calibrateCamera(objRealPoint, corners, Size(imageWidth, imageHeight), intrinsic, distortion_coeff, rvecs, tvecs, 0);cout << "calibration successful" << endl;/*保存并输出参数*/outputCameraParam();cout << "out successful" << endl;/*显示畸变校正效果*/Mat cImage;undistort(rgbImage, cImage, intrinsic, distortion_coeff);imshow("Corret Image", cImage);cout << "Correct Image" << endl;cout << "Wait for Key" << endl;waitKey(0);system("pause");return 0;
}
OPENCV3.0版本跟2.x版本是有一点差距的,这个程序在2.4.11版本里面跑不起来。
找了很久都没有找到错误,主要是在calibrateCamera()函数的时候出错。
也参考了官方的calibration例程,但还是找不到错误在什么地方。
下面是3.0版本的代码 注释都在代码里面
OPENCV3.0 单目摄像头标定(使用官方自带的标定图片)相关推荐
- 单目摄像头的内外参标定
任务动机:基于ORB-SLAM3+单目广角摄像头进行二次开发,辅助激光导航实现机器人全局重定位.需要对单目摄像头进行内参和外参标定. 任务描述: 1. 镜头畸变和内参标定 用棋盘格标定 2. 摄像机与 ...
- python opencv 摄像头标定_(五)单目摄像头标定与畸变矫正(C++,opencv)
本文将梳理一种单目摄像头标定和矫正的方法,在梳理的过程中,首先使用网上离线的图片数据跑通流程,然后接入自己的camera,手动采集标定图像,实时矫正相机的畸变,然后输出矫正后的图像.全文基于Openc ...
- 3D视觉(二):单目摄像头的标定与校正
3D视觉(二):单目摄像头的标定与校正 文章目录 3D视觉(二):单目摄像头的标定与校正 一.相机模型 1.机器车坐标系到相机坐标系 2.相机坐标系到归一化平面坐标系 3.归一化平面坐标畸变 4.归一 ...
- 单目摄像头标定与测距
单目摄像头标定与测距 一. 标定 首先要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这里顺带提一句,这本书虽然确实老,但有些理论.算法类的东西里面还是讲的很不错的,必 ...
- 【机器人原理与实践(二)】单目摄像头标定与单目测距
文章目录 摄像头标定 4.1 单目相机的建模 4.1.1 图像坐标系到像素坐标系的转换 4.1.2相机坐标系到图像坐标系的转换 4.1.3 合并矩阵 4.2 固定向下摄像头标定 4.3 俯视摄像头标定 ...
- 基于matlab的摄像头,基于Matlab的单目摄像头标定
实验环境:matlab2016 准备材料:单目摄像头.定标板.摄像头拍下定标板的图片 本博客带大家实际动手,再讲单目摄像头标定原理. 准备标定板 标定的开始阶段最需要用到的标定板,可以直接从openc ...
- 基于Matlab工具箱进行单目摄像头标定
实验环境:matlab2016 准备材料:单目摄像头.定标板.摄像头拍下定标板的图片 本博客带大家实际动手,再讲单目摄像头标定原理. 准备标定板 标定的开始阶段最需要用到的标定板,可以直接从openc ...
- 单目摄像头检测6D姿态
单目摄像头检测6D姿态 CVPR2019: ROI-10D: Monocular Lifting of 2D Detection to 6D Pose and Metric Shape 论文链接: h ...
- 单目摄像头光学图像测距_摄像头与毫米波雷达(Radar)融合解析
01 摄像头和雷达的融合是很多做ADAS当前所关注的关键问题之一.因为单纯摄像头和雷达都无法解决测距问题.不仅在测距,今后可能所应用到的高精度地图也都是需要使用摄像头和雷达的融合才能够实现.当前寻求到 ...
最新文章
- 如何优雅的使用Mock Server
- python人工智能-Python 人工智能应用快速入门 (一)
- UPS技术培训系统方案
- 主题mysql_主题数据库(SubjectBase)
- python人工智能——机器学习——转换器与估计器
- webresource_Jersey WebResource –标头不附加
- opengl如何画出一个球_OpenGL-Controlling and Monitoring the Pipeline
- linux 如何关闭屏幕录像,如何使用GNOME Shell隐藏的屏幕录像工具
- POI上传Excel的小问题处理
- redux-saga使用
- php rbac 菜单生成,RBAC集成AdminLTE后台主题对菜单进行控制
- Finding all unique triplets that sums to zero[部分转载]
- 华为 EC169 3G上网卡在MacPro中的使用
- Linux开发环境搭建之cmake安装
- 软件测试的六大测试质量标准
- 微信小程序使用正则过滤电话号码
- 部署 LAMP 平台
- http响应码code含义
- 肝肠轴——看不见的Crosstalk
- 品牌热搜拆解 | 奈雪的茶上市、索尼道歉……
热门文章
- Shell脚本 – 查看网络接口信息
- 企业运维经典面试题汇总(3)
- 【SQL】日期型函数
- 解决sql2008附加不了2005的数据库文件的问题
- Android 内存泄漏分析与解决方法
- Cannot set property ‘innerHTML‘ of null 问题的解决
- Linux记录-重启后磁盘丢失问题解决方案
- 解决弹出的窗口window.open会被浏览器阻止的问题
- ORA-01795: 列表中的最大表达式数为1000的解决方法
- 异常:Error resolving template “xxx“, template might not exist or might not be accessible...解决办法