四元数表示旋转 - 它们不包括有关缩放或镜像的信息.但是仍然可以反映旋转的效果.
考虑在xy平面上进行镜像(我们也可以将其称为沿z轴的镜像).围绕在xy平面上镜像的x轴的旋转将被否定.同样围绕y轴旋转.但是,围绕z轴的旋转将保持不变.
另一个例子:围绕xy平面镜像的轴(1,1,1)旋转90º会使(-1,1,-1)周围旋转-90º.为了帮助直觉,如果您可以想象轴的描绘和指示旋转的圆形箭头,则镜像该可视化指示新旋转应该是什么.
我找到了一种计算旋转镜像的方法,如下所示:
这仅支持沿主轴x,y和z的镜像,因为这就是我所需要的.它适用于任意旋转.
然而,从四元数到角轴以及从角轴到四元数的转换是昂贵的.我想知道是否有一种方法可以直接在四元数上进行转换,但是我对四元数数学的理解还不足以让我自己去任何地方.
(由于计算效率方法的重要性,发布在StackOverflow而不是数学相关论坛.)
我想确定sizeof一个结构类型的特定成员变量,我将其作为模板参数传递给函数.但是,我从编译器得到一个错误,说sizeof操作数是非法的(我在Windows 7中使用VS2010).
考虑以下程序:
#include <vector>
#include <fstream>
struct MyFloat {
float val;
MyFloat(){val=rand()/(RAND_MAX+1.f);};
};
struct MyDouble {
double val;
MyDouble(){val=rand()/(RAND_MAX+1.);};
};
template<class T>
void serializeArrayToFile(const std::string &filename, const std::vector<T> &items) {
const size_t nbytes = sizeof(T::val); // <--- Error C2070
std::ofstream os(filename.c_str(),std::ios::out+std::ios::binary);
for(size_t i=0; i<items.size(); ++i)
os.write((char*)(&items[i].val),nbytes);
os.close();
};
void main() {
const int N = 15;
std::vector<MyFloat> arr_float(N); // Filled randomly by default constructor
std::vector<MyDouble> arr_double(N); // Filled randomly by default constructor
serializeArrayToFile<MyFloat>("myfloat_array.dat",arr_float);
serializeArrayToFile<MyDouble>("mydouble_array.dat",arr_double);
}
Run Code Online (Sandbox Code Playgroud)
这会生成以下错误:错误C2070:'':非法sizeof操作数.
有人可以解释为什么 …
假设我想估计给定图像的相机姿势,I并且我有一组测量值(例如 2D 点 u i及其相关的 3D 坐标 P i),我想最小化误差(例如平方重投影误差的总和) )。
我的问题是:如何计算最终姿态估计的不确定性?
为了使我的问题更具体,考虑的图像I从我提取的2D点ü我和他们相匹配的三维点P我。表示Ť瓦特相机姿态为这个图象,这是我将被估计,和pi Ť变换映射3D点到其投影的2D点。这是一张小图来澄清事情:
有几种技术可以解决相应的非线性最小二乘问题,考虑我使用以下(高斯牛顿算法的近似伪代码):
我在几个地方读到 J r T .J r可以被认为是姿势估计的协方差矩阵的估计。以下是更准确的问题列表:
非常感谢,对此的任何见解将不胜感激。
algorithm opencv computer-vision uncertainty pose-estimation

在上图中,我有三点(x1,y1) (x2,y2) (x3,y3).
我知道的价值观x1,y1和x2,y2.我知道的欧氏距离(x1,y1)->(x3,y3)
和(x2,y2)->(x3,y3).有这些信息我怎么能找到(x3,y3)?
我希望像代码片段或逻辑一样有用......
我试图用圆圈方程解决这个问题,但我不知道如何继续.
我在没有NDK的情况下在Android上使用OpenCV遇到了一些问题.
目前我正在做一个我的大学的项目,我的厨师告诉我,当从2D图像重建3D对象时,我应该避免相机校准.
到目前为止,我有2个2D图像,并具有所有特征点,匹配,good_matches,基本矩阵和同质矩阵.另外,我使用StereoBM计算了视差图.下一步应该是从所有这些值中获取3D点云.
我检查了互联网并找到了
Calib3d.reprojectImageTo3D(disparity, _3dImage, Q, false);
Run Code Online (Sandbox Code Playgroud)
使用这种方法,我应该能够重新创建3D点云......目前的问题是,我没有Matrix Q.我想我会从方法中得到这个
stereoRectify(...);
Run Code Online (Sandbox Code Playgroud)
但是因为我应该避免cameraCalibration用于这种特定情况,所以我不能使用这种方法.替代方案
stereoRectifyUncalibrated(...);
Run Code Online (Sandbox Code Playgroud)
不提供Q ...
有人可以帮助我,告诉我如何以更简单的方式获得Q或点云吗?谢谢
math ×2
opencv ×2
3d ×1
algorithm ×1
android ×1
c++ ×1
java ×1
quaternions ×1
sizeof ×1
templates ×1
trigonometry ×1
uncertainty ×1