小编Woo*_*oni的帖子

如何从相机内部矩阵计算相机的视野?

我使用相机校准获得了相机内部矩阵和失真参数.

我想,焦距的单位是像素.

然后,我如何计算视野(沿y)?

这个公式对吗?

double fov_y = 2*atan(height/2/fy)*180/CV_PI;
Run Code Online (Sandbox Code Playgroud)

我将它用于参数

gluPerspective()
Run Code Online (Sandbox Code Playgroud)

opengl camera computer-vision camera-calibration

7
推荐指数
1
解决办法
8730
查看次数

使用openCV的极线几何/立体视觉

我正在使用openCV开发极线几何.(最终目标是使用同一相机从不同视点拍摄的两幅图像估算模型的世界坐标或深度信息)

然而,我正在努力估计用于极线几何的基本矩阵和基本矩阵.

具有不同摄像机视点的对应点

如上所示,我捕获了两个具有不同视点的图像(相同的相机).相同的颜色点是对应点.

确切的坐标是(如果你想验证,我写它)

points1:左

points1.push_back(Point2f(157,223));
points1.push_back(Point2f(190,312));
points1.push_back(Point2f(157,541));
points1.push_back(Point2f(136,443));
points1.push_back(Point2f(355,374));
points1.push_back(Point2f(346,406));
points1.push_back(Point2f(252,410));
points1.push_back(Point2f(254,379));
Run Code Online (Sandbox Code Playgroud)

第2点:对

points2.push_back(Point2f(190,188)); 
points2.push_back(Point2f(303,284)); 
points2.push_back(Point2f(252,512)); 
points2.push_back(Point2f(166,420)); 
points2.push_back(Point2f(422,311));
points2.push_back(Point2f(412,339));
points2.push_back(Point2f(341,366));
points2.push_back(Point2f(345,335));
Run Code Online (Sandbox Code Playgroud)

使用积分,

Mat FundamentalMatrix = findFundamentalMat(points1,points2,FM_RANSAC,1.0,0.99);

openCV函数用于计算基本矩阵.但是,我猜计算的基础很奇怪.

计算基本矩阵和约束

  • left:使用FM_RANSAC,右:使用CV_FM_8POINTS

计算的基本矩阵应满足x'T F x = 0

其中x'是(u2,v2,1)^ T,x是(u1,v1,1)^ T

与u1,v1 =点1坐标和u2,v2 =点2坐标.

如上所述,我计算了x'T F x = 0.然而第三种情况(第三对应点),它不是零.

当然我尝试了不同的方法.

Mat FundamentalMatrix = findFundamentalMat(points1, points2, CV_FM_8POINT);
Run Code Online (Sandbox Code Playgroud)

也试过了.

但是对于这种情况,所有相应的点都不满足约束.

有什么问题?我做错了吗?(我在想的是8分仍然不足,应该有更多积分)

此外,我估计了不同观点的模型(外在矩阵)的姿态.并执行相机校准.因此估计E1(视点1的外在矩阵),E2,K(内在矩阵).(我猜这几乎是准确的.因为如果我使用E1,E2和k投影模型点,那么它将被投影到图像上的正确点). - >然后我估计必要矩阵E = K ^ TFK.E应该满足E应该为0的行列式并且具有特征值(1,1,0)或(sigma,sigma,1)但是它不是.

有什么问题?

c++ opencv

5
推荐指数
0
解决办法
1289
查看次数

GLSL:访问帧缓冲区以获取 RGB 并更改它

我想访问帧缓冲区来获取 RGB 并更改每个像素的值。这是因为glReadPixels和glDrawPixels使用起来太慢,所以我应该使用着色器而不是使用它们。

现在,我编写代码,并成功使用GLSL着色器显示三维模型。

我画了两个立方体,如下所示。

.... 
glDrawArrays(GL_TRIANGLES, 0, 12*6);
.... 
Run Code Online (Sandbox Code Playgroud)

和片段着色器:

varying vec3 fragmentColor;
void main()
{
    gl_FragColor = vec4(fragmentColor, 1);
}
Run Code Online (Sandbox Code Playgroud)

那么,如何访问 RGB 值并更改它呢?例如,如果窗口上(u1,v1)和(u2,v2)处的像素值为(0,0,255),那么我想将它们更改为(255,0,0)

opengl shader glsl

2
推荐指数
1
解决办法
2618
查看次数