在相机校准期间,通常的建议是使用许多图像(> 10),其中包括姿势,深度等变化.但是我注意到,通常我使用的图像越少,重投影误差越小.例如,对于27个图像,cv :: calibrateCamera返回0.23并且仅有3我得到0.11这可能是由于在校准期间我们正在解决超定系统的最小二乘问题.
问题:
我们是否真的使用重投影误差作为校准良好程度的绝对量度?例如,如果我使用3张图像进行校准并获得0.11,然后使用其他27张图像进行校准并得到0.23,我们真的可以说"第一次校准更好"吗?
OpenCV使用相同的图像进行校准和计算误差.是不是有某种形式的过度拟合?如果我实际使用了2个不同的设置 - 一个用于计算校准参数而另一个用于计算误差 - 那么这不是更正确吗?在这种情况下,我会使用相同的(测试)集来计算来自不同(训练)集的所有校准结果的误差.那不是更公平吗?
我用OpenCV计算了相机的内在和外在参数.现在,我想从屏幕坐标(u,v)计算世界坐标(x,y,z).
我是怎么做到的
注意,当我使用kinect时,我已经知道了z坐标.
任何帮助深表感谢.谢谢!
据说微软SDK可以访问Kinect的内部参数,但有人知道它返回的深度图像是否真的没有失真?我找不到任何相关的东西.
让我知道如果我不在话题,虽然我认为这是一个隐含的编程问题:)
编辑:我发现支持@ Coeffect的答案的其他一些有用的链接
我正在使用 opencv 对两个相机(让我们将它们命名为 L 和 R)进行立体校准。我使用 20 对棋盘图像并计算 R 相对于 L 的变换。我想要做的是使用一对新图像,计算图像 L 中的 2d 棋盘角,根据我的校准变换这些点并绘制图像 R 上对应的变换点,希望它们与该图像中棋盘的角相匹配。
我尝试了将 2d 点从 [x,y] 转换为 [x,y,1] 的简单方法,乘以 3x3 旋转矩阵,添加旋转向量,然后除以 z,但结果是错误的,所以我我猜事情没那么简单(?)
编辑(澄清一些事情):
我想这样做的原因基本上是因为我想验证一对新图像的立体校准。所以,我实际上不想在两个图像之间获得新的 2d 变换,我想检查我找到的 3d 变换是否正确。
这是我的设置:
我有与两个摄像机(E)相关的旋转和平移,但没有与每个摄像机(E_R,E_L)相关的对象的旋转和平移。
理想情况下我想做的是:
但我想得越多,我就越确信这是错误的/不可能做到的。
我现在可能正在尝试的:
我已经开始阅读Effective C++了,在第2项的某些时候,提到了以下内容:
// call f with the maximum of a and b
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
...
int a = 5, b = 0;
CALL_WITH_MAX(++a, b); // a is incremented twice
CALL_WITH_MAX(++a, b+10); // a is incremented once
Run Code Online (Sandbox Code Playgroud)
这里,a在调用f之前递增的次数取决于它与之比较的次数!
事实上,如果我使用一个简单的打印声明f,7在第一次打电话中打印,但我不能为我的生活找出原因.我错过了一些明显的东西吗
我的布局 (A) 多次包含另一个布局 (B)。布局 B 包含一个 id 的按钮R.id.my_button。因此,布局 A 包含许多具有相同 id 的按钮。
如何使用 espresso 测试点击这些按钮中的任何一个?
onView(withId(R.id.my_button)).perform(click());在这种情况下并没有真正做任何事情。
在 MATLAB 中,我读取了一个彩色视频,提取某个帧并使用该rgb2gray函数将其转换为灰度图像。但是当我使用 OpenCV2.3.1 加载相同的视频时,提取相同的帧然后将其转换为灰度它不会'不会给出与 MATLAB 相同的灰度值。这是为什么?
这是使用 OpenCV 的 C++ 代码:
VideoCapture cap(0);
cap.open("Human sperm evaluation_0.avi");
Mat image;
Mat gray(480,640,CV_8U);
for(int i=0;i<513;i++)
{
cap>>image;
cvtColor(image,gray,CV_RGB2GRAY);
}
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
cout<<(int)gray.at<uchar>(i,j)<<' ';
}
}
Run Code Online (Sandbox Code Playgroud) 嘿伙计们,我想知道是否删除舞台上的所有对象:
//bomb
for each (var bomb:mcBomb in aBombArray)
{
bomb.parent.removeChild(bomb);
aBombArray = [];
bomb = null;
}
Run Code Online (Sandbox Code Playgroud)
在游戏结束时导致内存泄漏?这是删除数组中的所有对象并将其设置为0吗?我应该改用aBombArray.length = 0;吗?
我在比赛结束时将所有阵列都移除了.我注意到,当你进入"游戏结束"屏幕时,内存不会减少而是仍然会爬升.不确定这可能是问题所在.
多谢你们.
opencv ×4
kinect ×2
2d ×1
android ×1
array-splice ×1
arrays ×1
c++ ×1
calibration ×1
macros ×1
matlab ×1
memory-leaks ×1
stereo-3d ×1