-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
148 lines (101 loc) · 31.1 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>AbyssGaze</title>
<subtitle>pcl segmentations, slam, industry visual</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2017-06-14T05:56:18.000Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>Y.Chen</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Hexo多下标不正常解决方案</title>
<link href="http://yoursite.com/2017/06/14/hexo%E5%A4%9A%E4%B8%8B%E6%A0%87%E4%B8%8D%E6%AD%A3%E5%B8%B8%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/"/>
<id>http://yoursite.com/2017/06/14/hexo多下标不正常解决方案/</id>
<published>2017-06-14T03:20:47.000Z</published>
<updated>2017-06-14T05:56:18.000Z</updated>
<content type="html"><![CDATA[<p>hexo中下标不能正常显示,出现如:<br><img src="/images/不正常显示.png" title="错误情况" width="50%" height="50%" align="center/"><br>实际上是由于下划线<code>_</code>被渲染成 <code><em></code>标签,修改<code>marked.js</code>即可,<br>在你的工程下输入:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">find . -name <span class="string">'marked.js'</span></div></pre></td></tr></table></figure></p>
<p>将<code>marked.js</code>中的第459和490行的代码修改为:<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,</span></div><div class="line">em: <span class="regexp">/^\*((?:\*\*|[\s\S])+?)\*(?!\*)/</span>,</div></pre></td></tr></table></figure></p>
<p>和<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/</span></div><div class="line">em: <span class="regexp">/^\*(?=\S)([\s\S]*?\S)\*(?!\*)/</span></div></pre></td></tr></table></figure></p>
<p>然后部署即可。</p>
]]></content>
<summary type="html">
<p>hexo中下标不能正常显示,出现如:<br><img src="/images/不正常显示.png" title="错误情况" width="50%" height="50%" align="center/"><br>实际上是由于下划线<code>_</code>被渲染成
</summary>
<category term="工具" scheme="http://yoursite.com/categories/%E5%B7%A5%E5%85%B7/"/>
<category term="hexo" scheme="http://yoursite.com/tags/hexo/"/>
</entry>
<entry>
<title>基础矩阵求解</title>
<link href="http://yoursite.com/2017/06/10/%E5%9F%BA%E7%A1%80%E7%9F%A9%E9%98%B5%E6%B1%82%E8%A7%A3/"/>
<id>http://yoursite.com/2017/06/10/基础矩阵求解/</id>
<published>2017-06-10T11:05:11.000Z</published>
<updated>2017-06-14T10:25:31.000Z</updated>
<content type="html"><![CDATA[<p>最近在重新温故双目视觉相关的知识,此篇讲解对极几何、基础矩阵等相关知识。</p>
<h1 id="对极几何"><a href="#对极几何" class="headerlink" title="对极几何"></a>对极几何</h1><p><img src="/images/对极几何.png" title="对极几何" width="50%" height="50%" align="center/"></p>
<p>在图中,每台相机都有对应的投影中心$O_l$和$O_r$,对应相机的投影平面$\pi_r$和$\pi_l$,而点$p$、$O_r$和$O_l$所在的平面为极平面。<br>我们选择左相机$O_r$为中心坐标,另一个相机的原点坐标为$T$,则点$P$在左右相机观测到的坐标$P_r$和$P_l$之间满足:<br>$$P_r = R(P_l-T)$$<br>极平面可以表示为:<br>$$(P_l-T)^T(T\times P_l) = 0$$<br>由于叉积可以表示为反对称矩阵的点积,设向量$a = [a_1, a_2, a_3]$和$b = [b_1, b_2, b_3]$则两向量的叉积:<br>$$\begin{array}{cc} a\times b= \begin{bmatrix} i & j & k \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3\end{bmatrix}\\<br>=(a_2b_3-a_3b_2)i + (a_3b_1-a_1b_3)j + (a_1b_2-a_2b_1)k=\left[\begin{array}{ccc}0&-a_3&a_2 \\ a_3&0&-a_1 \\ -a_2&a_1&0\end{array} \right]b\end{array}$$<br>所以有:<br>$$T\times P_l =SP_l= \left[\begin{array}{ccc}0&-T_z&T_y \\ T_z&0&-T_x \\ -T_y&T_x&0\end{array} \right]P_l$$<br>带入得到:<br>$$P_r^TRSP_l=0$$<br>其中本征矩阵$E=RS$而基础矩阵$F=(M_r^{-1})EM_l^{-1}$期中$M$为相机内参。</p>
<h1 id="基础矩阵求解——八点法"><a href="#基础矩阵求解——八点法" class="headerlink" title="基础矩阵求解——八点法"></a>基础矩阵求解——八点法</h1><p>由于极线约束,$q_r^TFq_l=0$转换有:</p>
<p>$$\begin{bmatrix}x_0 & y_0 & 1\end{bmatrix} \begin{bmatrix} F_{11} & F_{12} & F_{13} \\ F_{21} & F_{22} & F_{23} \\ F_{31} & F_{32} & F_{33} \end{bmatrix} \begin{bmatrix}x_1 \\ x_2 \\ 1\end{bmatrix}$$<br>将其拆开得到:<br>$$\begin{bmatrix} x_0x_1 & x_0y_1 & x_0 & y_0x_1 & y_0y_1 & y_0 & x_1 & y_1 & 1\end{bmatrix} \begin{bmatrix} F_{11} \\ F_{12} \\ F_{13} \\ F_{21} \\ F_{22} \\ F_{23} \\ F_{31} \\ F_{32} \\ F_{33} \end{bmatrix} = 0$$</p>
<p>这就类似于最小二乘方程$Ax = 0$<br>目标函数可以转换为:<br>$$ ||Ax|| = x^T(A^TA)x=\lambda^2||x||$$</p>
<p>所以对八点构成的$8 \times 9$矩阵进行SVD分解,$SVD(A)=[U,S,V]$取矩阵$V$最右奇异值向量为所求。<br>但是在实际计算过程中,匹配点坐标存在误差,我们需要将基础矩阵投影到真正的本征矩阵空间,可以另奇异值最后一个为0。</p>
]]></content>
<summary type="html">
<p>最近在重新温故双目视觉相关的知识,此篇讲解对极几何、基础矩阵等相关知识。</p>
<h1 id="对极几何"><a href="#对极几何" class="headerlink" title="对极几何"></a>对极几何</h1><p><img src="/images/
</summary>
<category term="多视几何" scheme="http://yoursite.com/categories/%E5%A4%9A%E8%A7%86%E5%87%A0%E4%BD%95/"/>
<category term="双目视觉" scheme="http://yoursite.com/tags/%E5%8F%8C%E7%9B%AE%E8%A7%86%E8%A7%89/"/>
<category term="基础矩阵" scheme="http://yoursite.com/tags/%E5%9F%BA%E7%A1%80%E7%9F%A9%E9%98%B5/"/>
<category term="SVD" scheme="http://yoursite.com/tags/SVD/"/>
</entry>
<entry>
<title>Pcl点云中长方体的位姿估计</title>
<link href="http://yoursite.com/2017/01/23/pcl%E7%82%B9%E4%BA%91%E4%B8%AD%E9%95%BF%E6%96%B9%E4%BD%93%E7%9A%84%E4%BD%8D%E5%A7%BF%E4%BC%B0%E8%AE%A1/"/>
<id>http://yoursite.com/2017/01/23/pcl点云中长方体的位姿估计/</id>
<published>2017-01-23T13:35:30.000Z</published>
<updated>2017-06-10T14:24:36.000Z</updated>
<content type="html"><![CDATA[<p>由于之前做了物体的分割,要用于机械臂的抓取,所以绕不开物体的位姿估计,所以本篇主要讲解的完成分割后如何进行长方体的位姿估计。</p>
<p>由于使用的分割算法是从低层次到高层次,所以在分割的结果蕴含了物体各个面的组成信息,并知道了各个面的大小,当然不知道的情况也可以进行处理,之后会进行相关阐述。</p>
<h1 id="已知物体各个面的组成"><a href="#已知物体各个面的组成" class="headerlink" title="已知物体各个面的组成"></a>已知物体各个面的组成</h1><p>由于已经知道了各个面的组成信息,首先选择最大面,计算得到对应的法向量,使其作为物体的z轴向量,进而选择次大面,计算得到对应的法向量,使其为物体的y轴向量,进而对其进行一系列的旋转平移操作,完成物体的尺寸和位姿变换关系的计算:<br>(1)首先计算得到物体z轴与相机坐标系下的z轴夹角为$\theta$,将其在中心点旋转$\theta$使物体中心坐标系下的z轴与相机坐标系的z轴平行;<br>(2)将物体中心平移与相机中心重合;<br>(3)计算得到物体y轴与相机坐标系下的y轴夹角为$\beta$,将其在中心点旋转$\beta$使物体中心坐标系下的y轴与相机坐标系的y轴重合。<br>由此可以得到与相机坐标系 $C_c$, 与物体坐标系 $C_o$ 之间的位姿变化关系中平移向量为$T$,旋转矩阵为:</p>
<p>$$R = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1\end{bmatrix} \begin{bmatrix} \cos\beta & 0 & -\sin\beta \\ 0 & 1 & 0 \\ \sin\beta & \cos\beta & 0 \end{bmatrix}$$</p>
<div class="group-picture"><div class="group-picture-container"><div class="group-picture-row"><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="/images/rotate1.png"></div><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="/images/rotate2.png"></div><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="/images/rotate3.png" width="60%" height="60%" align="center/"></div></div><div class="group-picture-row"><div class="group-picture-column" style="width: 100%;"><img src="/images/rotate4.png" width="60%" height="60%" align="center/"></div></div><div class="group-picture-row"></div></div></div>
<p>结果可以得到: </p>
<div class="group-picture"><div class="group-picture-container"><div class="group-picture-row"><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="/images/cube_result1.png"></div><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="/images/cube_result2.png"></div><div class="group-picture-column" style="width: 33.333333333333336%;"><img src="/images/cube_result3.png"></div></div><div class="group-picture-row"></div></div></div>
<h1 id="不知道物体各个面的组成"><a href="#不知道物体各个面的组成" class="headerlink" title="不知道物体各个面的组成"></a>不知道物体各个面的组成</h1><p>当原始输入的数据不知道对应面的主成分,此时就需要对应的pca来进行最大面的拟合,然后再进行次小面的计算,然后按照上面的方法完成物体的位姿估计即可。</p>
<p>matlab源码要回实验室了再上传到博客,c++上只做了分割后得到结果的位姿估计,matlab上有将一个物体分成多个面然后再进行位姿估计,也用matlab随机生成数据,验证了该方法的正确性,好吧,这当然是正确的,我又too young too simple了。<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">getSurfaceCub</span><span class="params">()</span></span></div><div class="line">{</div><div class="line"> <span class="built_in">std</span>::<span class="built_in">vector</span><cubParam> cubsParam;</div><div class="line"> <span class="function">CloudPtr <span class="title">cloudFilter</span><span class="params">(<span class="keyword">new</span> CloudT)</span></span>;</div><div class="line"> pcl::ModelCoefficients::<span class="function">Ptr <span class="title">coefficients</span><span class="params">(<span class="keyword">new</span> pcl::ModelCoefficients)</span></span>;</div><div class="line"> pcl::PointIndices::<span class="function">Ptr <span class="title">inliers</span><span class="params">(<span class="keyword">new</span> pcl::PointIndices)</span></span>;</div><div class="line"> <span class="comment">// Create the segmentation object</span></div><div class="line"> pcl::SACSegmentation<PointT> seg;</div><div class="line"> <span class="comment">// Optional</span></div><div class="line"> seg.setOptimizeCoefficients(<span class="literal">true</span>);</div><div class="line"> <span class="comment">//Mandatory</span></div><div class="line"> seg.setModelType(pcl::SACMODEL_PLANE);</div><div class="line"> seg.setMethodType(pcl::SAC_RANSAC);</div><div class="line"> seg.setMaxIterations(<span class="number">1000</span>);</div><div class="line"> seg.setDistanceThreshold(<span class="number">0.01</span>);</div><div class="line"> pcl::ExtractIndices<PointT> extract;</div><div class="line"> pcl::MomentOfInertiaEstimation <PointT> feature_extractor;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < surface_.size(); ++i)</div><div class="line"> {</div><div class="line"> seg.setInputCloud(surface_[i]);</div><div class="line"> seg.segment(*inliers, *coefficients);</div><div class="line"></div><div class="line"> extract.setInputCloud(surface_[i]);</div><div class="line"> extract.setIndices(inliers);</div><div class="line"> extract.setNegative(<span class="literal">false</span>);</div><div class="line"> extract.filter(*cloudFilter);</div><div class="line"></div><div class="line"> feature_extractor.setInputCloud(cloudFilter);</div><div class="line"> feature_extractor.compute();</div><div class="line"> <span class="comment">//compute the width and height of the plane cloud</span></div><div class="line"> <span class="built_in">std</span>::<span class="built_in">vector</span> <<span class="keyword">float</span>> moment_of_inertia;</div><div class="line"> <span class="built_in">std</span>::<span class="built_in">vector</span> <<span class="keyword">float</span>> eccentricity;</div><div class="line"></div><div class="line"> PointT min_point_OBB;</div><div class="line"> PointT max_point_OBB;</div><div class="line"> PointT position_OBB;</div><div class="line"> Eigen::Matrix3f rotational_matrix_OBB;</div><div class="line"> <span class="keyword">float</span> major_value, middle_value, minor_value;</div><div class="line"> Eigen::Vector3f major_vector, middle_vector, minor_vector;</div><div class="line"> Eigen::Vector3f mass_center;</div><div class="line"></div><div class="line"> feature_extractor.getMomentOfInertia (moment_of_inertia);</div><div class="line"> feature_extractor.getEccentricity (eccentricity);</div><div class="line"> feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);</div><div class="line"> feature_extractor.getEigenValues (major_value, middle_value, minor_value);</div><div class="line"> feature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);</div><div class="line"> feature_extractor.getMassCenter (mass_center);</div><div class="line"> feature_extractor.getOBB(min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);</div><div class="line"></div><div class="line"> cubParam single_cub;</div><div class="line"></div><div class="line"> Eigen::<span class="function">Vector3f <span class="title">position</span><span class="params">(position_OBB.x, position_OBB.y, position_OBB.z)</span></span>;</div><div class="line"> Eigen::<span class="function">Quaternionf <span class="title">quat</span><span class="params">(rotational_matrix_OBB)</span></span>;</div><div class="line"> <span class="keyword">float</span> width = max_point_OBB.x - min_point_OBB.x;</div><div class="line"> <span class="keyword">float</span> height = max_point_OBB.y - min_point_OBB.y;</div><div class="line"> <span class="keyword">float</span> depth = max_point_OBB.z - min_point_OBB.z;</div><div class="line"></div><div class="line"> single_cub.depth = depth;</div><div class="line"> single_cub.width = width;</div><div class="line"> single_cub.height = height;</div><div class="line"> single_cub.rotation = quat;</div><div class="line"> single_cub.position = position;</div><div class="line"> cubsParam.push_back(single_cub);</div><div class="line"></div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> cubsParam;</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>由于涉及到类成员函数,然后我就只简单的贴一部分实现,有什么问题课题探讨一下。</p>
]]></content>
<summary type="html">
<p>由于之前做了物体的分割,要用于机械臂的抓取,所以绕不开物体的位姿估计,所以本篇主要讲解的完成分割后如何进行长方体的位姿估计。</p>
<p>由于使用的分割算法是从低层次到高层次,所以在分割的结果蕴含了物体各个面的组成信息,并知道了各个面的大小,当然不知道的情况也可以进行处理
</summary>
<category term="位姿估计" scheme="http://yoursite.com/categories/%E4%BD%8D%E5%A7%BF%E4%BC%B0%E8%AE%A1/"/>
<category term="pose" scheme="http://yoursite.com/tags/pose/"/>
<category term="pcl" scheme="http://yoursite.com/tags/pcl/"/>
<category term="PCA" scheme="http://yoursite.com/tags/PCA/"/>
</entry>
<entry>
<title>使用Opencv创建tag板</title>
<link href="http://yoursite.com/2017/01/20/%E4%BD%BF%E7%94%A8opencv%E5%88%9B%E5%BB%BAtag%E6%9D%BF/"/>
<id>http://yoursite.com/2017/01/20/使用opencv创建tag板/</id>
<published>2017-01-19T16:13:45.000Z</published>
<updated>2017-06-14T05:52:37.000Z</updated>
<content type="html"><![CDATA[<p>由于要完成3D多视角下数据集的搭建,所以要尽兴多视角下,相机的位姿估计。由于生活中部分物体的纹理信息并不丰富,所以使用sift等特征点然后LM求解并不可靠,而在一侧放置标定板,会因为视角的变化,导致部分被遮挡,所以此处使用了一圈tag来进行位姿估计,在创建board时,犯了一些错误,此处也会将相应的视线代码贴出来,仅供参考。</p>
<h1 id="marker的生成"><a href="#marker的生成" class="headerlink" title="marker的生成"></a>marker的生成</h1><p>单独生成对应的marker,具体的函数如下:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);</div><div class="line"></div><div class="line">Mat markerImage;</div><div class="line">aruco::drawMarker(dictionary, <span class="number">10</span>, <span class="number">200</span>, markerImage);</div></pre></td></tr></table></figure></p>
<h1 id="board的生成"><a href="#board的生成" class="headerlink" title="board的生成"></a>board的生成</h1><p>虽然能生成单个的marker但是想要生成多个marker联合的board,可以运行下面的代码:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);</div><div class="line"></div><div class="line">Ptr<aruco::GridBoard> board = aruco::GridBoard::create(<span class="number">5</span>, <span class="number">7</span>, <span class="number">0.04</span>, <span class="number">0.01</span>, dictionary);</div><div class="line"></div><div class="line">board->draw( Size(<span class="number">600</span>, <span class="number">500</span>), boardImage, <span class="number">40</span>, <span class="number">1</span>);</div><div class="line">imwrite(<span class="string">"../data/board.png"</span>, boardImage);</div></pre></td></tr></table></figure></p>
<h1 id="自定义board的生成"><a href="#自定义board的生成" class="headerlink" title="自定义board的生成"></a>自定义board的生成</h1><p>有时候为了更好地完成任务,需要自己对board进行定义,所以使用了自定义的方法生成一圈tag, <img src="/images/board.png" title="board" width="50%" height="50%" align="center/"><br>在生成自定义board的过程中,犯了很多傻傻的错误,总是提示<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">OpenCV Error: Assertion failed (sidePixels >= (markerSize + 2*borderBits)) <span class="keyword">in</span> drawMarker</div></pre></td></tr></table></figure></p>
<p>一直在苦恼时哪个地方的参数没写对吗?结果发现是建立四个点的时候,不是逆时针,因为<font color="#FF0000"> <code>aruco::Board::create</code> </font> 要求是逆时针建立四个点,所以改过来就好了。其中可以更改的相关参数如:<font color="#FF0000"><code>length</code> </font>marker的宽度, aruco::drawPlanarBoard(board, Size(3000, 3000), boardImage, 70, 1); 中70为边缘的宽度,下面就可以生成对应的board了。</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div></pre></td><td class="code"><pre><div class="line"></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><opencv2/opencv.hpp></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><opencv2/aruco.hpp></span></span></div><div class="line"></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><vector></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></div><div class="line"></div><div class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</div><div class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> cv;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>{</div><div class="line"> <span class="comment">//create_marker</span></div><div class="line"> Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);</div><div class="line"> </div><div class="line"> <span class="comment">//marker length</span></div><div class="line"> <span class="keyword">double</span> length = <span class="number">0.065</span>;</div><div class="line"> <span class="built_in">vector</span><<span class="built_in">vector</span><Point3f> > marker_corner_vec;</div><div class="line"> <span class="built_in">vector</span><<span class="keyword">int</span>> ids_vec;</div><div class="line"> <span class="comment">//marker left up corner coordinate</span></div><div class="line"> <span class="built_in">vector</span><<span class="keyword">double</span>> corners_x = {<span class="number">0</span>, <span class="number">0.08</span>, <span class="number">0.16</span>, <span class="number">0.24</span>, <span class="number">0.32</span>, <span class="number">0.40</span>, <span class="number">0.48</span>, <span class="number">0</span>, <span class="number">0.08</span>, <span class="number">0.16</span>, <span class="number">0.24</span>, <span class="number">0.32</span>, <span class="number">0.40</span>, <span class="number">0.48</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.48</span>};</div><div class="line"> <span class="built_in">vector</span><<span class="keyword">double</span>> corners_y = {<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.48</span>, <span class="number">0.08</span>, <span class="number">0.16</span>, <span class="number">0.24</span>, <span class="number">0.32</span>, <span class="number">0.40</span>, <span class="number">0.08</span>, <span class="number">0.16</span>, <span class="number">0.24</span>, <span class="number">0.32</span>, <span class="number">0.40</span>};</div><div class="line"></div><div class="line"> <span class="comment">//CCW order is important</span></div><div class="line"> <span class="comment">//here we order the four corners for:left up, left bottom, right bottom and right up</span></div><div class="line"> <span class="keyword">for</span>(<span class="keyword">unsigned</span> i = <span class="number">0</span>; i < corners_x.size(); ++i){</div><div class="line"> <span class="built_in">vector</span><Point3f> marker_corners(<span class="number">4</span>, Point3f(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>));</div><div class="line"> marker_corners[<span class="number">0</span>].x = corners_x[i];</div><div class="line"> marker_corners[<span class="number">0</span>].y = corners_y[i];</div><div class="line"> marker_corners[<span class="number">1</span>].x = corners_x[i];</div><div class="line"> marker_corners[<span class="number">1</span>].y = corners_y[i] + length;</div><div class="line"> marker_corners[<span class="number">2</span>].x = corners_x[i] + length;</div><div class="line"> marker_corners[<span class="number">2</span>].y = corners_y[i] + length; </div><div class="line"> marker_corners[<span class="number">3</span>].x = corners_x[i] + length;</div><div class="line"> marker_corners[<span class="number">3</span>].y = corners_y[i];</div><div class="line"> marker_corner_vec.push_back(marker_corners);</div><div class="line"> ids_vec.push_back(i + <span class="number">1</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// create the board</span></div><div class="line"> Ptr<aruco::Board> board = aruco::Board::create(marker_corner_vec, dictionary, ids_vec);</div><div class="line"> Mat boardImage;</div><div class="line"></div><div class="line"> <span class="comment">//translate the board to mat</span></div><div class="line"> aruco::drawPlanarBoard(board, Size(<span class="number">3000</span>, <span class="number">3000</span>), boardImage, <span class="number">70</span>, <span class="number">1</span>);</div><div class="line"></div><div class="line"> <span class="comment">//write the mat into image</span></div><div class="line"> imwrite(<span class="string">"../data/board.png"</span>, boardImage);</div><div class="line"> <span class="comment">// imshow("artag", boardImage);</span></div><div class="line"> waitKey(<span class="number">0</span>);</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<p>生成了对应的board。</p>
]]></content>
<summary type="html">
<p>由于要完成3D多视角下数据集的搭建,所以要尽兴多视角下,相机的位姿估计。由于生活中部分物体的纹理信息并不丰富,所以使用sift等特征点然后LM求解并不可靠,而在一侧放置标定板,会因为视角的变化,导致部分被遮挡,所以此处使用了一圈tag来进行位姿估计,在创建board时,犯了
</summary>
<category term="位姿估计" scheme="http://yoursite.com/categories/%E4%BD%8D%E5%A7%BF%E4%BC%B0%E8%AE%A1/"/>
<category term="opencv" scheme="http://yoursite.com/tags/opencv/"/>
<category term="aruco" scheme="http://yoursite.com/tags/aruco/"/>
<category term="create" scheme="http://yoursite.com/tags/create/"/>
</entry>
</feed>