1. // 引入实际标定板方格宽度的标定程序
  2. #include <string>
  3. #include <iostream>
  4. #include <cv.h>
  5. #include <highgui.h>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11. CvCapture* capture; //摄像头指针
  12. capture=cvCreateCameraCapture();
  13. if(capture==){
  14. printf("无法捕获摄像头设备!\n\n");
  15. return ;
  16. }else{
  17. printf("捕获摄像头设备成功!!\n\n");
  18. }
  19. IplImage* frame; //图像指针
  20. cvNamedWindow("摄像机帧截取窗口",);
  21. printf("按“C”键截取当前帧并保存为标定图片...\n按“Q”键退出截取帧过程...\n\n");
  22. int number_image=; //文件名后的编号,从1开始,也是截取的图像帧数
  23. char filename[]=""; //保存文件名的字符串数组
  24. while(true)
  25. {
  26. frame=cvQueryFrame(capture);
  27. if(!frame)
  28. break;
  29. cvShowImage("摄像机帧截取窗口",frame);
  30.  
  31. if(cvWaitKey()=='c'){
  32. sprintf (filename,"%d.jpg",number_image);
  33. cvSaveImage(filename,frame);
  34. cout<<"成功获取当前帧,并以文件名"<<filename<<"保存...\n\n";
  35. printf("按“C”键截取当前帧并保存为标定图片...\n按“Q”键退出截取帧过程...\n\n");
  36. number_image++;
  37. }else if(cvWaitKey()=='q'){
  38. printf("截取图像帧过程完成...\n\n");
  39. cout<<"共成功截取"<<--number_image<<"帧图像!!\n\n";
  40. break;
  41. }
  42. }
  43. cvReleaseImage(&frame);
  44. cvReleaseCapture(&capture);
  45. cvDestroyWindow("摄像机帧截取窗口");
  46.  
  47. IplImage * show; //RePlay图像指针
  48. cvNamedWindow("RePlay",);
  49. int number_image_copy=number_image; //复制图像帧数
  50. CvSize board_size=cvSize(,); //标定板角点数
  51. CvSize2D32f square_size=cvSize2D32f(18.2,18.2); //cvSize2D32f( double width, double height );假设我的每个标定方格长宽都是1.82厘米
  52. float square_length=square_size.width; //方格长度
  53. float square_height=square_size.height; //方格高度
  54. int board_width=board_size.width; //每行角点数
  55. int board_height=board_size.height; //每列角点数
  56. int total_per_image=board_width*board_height; //每张图片角点总数
  57. int count; //存储每帧图像中实际识别的角点数
  58. int found; //识别标定板角点的标志位
  59. int step; //存储步长,step=successes*total_per_image;
  60. int successes=; //存储成功找到标定板上所有角点的图像帧数
  61. int a=; //临时变量,表示在操作第a帧图像
  62.  
  63. CvPoint2D32f * image_points_buf = new CvPoint2D32f[total_per_image]; //存储角点图像坐标的数组
  64. CvMat * image_points=cvCreateMat(number_image*total_per_image,,CV_32FC1); //存储角点的图像坐标的矩阵
  65. CvMat * object_points=cvCreateMat(number_image*total_per_image,,CV_32FC1); //存储角点的三维坐标的矩阵
  66. CvMat * point_counts=cvCreateMat(number_image,,CV_32SC1); //存储每帧图像的识别的角点数
  67. CvMat * intrinsic_matrix=cvCreateMat(,,CV_32FC1); //内参数矩阵
  68. CvMat * distortion_coeffs=cvCreateMat(,,CV_32FC1); //畸变系数
  69.  
  70. while(a<=number_image_copy){
  71. sprintf (filename,"%d.jpg",a);
  72. show=cvLoadImage(filename,-);
  73. found=cvFindChessboardCorners(show,board_size,image_points_buf,&count,
  74. CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);
  75. if(found==){ //如果没找到标定板角点时
  76. cout<<"第"<<a<<"帧图片无法找到棋盘格所有角点!\n\n";
  77. cvNamedWindow("RePlay",);
  78. cvShowImage("RePlay",show);
  79. cvWaitKey();
  80.  
  81. }else{ //找到标定板角点时
  82. cout<<"第"<<a<<"帧图像成功获得"<<count<<"个角点...\n";
  83. cvNamedWindow("RePlay",);
  84. IplImage * gray_image= cvCreateImage(cvGetSize(show),,);
  85. cvCvtColor(show,gray_image,CV_BGR2GRAY);
  86. cout<<"获取源图像灰度图过程完成...\n";
  87. cvFindCornerSubPix(gray_image,image_points_buf,count,cvSize(,),cvSize(-,-),
  88. cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,,0.1));
  89. cout<<"灰度图亚像素化过程完成...\n";
  90. cvDrawChessboardCorners(show,board_size,image_points_buf,count,found);
  91. cout<<"在源图像上绘制角点过程完成...\n\n";
  92. cvShowImage("RePlay",show);
  93. cvWaitKey();
  94. }
  95.  
  96. if(total_per_image==count){
  97. step=successes*total_per_image; //计算存储相应坐标数据的步长
  98. for(int i=step,j=;j<total_per_image;++i,++j){
  99. CV_MAT_ELEM(*image_points,float,i,)=image_points_buf[j].x;
  100. CV_MAT_ELEM(*image_points,float,i,)=image_points_buf[j].y;
  101. CV_MAT_ELEM(*object_points,float,i,)=(float)((j/board_width)*square_length);
  102. CV_MAT_ELEM(*object_points,float,i,)=(float)((j%board_width)*square_height);
  103. CV_MAT_ELEM(*object_points,float,i,)=0.0f;
  104. }
  105. CV_MAT_ELEM(*point_counts,int,successes,)=total_per_image;
  106. successes++;
  107. }
  108. a++;
  109. }
  110.  
  111. cvReleaseImage(&show);
  112. cvDestroyWindow("RePlay");
  113.  
  114. cout<<"*********************************************\n";
  115. cout<<number_image<<"帧图片中,标定成功的图片为"<<successes<<"帧...\n";
  116. cout<<number_image<<"帧图片中,标定失败的图片为"<<number_image-successes<<"帧...\n\n";
  117. cout<<"*********************************************\n\n";
  118.  
  119. cout<<"按任意键开始计算摄像机内参数...\n\n";
  120.  
  121. CvCapture* capture1;
  122. capture1=cvCreateCameraCapture();
  123. IplImage * show_colie;
  124. show_colie=cvQueryFrame(capture1);
  125.  
  126. CvMat * object_points2=cvCreateMat(successes*total_per_image,,CV_32FC1);
  127. CvMat * image_points2=cvCreateMat(successes*total_per_image,,CV_32FC1);
  128. CvMat * point_counts2=cvCreateMat(successes,,CV_32SC1);
  129.  
  130. for(int i=;i<successes*total_per_image;++i){
  131. CV_MAT_ELEM(*image_points2,float,i,)=CV_MAT_ELEM(*image_points,float,i,);
  132. CV_MAT_ELEM(*image_points2,float,i,)=CV_MAT_ELEM(*image_points,float,i,);
  133. CV_MAT_ELEM(*object_points2,float,i,)=CV_MAT_ELEM(*object_points,float,i,);
  134. CV_MAT_ELEM(*object_points2,float,i,)=CV_MAT_ELEM(*object_points,float,i,);
  135. CV_MAT_ELEM(*object_points2,float,i,)=CV_MAT_ELEM(*object_points,float,i,);
  136. }
  137.  
  138. for(int i=;i<successes;++i){
  139. CV_MAT_ELEM(*point_counts2,int,i,)=CV_MAT_ELEM(*point_counts,int,i,);
  140. }
  141.  
  142. cvReleaseMat(&object_points);
  143. cvReleaseMat(&image_points);
  144. cvReleaseMat(&point_counts);
  145.  
  146. //初始化相机内参矩阵
  147. CV_MAT_ELEM(*intrinsic_matrix,float,,)=1.0f;
  148. CV_MAT_ELEM(*intrinsic_matrix,float,,)=1.0f;
  149.  
  150. //标定相机的内参矩阵和畸变系数向量
  151. cvCalibrateCamera2(object_points2,image_points2,point_counts2,cvGetSize(show_colie),
  152. intrinsic_matrix,distortion_coeffs,NULL,NULL,);
  153.  
  154. cout<<"摄像机内参数矩阵为:\n";
  155. cout<<CV_MAT_ELEM(*intrinsic_matrix,float,,)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,,)
  156. <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,,)
  157. <<"\n\n";
  158. cout<<CV_MAT_ELEM(*intrinsic_matrix,float,,)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,,)
  159. <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,,)
  160. <<"\n\n";
  161. cout<<CV_MAT_ELEM(*intrinsic_matrix,float,,)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,,)
  162. <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,,)
  163. <<"\n\n";
  164.  
  165. cout<<"畸变系数矩阵为:\n";
  166. cout<<CV_MAT_ELEM(*distortion_coeffs,float,,)<<" "<<CV_MAT_ELEM(*distortion_coeffs,float,,)
  167. <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,,)
  168. <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,,)
  169. <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,,)
  170. <<"\n\n";
  171.  
  172. cvSave("Intrinsics.xml",intrinsic_matrix);
  173. cvSave("Distortion.xml",distortion_coeffs);
  174.  
  175. cout<<"摄像机矩阵、畸变系数向量已经分别存储在名为Intrinsics.xml、Distortion.xml文档中\n\n";
  176.  
  177. CvMat * intrinsic=(CvMat *)cvLoad("Intrinsics.xml");
  178. CvMat * distortion=(CvMat *)cvLoad("Distortion.xml");
  179.  
  180. IplImage * mapx=cvCreateImage(cvGetSize(show_colie),IPL_DEPTH_32F,);
  181. IplImage * mapy=cvCreateImage(cvGetSize(show_colie),IPL_DEPTH_32F,);
  182.  
  183. cvInitUndistortMap(intrinsic,distortion,mapx,mapy);
  184.  
  185. cvNamedWindow("原始图像",);
  186. cvNamedWindow("非畸变图像",);
  187.  
  188. cout<<"按‘E’键退出显示...\n\n";
  189.  
  190. while(show_colie){
  191. IplImage * clone=cvCloneImage(show_colie);
  192. cvShowImage("原始图像",show_colie);
  193. cvRemap(clone,show_colie,mapx,mapy);
  194. cvReleaseImage(&clone);
  195. cvShowImage("非畸变图像",show_colie);
  196.  
  197. if(cvWaitKey()=='e'){
  198. break;
  199. }
  200.  
  201. show_colie=cvQueryFrame(capture1);
  202. }
  203.  
  204. return ;
  205.  
  206. }

