1. #include <cv.h>
  2. #include <highgui.h>
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. using namespace std;
  8.  
  9. int n_boards=;//图像数目
  10. const int board_dt=;//等20帧每棋盘视图 //int sn_board=0;//成功找到角点的图像数目
  11. int board_w;//图像的角点行列数 canshu
  12. int board_h; //canshu
  13. int main(int argc ,char * argv[])
  14. {
  15. /*读入图像*/
  16. board_w=; //canshu
  17. board_h=; //canshu
  18. n_boards=; //canshu
  19.  
  20. int board_n=board_h*board_w;//每幅图像的角点数
  21. CvSize board_size=cvSize(board_w,board_h);//每幅图像的角点数
  22. CvCapture*capture;
  23. capture=cvCreateCameraCapture();
  24. //assert(capture);
  25.  
  26. if(!capture) { printf("\nCouldn't open the camera\n"); return -;}
  27. cvNamedWindow("MyCalib");
  28. cvNamedWindow("Raw Video");
  29.  
  30. //allocate storage
  31. CvMat*object_points = cvCreateMat(board_n*n_boards,,CV_32FC1);
  32. CvMat*image_points =cvCreateMat(board_n*n_boards,,CV_32FC1);
  33. CvMat*point_counts =cvCreateMat(n_boards,,CV_32SC1);
  34. CvMat * camera_matrix =cvCreateMat(,,CV_32FC1);//摄像机矩阵(内参数矩阵)
  35. CvMat * distortion_coeffs=cvCreateMat(,,CV_32FC1);//畸变系数
  36. CvPoint2D32f*corners=new CvPoint2D32f[board_n];//一幅图像的角点数组
  37. int corner_count;
  38. int successes=; // 本文 successes就是 sn_board
  39. int step,frame=;
  40.  
  41. IplImage*image=cvQueryFrame(capture);
  42. IplImage *gray_image=cvCreateImage(cvGetSize(image),,);//创建头并分配数据
  43.  
  44. //亚像素subpixel
  45. //capture corner views loop until we've got n_boards
  46. //成功捕获(找到所有角点on the board)
  47.  
  48. while (successes<n_boards)
  49. { //skip every board_dt frames to allow user to move chessboard
  50. if(frame++%board_dt==)
  51. {
  52. int found=cvFindChessboardCorners(image,board_size,corners,&corner_count,CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);
  53.  
  54. //精确到亚像素,绘制棋盘角点
  55. cvCvtColor(image,gray_image,CV_BGR2GRAY);
  56. cvFindCornerSubPix(gray_image,corners,corner_count,cvSize(,),cvSize(-,-),cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,,0.1));
  57. cvDrawChessboardCorners(image,board_size,corners,corner_count,found);
  58. //cvShowImage("MyCalib",image);
  59.  
  60. //如果得到一个好板,则把把它加入到我们的数据中
  61. if(corner_count==board_n){ //xin
  62. cvShowImage( "Calibration", image ); //show in color if we did collect the image
  63. step=successes*board_n; //xin
  64. for(int i=step,j=;j<board_n;++i,++j){
  65. CV_MAT_ELEM(*image_points,float,i,) =corners[j].x;//CV_MAT_ELEM用来访问矩阵每个元素的宏,这个宏只对单通道矩阵有效,多通道会报错
  66. CV_MAT_ELEM(*image_points,float,i,) =corners[j].y;//(要访问的矩阵,矩阵元素的类型,所要访问元素的行数,列数)
  67. //上两句是将检测到的点以坐标形式存储
  68. CV_MAT_ELEM(*object_points,float,i,) =float(j/board_w);
  69. CV_MAT_ELEM(*object_points,float,i,) =float(j%board_w);
  70. //上两句是将检测到的点的数目,以行列形式存储
  71. CV_MAT_ELEM(*object_points,float,i,) =0.0f;
  72. }
  73. CV_MAT_ELEM(*point_counts,int,successes,)=board_n;
  74. successes++;
  75. printf("Collected our %d of %d needed chessboard images\n",successes,n_boards);
  76. }
  77. else
  78. cvShowImage( "Calibration", gray_image );//Show Gray if we didn't collect the image
  79. }//end skip board_dt between chessboard capture
  80.  
  81. //暂停模块
  82. int c = cvWaitKey();
  83. if(c == 'p'){
  84. c = ;
  85. while(c != 'p' && c != ){
  86. c = cvWaitKey();
  87. }
  88. }
  89. if(c == )
  90. return ;
  91. image = cvQueryFrame( capture ); //Get next image
  92. cvShowImage("Raw Video", image);
  93. } //END COLLECTION WHILE LOOP.
  94. cvDestroyWindow("Calibration");
  95. printf("\n\n*** CALLIBRATING THE CAMERA...");
  96.  
  97. //重新赋值,又重新分配了矩阵空间
  98. CvMat * object_points0= cvCreateMat(board_n*successes,,CV_32FC1);
  99. CvMat * image_points0=cvCreateMat(board_n*successes,,CV_32FC1);
  100. CvMat * point_counts0=cvCreateMat(successes,,CV_32SC1);
  101. //transfer THE points INTO THE correct size matrices
  102. for (int i=;i<successes*board_n;i++)//board_n为每幅图像的角点数*sn_board为成功找到角点的图像数目
  103. {
  104. CV_MAT_ELEM(*image_points0,float,i,)=CV_MAT_ELEM(*image_points,float,i,);
  105. CV_MAT_ELEM(*image_points0,float,i,)=CV_MAT_ELEM(*image_points,float,i,);
  106. CV_MAT_ELEM(*object_points0,float,i,)=CV_MAT_ELEM(*object_points,float,i,);
  107. CV_MAT_ELEM(*object_points0,float,i,)=CV_MAT_ELEM(*object_points,float,i,);
  108. CV_MAT_ELEM(*object_points0,float,i,)=0.0f;
  109. }
  110. for (int i=;i<successes;i++)
  111. {
  112. CV_MAT_ELEM(*point_counts0,int,i,)=CV_MAT_ELEM(*point_counts,int,i,);
  113. }
  114. cvReleaseMat(&object_points);//世界坐标点
  115. cvReleaseMat(&point_counts); //每张图像中的角点数
  116. cvReleaseMat(&image_points); //图像坐标点
  117. //使用cvReleaseMat函数之后,系统将释放刚才载入矩阵的内存空间(也即这个矩阵已经不在内存中了)
  118.  
  119. // At this point we have all of the chessboard corners we need
  120. // Initialize the intrinsic matrix such that the two focal
  121. // lengths have a ratio of 1.0
  122. CV_MAT_ELEM( *camera_matrix, float, , ) = 1.0f;
  123. CV_MAT_ELEM( *camera_matrix, float, , ) = 1.0f;
  124. //CALIBRATE THE CAMERA!
  125. cvCalibrateCamera2(
  126. object_points0, image_points0,
  127. point_counts0, cvGetSize( image ),
  128. camera_matrix, distortion_coeffs,
  129. NULL, NULL, //CV_CALIB_FIX_ASPECT_RATIO
  130. );
  131.  
  132. // SAVE THE INTRINSICS AND DISTORTIONS xin
  133. printf("......保存内部参数与畸变参数\n");
  134. cvSave("camera_matrix1111.xml",camera_matrix);
  135. cvSave("distortion_coeffs.xml",distortion_coeffs);
  136.  
  137. // EXAMPLE OF LOADING THESE MATRICES BACK IN: xin
  138. CvMat *intrinsic = (CvMat*)cvLoad("Intrinsics.xml");
  139. CvMat *distortion = (CvMat*)cvLoad("Distortion.xml");
  140.  
  141. // Build the undistort map which we will use for all
  142. // subsequent frames.建立不失真的图map
  143. //
  144. IplImage* mapx = cvCreateImage( cvGetSize(image), IPL_DEPTH_32F, );
  145. IplImage* mapy = cvCreateImage( cvGetSize(image), IPL_DEPTH_32F, );
  146. cvInitUndistortMap(intrinsic,distortion,mapx, mapy);
  147.  
  148. // Just run the camera to the screen, now showing the raw and
  149. // the undistorted image.
  150. //
  151. cvNamedWindow( "Undistort" );
  152. while(image) {
  153. IplImage *t = cvCloneImage(image);
  154. cvShowImage( "Raw Video", image ); // Show raw image
  155. cvRemap( t, image, mapx, mapy ); // Undistort image
  156. cvReleaseImage(&t);
  157. cvShowImage("Undistort", image); // Show corrected image
  158.  
  159. //Handle pause/unpause and ESC
  160. int c = cvWaitKey();
  161. if(c == 'p'){
  162. c = ;
  163. while(c != 'p' && c != ){
  164. c = cvWaitKey();
  165. }
  166. }
  167. if(c == )
  168. break;
  169. image = cvQueryFrame( capture );
  170. }
  171.  
  172. return ;
  173. }

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

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

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

  2. opencv单目摄像机标定(二)

    // 引入实际标定板方格宽度的标定程序 #include <string> #include <iostream> #include <cv.h> #include ...

  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. springMVC发送邮件

    springMVC发送邮件 利用javax.mail发送邮件,图片与附件都可发送 1,Controller类 package com.web.controller.api; import javax. ...

  2. ios中,在SearchBar里面搜索内容,可根据内容来查找所需的信息资源,可获得SearchBar中的内容

    贴一段我很久以前写的小demo,你们就明白了,是把textField套在alertView里的@interface ViewController : UIViewController <UIAl ...

  3. Linux 显示文件完整路径

    原链接 http://blog.chinaunix.net/uid-25266990-id-3268759.html ls foo | sed "s:^:`pwd`/:"

  4. 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

    (转自:http://blog.sina.com.cn/s/blog_5eca668b01018949.html)定义一个类,来对远程X.509证书的验证,进行处理,返回为true.我们要自己定义一个 ...

  5. 《从零开始做一个MEAN全栈项目》(3)

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 上一篇文章给大家讲了一下本项目的开发计划,这一章将会开始着手搭建一个MEAN项目.千里之行,始于足下, ...

  6. android bundle存放数据详解

    转载自:android bundle存放数据详解 正如大家所知道,Activity之间传递数据,是将数据存放在Intent或者Bundle中 例如: 将数据存放倒Intent中传递: 将数据放到Bun ...

  7. 在iframe中使用cookie需要注意

    cookie的使用早已不新鲜了,但是最近在做项目时还是被坑了一把. 那么接下来让我们来看一下这个"坑"是个什么情况! 前提: 1.现在有两个页面A.html, B.html,同时, ...

  8. AndroidStudio中activity实现去掉标题栏

    1.在代码中实现 this.requestWindowFeature(Window.FEATURE_NO_TITLE) 这段代码需要放在setContentView()前面 2.设置在Manifest ...

  9. wordpress woodstock主题导入demo xml文件 execution time out

    1.已设置php.ini max_execution_time = 240 导入显示设置60 2.wp-config.php 添加 set_time_limit(600); 无效 3. .htacce ...

  10. java笔试面试二

    http://www.cnblogs.com/lanxuezaipiao/p/3371224.html