- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经使用OpenCv代码获得了相机标定参数,如相机矩阵、畸变系数、(旋转+平移) vector 和图像点here .
通过在 Matlab 中对相机矩阵、旋转和平移 vector 和物点坐标 (X,Y,Z,1) 的获得值进行硬编码,我无法获得与图像点相同的坐标值。我在这里错过了什么?我是否也需要考虑失真系数以获得准确或正确的图像点?
Matlab代码:
% Define all the parameters camera matrix , sample image point, object point, rotation and translation vectors%
cameraMatrix = [5.9354 0 3.1950; 0 5.9354 2.3950 ; 0 0 1]
rotationMatrix = [2.5233 1.6803 3.0728];
translationMatrix = [1.2682 1.9657 8.0141];
X = [0; 0; 0; 1];
rotationMatrix = transpose(rotationMatrix);
translationMatrix = transpose(translationMatrix);
%convert the rotation vector into rotation matrix using Rodrigues func.%
rotMat = rodrigues(rotationMatrix);
R_T = horzcat(rotMat, translationMatrix)
%Convert to 2D points%
imgPts = cameraMatrix * R_T * X
lastElement = imgPts(end);
ScreenImgPts = imgPts / lastElement
对象点由棋盘正方形大小(30mm)的正方形大小定义,即 [0,0,0,1] , [30,0,0,1] 等。
但是经过我的计算和比较,存储在xml文件中的图像点是不一样的。我的结果如下
第一个点、第二个点和第三个点的输出(图像点)应该是:
给出所有参数的输出文件 here
最佳答案
问题非常简单,我将所有重要参数(相机矩阵、旋转和平移)的值四舍五入到第 4 位,而指数 (e) 明显出现在值的末尾。因此四舍五入会导致不正确的值。
修改后的代码
% Define all the parameters camera matrix , sample image point, object point, rotation and translation vectors%
cameraMatrix = [5.9354136482375827e+002 0. 3.1950000000000000e+002; 0. 5.9354136482375827e+002 2.3950000000000000e+002 ; 0 0 1;]
%Rotatoin and translation vector of different planes (snapshot)%
rotationVector = [2.5233190617669338e-001 1.6802568443347082e-001 3.0727563215131681e+000];
translationVector = [1.2682348793063555e+002 1.9656574525587070e+002 8.0141048598043449e+002];
% rotationVector = [2.3492892819146791e-001 1.6451261910667694e-001 3.0787833660290516e+000];
% translationVector = [1.2806533156889765e+002 1.9877886039281353e+002 8.0447195879431570e+002];
% rotationVector = [2.1721 1.6300 3.0619];
% translationVector = [1.2661 1.9511 8.0681];
distCoeffs = [1.0829115704079707e-001 -1.0278232972256371e+000 0 0 1.7962320082487011e+000]; % k1, k2, p1, p2, k3 %
k1 = distCoeffs(1);
k2 = distCoeffs(2);
p1 = 0;
p2 = 0;
k3 = distCoeffs(end);
% X = [0 0 0; 30 0 0]
rotationVector = transpose(rotationVector);
translationVector = transpose(translationVector);
%convert the rotation vector into rotation matrix using Rodrigues func.%
rotMat = rodrigues(rotationVector)
R_T = horzcat(rotMat, translationVector)
%Convert to 2D points%
% imgPts = cameraMatrix * R_T * X
%
% lastElement = imgPts(end)
%
% ScreenImgPts = imgPts / lastElement
%%%%%%%%%%%%%% Adding calculation for distortion parameters%%%%%%%%%%
objectPoints = [0 0 0; 30 0 0; 60 0 0; 90 0 0; 120 0 0; 150 0 0;180 0 0;
0 30 0; 30 30 0; 60 30 0; 90 30 0; 120 30 0; 150 30 0; 180 30 0;
0 60 0; 30 30 0; 60 60 0; 90 60 0; 120 60 0; 150 60 0; 180 60 0;
0 90 0; 30 30 0; 60 90 0; 90 90 0; 120 90 0; 150 90 0; 180 90 0;
0 120 0; 30 120 0; 60 120 0; 90 120 0; 120 120 0; 150 120 0; 180 120 0;]
Xelement = [];
screenCoords = [];
NormXY = [];
for i = 1:35
Xelement = (objectPoints(i,:))
NormXY(:,1) = (rotMat * transpose(Xelement)) + translationVector
lastElement = NormXY(end)
NormXY = NormXY / lastElement
x = NormXY(1)
y = NormXY(2)
r2 = power(x,2) + power(y,2)
r4 = power(r2,2)
r6 = power(r2,3)
xcorr = x * (1 + k1*r2 + k2*r4 + k3*r6)
ycorr = y * (1 + k1*r2 + k2*r4 + k3*r6)
XY = [xcorr ;ycorr;1]
screenCoords(:,i) = cameraMatrix * XY
end
关于c++ - 在 Matlab 中使用来自 Opencv 的相机校准参数重新计算图像点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772459/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!