﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-BLIZZARD-文章分类-Computer Vsion</title><link>http://www.cppblog.com/zk54188/category/13736.html</link><description>蜗牛-&gt;--&gt;---&gt;----&gt;-----&gt;------&gt;大牛？^_^</description><language>zh-cn</language><lastBuildDate>Tue, 18 May 2010 20:04:01 GMT</lastBuildDate><pubDate>Tue, 18 May 2010 20:04:01 GMT</pubDate><ttl>60</ttl><item><title>视觉入门（1）</title><link>http://www.cppblog.com/zk54188/articles/115626.html</link><dc:creator>BLIZZARD</dc:creator><author>BLIZZARD</author><pubDate>Mon, 17 May 2010 12:07:00 GMT</pubDate><guid>http://www.cppblog.com/zk54188/articles/115626.html</guid><wfw:comment>http://www.cppblog.com/zk54188/comments/115626.html</wfw:comment><comments>http://www.cppblog.com/zk54188/articles/115626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zk54188/comments/commentRss/115626.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zk54188/services/trackbacks/115626.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 最近，一直和相机标定纠缠不行，属于典型的看了就忘，所以决定把学到的东西全都记录下来，祈祷自己能够掌握~<br>&nbsp;&nbsp;&nbsp; 首先我们有相机的坐标系模型（如下图，引自《Learning OpenCV》）：<br>&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.cppblog.com/images/cppblog_com/zk54188/1.jpg" width="548" height="322"><br>&nbsp;&nbsp;&nbsp; 摄像机标定就是为了确定摄像机的内外参数，内参数构成了一个3X3的矩阵M，我们有q=MQ，即内参数矩阵可以实现物理点Q到投影平面的投影变换。外参数包括畸变系数和变换矩阵，变换矩阵是和图像相关的。OpenCV对相机的标定采用棋盘标定法，标定过程主要使用的函数是<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;cvCalibrateCamera2(<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;object_points,<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;image_points,<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;piont_counts,<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvSize&nbsp;image_size,<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;intrinsic_matrix,<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;distortion_coeffs,<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;rotation_vectors&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL,<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;translation_vectors&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL,<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;flags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; 这个函数，用起来其实很麻烦，object_points需要自己构造，其存储的是在世界坐标系下特征点的三维坐标，为了方便起见，通常都以棋盘所在平面为Z平面，构造时候对坐标值的设置就决定了其它变量所采用的度量单位。image_points是cvFindChessBoardCorners（）得到的棋盘特征点，注意是所有图像的特征点的集合。point_counts则记录了每幅图像的特征点数，image_size是标定图像的大小。intrinsic_matrix、distrotion_coeffs则是输出的内外参数，rotation_vectros、translation_vectors则是从摄像机坐标系到我们之前所定义的棋盘坐标系的变换矩阵，通常并不需要求出，最后一个flags变量，非常有学问，需要特殊说明一下。<br>&nbsp;&nbsp;&nbsp; 由于对内外参数的标定实际上是个最优化的过程，因此设置初始值对结果的影响就很大。而对于flag的设置主要就是围绕初始值的估计和一些假设进行的。在此不一一列举了，一般使用的是CV_CALIB_FIX_ASPECT_RATIO，这时需要将fx、fy初始化。<br>&nbsp;&nbsp;&nbsp; 那么标定好一个摄像机之后有什么用呢？首先第一个用处，就是我们给定一个物理三维坐标，就可以进行投影，得到其在图像中的图像坐标了。这里需要用的函数是：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;cvProjectPoints2(&nbsp;<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;object_points,&nbsp;<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;rotation_vector,<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;translation_vector,&nbsp;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;intrinsic_matrix,<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;distortion_coeffs,&nbsp;<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;image_points,<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dpdrot</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL,&nbsp;<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dpdt</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL,&nbsp;<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dpdf</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL,<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dpdc</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL,&nbsp;<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CvMat</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dpddist</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL&nbsp;<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">);<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"></span></div>
&nbsp;&nbsp;&nbsp; 具体参数的就不一一说明了，很多都和标定一致，object_points可以是任意的输入点了。需要注意的是object_points应该和image_points维数一致。<br>&nbsp;&nbsp;&nbsp; 这里的标定是一个相机的标定，而在这次毕设的工作中需要进行一对相机的标定也即立体定标，关于立体标定以及OpenCV一些实现的问题下次coding完了再总结吧~~~<br><br>&nbsp;&nbsp;&nbsp; <br><br> <img src ="http://www.cppblog.com/zk54188/aggbug/115626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zk54188/" target="_blank">BLIZZARD</a> 2010-05-17 20:07 <a href="http://www.cppblog.com/zk54188/articles/115626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>