<p>在我看来,你已经可以找到你的<code>(x, y, z)</code>点了,你的问题是如何把它们投射到一个平面上</p>
<p>请参考<a href="https://en.wikipedia.org/wiki/Camera_matrix" rel="nofollow noreferrer">projection matrix</a>了解如何将3d世界投影到您选择的图像平面上</p>
<p>具体地说,您必须将<code>(x, y, z)</code>坐标表示为<a href="https://en.wikipedia.org/wiki/Homogeneous_coordinates" rel="nofollow noreferrer">homogeneous coordinates</a>,方法是将它们称为<code>(x, y, z, 1)</code>,并将它们乘以与需要投射它们的平面正交的相关摄影机矩阵</p>
<p>这将产生形式为<code>(x', y', f)</code>的二维齐次坐标,从中可以通过<code>(x_projected, y_projected) = (x'/f, y'/f)</code>获得投影坐标</p>
<p><a href="https://docs.opencv.org/3.4/d0/daf/group__projection.html" rel="nofollow noreferrer">OpenCV</a>是你的朋友</p>
<p><strong>重述:</strong></p>
<ol>
<li>输入:<code>n</code><code>(x, y, z)</code>点</li>
<li>使用opencv获取大小为<code>(4, 3)</code>的投影(相机)矩阵<code>M</code>,或者使用任何工具计算自己</李>
<li>将最后一个维度<code>1</code>添加到所有点,以将它们作为三维齐次坐标:<code>n</code>点<code>(x, y, z, 1)</code></li>
<li>将所有点乘以矩阵,以获得投影点作为二维齐次坐标:<code>M * (x, y, z, 1)^T</code>=<code>(x', y', f)</code></li>
<li>通过<code>(x, y)</code>=<code>(x'/f, y'/f)</code>获取<code>n</code>实际二维投影坐标(相对于<code>M</code>矩阵定义的摄影机中心)</li>
</ol>
<p>好处:您可以将所有的<code>(x, y, z, 1)</code>点作为列堆叠到<code>(4, n)</code>矩阵<code>P</code>中,整个乘法过程将是<code>R = M * P</code>,一个<code>R</code>形状的结果矩阵<code>(3, n)</code>,其列是生成的齐次坐标</p>