Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV:计算相机和像素之间的角度_C++_Opencv_Image Processing - Fatal编程技术网

C++ OpenCV:计算相机和像素之间的角度

C++ OpenCV:计算相机和像素之间的角度,c++,opencv,image-processing,C++,Opencv,Image Processing,我想知道如何计算照片中某个像素相对于我正在使用的网络摄像头的角度。我对这类事情还不熟悉,我用的是网络摄像头。基本上,我拍了一张照片,对它进行处理,最后得到了我想要的图像中的一个像素值。然后我需要以某种方式将像素值转换成一些有意义的量——我需要找到一条穿过像素和相机的线/向量。我不需要大小,只需要相位 一个人如何着手做这件事?摄像机校准是否必要?我读了一些关于它的书,但我不确定 谢谢你,你不需要知道到物体的距离,只需要知道相机的分辨率和视角 计算角度只需要简单的线性插值。例如,让我们假设一个分辨率

我想知道如何计算照片中某个像素相对于我正在使用的网络摄像头的角度。我对这类事情还不熟悉,我用的是网络摄像头。基本上,我拍了一张照片,对它进行处理,最后得到了我想要的图像中的一个像素值。然后我需要以某种方式将像素值转换成一些有意义的量——我需要找到一条穿过像素和相机的线/向量。我不需要大小,只需要相位

一个人如何着手做这件事?摄像机校准是否必要?我读了一些关于它的书,但我不确定


谢谢你,你不需要知道到物体的距离,只需要知道相机的分辨率和视角

计算角度只需要简单的线性插值。例如,让我们假设一个分辨率为1920x1080的相机覆盖了对角线上45度的视角

在这种情况下,sqrt(19202+10802)沿对角线给出2292.19像素。这意味着每个像素代表45/2292.19=.0153994度

因此,计算到中心的距离(以像素为单位),乘以.0153994,就得到了它到中心的角度(对于那个相机——对于你的相机,你显然必须使用它的分辨率和视角)

当然,这在某种程度上是近似的——其精度将取决于镜头的畸变程度。对于变焦镜头(尤其是更宽的角度),你通常可以认为它是相当高的。对于固定焦距的镜头(特别是如果它没有覆盖超过90度左右的角度),它通常会非常低

如果您想提高精度,可以先拍摄一个平面矩形,其直线正好位于相机视角内,然后根据结果图片中与完全直线的偏差计算失真。如果你使用的是广角镜头,这几乎是必要的。对于覆盖较窄视角的镜头(特别是,如前所述,如果它的焦距固定),这几乎不值得(这种镜头通常只有百分之一的失真)。

配方:

1-校准摄像机,获得摄像机矩阵K和畸变参数D。在OpenCV中,按照本节所述进行校准

2-从感兴趣的像素位置移除非线性失真。在OpenCV中,使用例程完成,不传递参数R和P

3-通过将齐次坐标中的像素位置乘以摄影机矩阵的倒数,将感兴趣的像素反向投影到摄影机3D坐标中的光线(尾部位于摄影机中心的单位向量)


4-您想要的角度是上述矢量和(0,0,1)之间的角度,即与相机焦距轴相关的矢量。

要做到这一点,您需要知道与像素相对应的对象的距离以及相机的视野。好的,关于如何解决我的问题,您有什么建议吗。我基本上是在寻找一个特定的颜色对象。我发现像素坐标(s)最匹配的颜色,我正在寻找,然后我需要能够有一些方式说,该对象的方向是。。。没有深度,这是不可能的吗?我本以为我能从像素坐标中得到一些方位……画一张情况图。你有一个直角三角形,它的角是(a)物体,(B)照相机,和(C)一个位于图像中心但在物体深度平面的点。如何计算角度ABC?请注意,在我的第一条评论中,“and”应该是“or”。谢谢,这非常有用。你认为“摄像机校准”是必要的/值得的吗?@user968243:我相信OpenCV的摄像机校准是为了测量失真,所以这几乎就是答案最后一段所说的。它的效用取决于镜头的失真程度,我不知道。答案只是一阶近似值。通过校准相机,你可以很容易地得到更准确的答案。对于广角镜头(>90°FOV)来说尤其如此,因为广角镜头通常会表现出明显的非线性失真。@FrancoCallari:你费心阅读整个答案了吗?我特别提到了校正失真,但你(显然)在假设它从未被讨论过的情况下投了反对票?[请不要删除否决票——这会让我的代表回到5的倍数,我喜欢)。@JerryCoffin。请发明一种算法,能够估计镜头的非线性失真,并且不使用或产生线性部分的估计。然后发布它并申请明年的CVPR 14最佳论文奖;-)嗨,我我想从像素P的位置得到方位向量。这是一个单位向量,从相机中心到像素P所识别的物体。要做到这一点,我应该到达你描述的第3点。相机矩阵是3x3矩阵,例如,来自相机校准的矩阵。就是这些吗对吧?先谢谢你