opencv单目摄像机标定(二)的更多相关文章

  1. opencv单目摄像机标定(一)

    #include <string> #include <iostream> #include <cv.h> #include <highgui.h> u ...

  2. opencv单目摄像机标定

    #include <cv.h> #include <highgui.h> #include <iostream> #include <stdio.h> ...

  3. 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定

    本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)--单目摄像机标定参数说明之后 ...

  4. 基于OpenCV单目相机的快速标定--源码、工程、实现过程

    相机的标定是所有人走进视觉世界需要做的第一件事,辣么多的视觉标定原理解释你可以随便在网上找到,这里只讲到底如何去实现,也算是给刚入门的朋友做个简单的分享. 1.单目相机标定的工程源码 首先请到同性交友 ...

  5. matlab单目相机标定——标定步骤以及参数含义

    参考博客园的一篇文章: https://www.cnblogs.com/flyinggod/p/8470407.html#commentform

  6. 基于EmguCV的摄像机标定及矫正

    标签: EmguCV摄像头标定C# 2015-05-03 14:55 501人阅读 评论(6) 收藏 举报  分类: C# 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] ...

  7. [OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII

    部分 VII摄像机标定和 3D 重构 OpenCV-Python 中文教程(搬运)目录 42 摄像机标定 目标 • 学习摄像机畸变以及摄像机的内部参数和外部参数 • 学习找到这些参数,对畸变图像进行修 ...

  8. 【OpenCV】摄像机标定+畸变校正

      摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过OpenCV进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.open ...

  9. 用OpenCV进行摄像机标定

    用OpenCV进行摄像机标定 照相机已经存在很长时间了.然而,随着廉价针孔相机在20世纪末的引入,日常生活中变得司空见惯.不幸的是,这种廉价伴随着它的代价:显著的扭曲.幸运的是,这些常数,通过校准和一 ...

随机推荐

  1. Eclipse导入Tomcat源码(转)

    想要研究下Tomcat的体系结构或者源码,最好将Tomcat的源码导入到ide中,编写实例进行代码跟踪(debug). 这里参考了网上一些资料,将自己操作过程记个流水账. 准备: 1.Tomcat源码 ...

  2. backprop示例

    http://home.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html

  3. 20条Linux命令面试问答

    程序师  http://www.techug.com/20-linux-command-interview-questions 问:1 如何查看当前的Linux服务器的运行级别? 答: ‘who -r ...

  4. 英语学习app分析

    以下数据分析由队员张波收集整理队员链接 队友的博客 一.数据统计 为了让统计数据更加准确可信,我们选取了三款android平台的应用市场软件作为数据的来源. 英语学习app下载量统计表: 序号 应用名 ...

  5. grub的sol

    http://smcijohnny.blogspot.com/2015/06/linuxsolserial-over-lan.html https://www.hiroom2.com/2016/06/ ...

  6. Openstack Day1简介及虚拟环境搭建

    本文章仅作为作者本人存档记忆!恕不详细展开内容!   openstack kilo版本重要组件(module)简介 ======================================= Ke ...

  7. 关于Oracle数据库字符集

    我们现在使用的字符集有以下两种: 推荐使用 AL32UTF8,避免以后数据导入导出字符集不同的麻烦. 推荐数据库设置参考图:

  8. Ninject之旅之六:Ninject约定

    摘要 在小的应用系统中一个一个注册一些服务类型不怎么困难.但是,如果是一个实际的有上百个服务的应用程序呢?约定配置允许我们使用约定绑定一组服务,而不用一个一个分别绑定. 要使用约定配置,需要添加Nin ...

  9. 解决ASP.Net第一次访问慢的处理(IIS8)

    本篇经验以IIS8,Windows Server 2012R2做为案例. IIS8 运行在 Windows Server 2012 and Windows 8 版本以上的平台上. IIS中应用程序池和 ...

  10. PHP简单利用token防止表单重复提交

    <?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_S ...