我正在使用Matlab进行相机校准,使用Jean-Yves Bouget的相机校准工具箱.我有校准程序中的所有相机参数.当我使用不在校准集中的新图像时,我可以获得其变换方程,例如Xc = R*X + T,其中X是世界框架中校准装备(平面)的3D点,Xc是其坐标相机架.换句话说,我拥有一切(外在和内在参数).
我想要做的是对此图像执行透视校正,即我希望它删除任何透视图并看到校准装置未失真(它是一个棋盘).
Matlab的新计算机视觉工具箱有一个对象,在给定3X3矩阵H的情况下对图像执行透视变换.问题是,我不能从已知的内在和外在参数计算这个矩阵!
我试图通过使用我的网络摄像头从具有已知全球位置的四个基准点的图像中获得全局姿势估计.
我检查了很多stackexchange问题和一些文章,我似乎无法得到一个正确的解决方案.我得到的位置编号是可重复的,但绝不与摄像机移动成线性比例.仅供参考我使用的是C++ OpenCV 2.1.
在这个链接上描绘了我的坐标系和下面使用的测试数据.
% Input to solvePnP():
imagePoints = [ 481, 831; % [x, y] format
520, 504;
1114, 828;
1106, 507]
objectPoints = [0.11, 1.15, 0; % [x, y, z] format
0.11, 1.37, 0;
0.40, 1.15, 0;
0.40, 1.37, 0]
% camera intrinsics for Logitech C910
cameraMat = [1913.71011, 0.00000, 1311.03556;
0.00000, 1909.60756, 953.81594;
0.00000, 0.00000, 1.00000]
distCoeffs = [0, 0, 0, 0, 0]
% output of solvePnP():
tVec = [-0.3515;
0.8928;
0.1997]
rVec = [2.5279; …
Run Code Online (Sandbox Code Playgroud) opencv computational-geometry camera-calibration pose-estimation extrinsic-parameters
我已根据某个世界坐标系校准了2个摄像头.我知道相对于世界框架的每一个的旋转矩阵和平移向量.从这些矩阵如何计算一个摄像机相对于另一个摄像机的旋转矩阵和平移矢量?
请给我任何帮助或建议.谢谢!
calibration computer-vision camera-calibration rotational-matrices extrinsic-parameters
我solvePnP()
在OpenCV中读取函数的源代码,当flags
param使用默认值时SOLVEPNP_ITERATIVE
,它调用cvFindExtrinsicCameraParams2
,其中它首先使用DLT算法(如果我们有一组非平面的3D点)来初始化6DOF相机姿势,和SECOND用于CvLevMarq solver
最小化重投影错误.
我的问题是:DLT将问题形成为线性最小二乘问题并用SVD分解解决它,它似乎是一个最优解,为什么我们之后仍然使用Lev-Marq迭代方法?
或者,DLT算法的问题/限制是什么?为什么封闭形式的解决方案导致成本函数的LOCAL最小值?
我正在使用opencv和openframeworks(即opengl)来计算图像中的相机(世界变换和投影矩阵)(以及后来的几个图像用于三角测量).
出于opencv的目的,"平面图"成为世界中心0,0,0的对象(即棋盘).世界/楼层位置是已知的,因此我需要获得投影信息(失真系数,fov等)和相机的外部坐标.
我已经将这些平面图的视图位置映射到标准化视图空间中的2D图像上([0,0]是左上角.[1,1]是右下角).
对象(平面图/世界点)在xz平面上,-y向上,所以我转换为xy平面(这里不确定z-up是负的还是正的......)对于opencv,因为它需要是平面的
ofMatrix4x4 gWorldToCalibration(
1, 0, 0, 0,
0, 0, 1, 0,
0, 1, 0, 0,
0, 0, 0, 1
);
Run Code Online (Sandbox Code Playgroud)
我将1,1作为ImageSize传递给校准相机.标志CV_CALIB_FIX_ASPECT_RATIO|V_CALIB_FIX_K4|CV_CALIB_FIX_K5
calibrateCamera
运行成功,给我一个低错误(通常是周围0.003
).
使用calibrationMatrixValues
我得到一个明智的FOV,通常在50度左右,所以我很确定内在属性是正确的.
现在计算相机的外在世界 - 空间变换......我不相信我需要使用,solvePnP
因为我只有一个对象(虽然我之前用它尝试了所有这些并返回相同的结果)
// rot and trans output...
cv::Mat& RotationVector = ObjectRotations[0];
cv::Mat& TranslationVector = ObjectTranslations[0];
// convert rotation to matrix
cv::Mat expandedRotationVector;
cv::Rodrigues(RotationVector, expandedRotationVector);
// merge translation and rotation into a model-view matrix
cv::Mat Rt = cv::Mat::zeros(4, 4, CV_64FC1);
for (int y = 0; y …
Run Code Online (Sandbox Code Playgroud) 我想用opencv找到一个点的位置.我使用cvCalibrateCamera2校准了两台相机.所以我知道内在和外在的参数.我读了一个已知的内在和外在参数,我可以轻松地通过三角测量重建三维.opencv中是否有一个函数可以实现这一点.我认为cvProjectPoint2可能很有用,但我不明白究竟是什么.那我怎么能找到一个点的三维位置.
谢谢.
opencv computer-vision 3d-reconstruction extrinsic-parameters
我有相机的内在和外在参数.外在的是具有旋转和平移的4×4矩阵.
我有样本数据,我有一个每个摄像头拍摄的图像.
2.11e-001 -3.06e-001 -9.28e-001 7.89e-001
6.62e-001 7.42e-001 -9.47e-002 1.47e-001
7.18e-001 -5.95e-001 3.60e-001 3.26e+000
0.00e+000 0.00e+000 0.00e+000 1.00e+000
Run Code Online (Sandbox Code Playgroud)
我想绘制Matlab校准工具包页面上给出的图像 要么
但是我无法弄清楚如何绘制这两幅图像的数学.
我唯一的领导是来自这个页面http://en.wikipedia.org/wiki/Camera_resectioning.这告诉我相机位置可以通过C = - R`找到.Ť
知道如何实现这个任务吗?
language-agnostic math matrix camera-calibration extrinsic-parameters
我对Flyweight
模式的这些状态的差异感到困惑.
我知道intrinsic
状态是共享的状态,而Extrinsic
不是.
但是,我没有看到extrinsic
状态在模式中或以下示例中的重要性:
public static void main(String[] args) {
// Create the flyweight factory...
EngineFlyweightFactory factory = new EngineFlyweightFactory();
// Create the diagnostic tool
DiagnosticTool tool = new EngineDiagnosticTool();
// Get the flyweights and run diagnostics on them
Engine standard1 = factory.getStandardEngine(1300); //intrinsic
standard1.diagnose(tool); //extrinsic
Engine standard2 = factory.getStandardEngine(1300); //intrinsic
standard2.diagnose(tool); //extrinsic
Engine standard3 = factory.getStandardEngine(1300); //intrinsic
standard3.diagnose(tool); //extrinsic
Engine standard4 = factory.getStandardEngine(1600); //intrinsic
standard4.diagnose(tool); //extrinsic
Engine standard5 = factory.getStandardEngine(1600); //intrinsic
standard5.diagnose(tool); …
Run Code Online (Sandbox Code Playgroud) 我最近使用Matlab 单摄像机校准应用程序算法来校准相机内在函数和外在函数.在找到棋盘的角落时,很多时候detectCheckerboardPoints
Matlab的功能执行(准确性)opencv api cv::findChessboardCorners
,但在某些图片上,Matlab表现得很奇怪.
例如,在下图中,可以清楚看到棋盘方块之间的角落,而matlab在奇怪的地方找到了多余的角落:
matlab代码片段很简单,如下所示:
img=imread(fn);
[imUndist, newOrig]=undistortImage(img, cameraParams);
[pxs, bdsize]=detectCheckerboardPoints(imUndist); %or detect on 'img' directly
imMarked=insertMarker(imUndist, pxs);
imshow(imMarked);
Run Code Online (Sandbox Code Playgroud)
opencv
在此图像上检测到(下面的代码)的角非常精确:// opencv代码:
Mat img = imread(fpath);
int ww = 8, hh = 15;
cv::Size bsz(ww, hh);
vector<Point2f> ptvec;
bool found = cv::findChessboardCorners(img, bsz, ptvec, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE);
cv::drawChessboardCorners(img, bsz, ptvec, found);
imshow("img", img);
waitKey();
Run Code Online (Sandbox Code Playgroud)
matlab opencv camera-calibration extrinsic-parameters corner-detection