我想知道gluPerspective参数.
在我看到的所有例子中fovy都设置为大约45-60度,我试图将其设置为不同的值,对象只是消失了对它的解释?
该aspect值应始终比例是多少?为什么要改变它?
zNear, zFar - 再次通常的值大约是10和500+它反映的是什么?
我有两张图片来自不同的位置.第二个摄像头位于右侧,相对于第一个摄像头向上和向后.所以我认为两个视图之间存在透视变换而不仅仅是仿射变换,因为摄像机处于相对不同的深度(我是对的吗?)我在两个图像之间有一些对应的点.我想使用这些对应点来确定每个像素从第1个到第2个图像的变换.
我对函数findFundamentalMat和findHomography感到困惑.... 两者都返回3x3矩阵,两者有什么区别?
是否有任何条件/使用它们的先决条件(何时使用它们)?
哪一个用于将点从第一图像转换为第二图像?在函数返回的3x3矩阵中,它们是否包括两个图像帧之间的旋转和平移?
从维基百科,我们发现基本矩阵是相应图像点之间的关系.在苏答案在这里,它是说本质矩阵E被需要得到相应的点...但我没有照相机内部矩阵计算è.....我只是有两个图像.
我该如何确定相应的点?等待建议..谢谢
opencv transform homography perspectivecamera projective-geometry
在针孔摄像机模型中,只有一个焦距位于主点和摄像机中心之间.
但是,在计算相机的内部参数后,矩阵包含
(fx, 0, offsetx, 0,
0, fy, offsety, 0,
0, 0, 1, 0)
Run Code Online (Sandbox Code Playgroud)
这是因为图像传感器的像素在x和y中不是正方形吗?
谢谢.
我想从旋转角度和到物体的距离开始计算透视变换(warpPerspective函数的矩阵).
怎么做?
我在OE上找到了代码.示例程序如下:
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
Mat frame;
int alpha_int;
int dist_int;
int f_int;
double w;
double h;
double alpha;
double dist;
double f;
void redraw() {
alpha = (double)alpha_int/1000.;
//dist = 1./(dist_int+1);
//dist = dist_int+1;
dist = dist_int-50;
f = f_int+1;
cout << "alpha = " << alpha << endl;
cout << "dist = " << dist << endl;
cout << "f = " << f …Run Code Online (Sandbox Code Playgroud) 当我从每个摄像机的视图中获取对象的图片时,如何使用OpenCV检索旋转矩阵,平移向量以及每个摄像机的某些缩放因子?对于每张图片,我都有几个特征点的图像坐标.并非所有特征点都在所有图片中都可见.我想将对象的特征点的计算的3D坐标映射到稍微不同的对象,以将第二对象的形状与第一对象对齐.
我听说它可以使用,cv::calibrateCamera(...)但我无法通过它......
有人有这种问题的经历吗?
我是新手three.js,正在尝试使用这些3D工具设置相当于2D可视化(适用于各种分层精灵).我想对PerspectiveCamera()论点和camera.position.set()论点提供一些指导.我已经在正确的方向轻推这个答案的相关问题,这说来设置z坐标等于0中camera.position.set(x,y,z).
下面是我从一个stemkoski的three.js示例中修改的代码片段.被挂了我的时刻的部分是对的价值观VIEW_ANGLE,x和y.假设我希望在平面上有一个平面摄像机视图,屏幕大小应该如何分配这些变量?我尝试了一系列的值,但很难从可视化中看出发生了什么.提前致谢!
var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
var VIEW_ANGLE = ?, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;
camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
scene.add(camera);
var x = ?, y = ?, z = 0;
camera.position.set(x,y,z);
camera.lookAt(scene.position);
Run Code Online (Sandbox Code Playgroud)
更新 - 透视与正交相机:
谢谢@GuyGood,我意识到我需要对透视相机和正交相机做出设计选择.我现在看到PerspectiveCamera(),即使在这个2D上下文中也允许像视差这样的东西,而OrthographicCamera()无论我的2D元素在哪个层上,都允许文字渲染大小(不随距离减小).我倾向于认为我仍然会使用PerspectiveCamera() …
WebGL的所有矩阵库都具有某种perspective功能,您可以调用它来获取场景的透视矩阵.
例如,文件中的perspective方法是如此编码:mat4.jsgl-matrix
mat4.perspective = function (out, fovy, aspect, near, far) {
var f = 1.0 / Math.tan(fovy / 2),
nf = 1 / (near - far);
out[0] = f / aspect;
out[1] = 0;
out[2] = 0;
out[3] = 0;
out[4] = 0;
out[5] = f;
out[6] = 0;
out[7] = 0;
out[8] = 0;
out[9] = 0;
out[10] = (far + near) * nf;
out[11] = -1;
out[12] = 0;
out[13] = …Run Code Online (Sandbox Code Playgroud) 我有许多校准过的相机拍摄平面场景的照片.为简单起见,我们假设有3个摄像头.那些相机正在进行一般运动,但主要是翻译加上一些温和的旋转.相机的示例位置
任务是完全缝合它们.我不了解3D坐标,只是用校准相机拍摄的一组图像.
我所做的:
我在OpenCV中使用SURF/SIFT实现检测特征,通过在每对图像之间使用findHomography来获得初始单应性(1-> 2,2- > 3,1- > 3).从那些单应性我得到每个相机的姿势的初始esitimation (类似的程序到此)
然后我尝试使用束调整技术来最小化每个匹配对的重投影错误.优化参数是三个平移值和三个旋转值(从Rodrigues的旋转公式获得),尽管我可以稍后添加内部参数(焦点,主要点等).
假设图像#2将是参考帧(通过与其他两个图像具有最大量的匹配),其旋转和平移矩阵分别是同一性和零矩阵.
我计算从图像#2到图像#1的关键点(在图像#2和图像#1中均可见)的重投影为(伪代码)
[x1_; y1_; z1_] = K1*R1*inv(K2)*[x2; y2; 1] + K1*T1/Z2;
x1 = x1_/z1_;
y1 = y1_/z1_;
Run Code Online (Sandbox Code Playgroud)
要么
x1 = ((f1/f2)*r11*x2 + (f1/f2)*r12*y2 + f1*r13 + f1*tx/Z2) / ((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + tx/Z2)
y1 = ((f1/f2)*r21*x2 + (f1/f2)*r22*y2 + f1*r23 + f1*ty/Z2) / ((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + ty/Z2)
Run Code Online (Sandbox Code Playgroud)
其中r__是R1矩阵的元素,两个内在矩阵都是
[f 0 0]
[0 f 0]
[0 0 1]
Run Code Online (Sandbox Code Playgroud)
我假设参考帧的Z2坐标为1.
下一阶段是使用所获得的相机矩阵(K1,R1,T1,K3,R3,T3)将图像#1和#3变形为图像#2的公共坐标系.
问题是我不知道正确重投影到图像#2的参考帧所需的Z1和Z3,因为来自图像#1 - …
opencv computer-vision photogrammetry perspectivecamera image-stitching
我正在努力depth map with OpenCV.我可以获得它,但它是从左相机原点重建的,后者有一点倾斜,如图所示,深度"移位"(深度应该接近,没有水平渐变):
我想以零角度表达它,我尝试使用warp透视函数,如下所示,但我获得了一个空字段...
P = np.dot(cam,np.dot(Transl,np.dot(Rot,A1)))
dst = cv2.warpPerspective(depth, P, (2048, 2048))
Run Code Online (Sandbox Code Playgroud)
用:
#Projection 2D -> 3D matrix
A1 = np.zeros((4,3))
A1[0,0] = 1
A1[0,2] = -1024
A1[1,1] = 1
A1[1,2] = -1024
A1[3,2] = 1
#Rotation matrice around the Y axis
theta = np.deg2rad(5)
Rot = np.zeros((4,4))
Rot[0,0] = np.cos(theta)
Rot[0,2] = -np.sin(theta)
Rot[1,1] = 1
Rot[2,0] = np.sin(theta)
Rot[2,2] = np.cos(theta)
Rot[3,3] = 1
#Translation matrix on the X axis
dist = 0
Transl …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个用于构建模型的 3D 查看器。我们已加载模型并尝试与模型进行某种交互。因此,我们使用 OrbiControls 来旋转、平移和缩放模型。
我们希望在查看器中具有这样的行为:当用户单击并拖动(从而旋转)时,旋转中心位于用户单击的建筑物点处。
我认为我通过改变 OrbitControl 的目标是明智的:
control.target.set(newX, newY, newZ);
Run Code Online (Sandbox Code Playgroud)
然而,我在 OrbitControl.js 文件的源代码中发现,当控件更新时,
camera.lookAt()
Run Code Online (Sandbox Code Playgroud)
调用函数,这会导致相机跳转到新位置。
有什么办法可以解决这个问题吗?我已经尝试了几个小时了,但似乎没有任何效果。
尝试更改 target0,然后在控件上调用 Reset() 。还尝试将相机改回原来的位置(这可能是它的做法,但我可能尝试得不好。