Opencv cvRodrigues2中雅可比矩阵的计算

Opencv cvRodrigues2中雅可比矩阵的计算,opencv,math,matrix,derivative,Opencv,Math,Matrix,Derivative,我正在阅读opencv的源代码:cvProjectPoints2,cvRodrigues2 在cvProjectPoints2中,首先使用cvRodrigues2(&&u-r,&matR,&u-dRdr)获得雅可比矩阵,然后用于计算像素的偏导数w.r.trvec(轴角度表示) 雅可比矩阵似乎是: dR1/dr1, dR2/dr1, ..., dR9/dr1, dR1/dr2, dR2/dr2, ..., dR9/dr2, dR1/dr3, dR2/dr3, ..., dR9/dr3, 但据我所

我正在阅读opencv的源代码:
cvProjectPoints2
cvRodrigues2

cvProjectPoints2
中,首先使用
cvRodrigues2(&&u-r,&matR,&u-dRdr)获得雅可比矩阵,然后用于计算像素的偏导数w.r.trvec(轴角度表示)

雅可比矩阵似乎是:

dR1/dr1, dR2/dr1, ..., dR9/dr1,
dR1/dr2, dR2/dr2, ..., dR9/dr2,
dR1/dr3, dR2/dr3, ..., dR9/dr3,
但据我所知,雅可比矩阵的形状应该是9*3,因为它是R(1~9)w.R.tR(1~3)

dR1/dr1, dR1/dr2, dR1/dr3,
dR2/dr1, dR2/dr2, dR2/dr3,
...
...
dR9/dr1, dR9/dr2, dR9/dr3,
正如政府所说:

雅可比矩阵–可选输出雅可比矩阵,3x9或9x3,这是一个 输出阵列分量的偏导数矩阵 关于输入数组组件


那么我是否误解了代码和文档?还是代码使用了其他约定?还是一个bug(不太可能…?

如果您查找文档:

src – Input rotation vector (3x1 or 1x3) or rotation matrix (3x3).
dst – Output rotation matrix (3x3) or rotation vector (3x1 or 1x3), respectively.
jacobian – Optional output Jacobian matrix, 3x9 or 9x3, which is a matrix of partial derivatives of the output array components with respect to the input array components.
正如您所看到的,您可以切换源位置和目标位置(从数学上讲,这将完全是换位),但是代码没有考虑到这一点


因此,实际上您得到了一个转置的雅可比矩阵,因为您切换了第一个参数的位置(从其类型的默认位置)。再次切换它们,您将得到正常的雅可比矩阵

应该澄清文件中的“3x9或9x3”部分。关于数学定义,你确实是对的,我来查一下这部分的意思。你说的“因为你换了第一个参数”是什么意思?在我的示例代码中,src是一个rvec(3x1),dst是一个rmat(3x3)。如果您的切换意味着“交换src和dst”,这将不会使Jacob mat进行转置,但据我所知,矩阵的每个元素都从
dR/dR
更改为
dR/dR
。请尝试这样做并发布结果。它不会根据文档将dR/dR更改为dR/dR,因为它们明确表示3x3或3x1,并且不会将一个替换为另一个。
dR1/dr1, dR1/dr2, dR1/dr3,
dR2/dr1, dR2/dr2, dR2/dr3,
...
...
dR9/dr1, dR9/dr2, dR9/dr3,
src – Input rotation vector (3x1 or 1x3) or rotation matrix (3x3).
dst – Output rotation matrix (3x3) or rotation vector (3x1 or 1x3), respectively.
jacobian – Optional output Jacobian matrix, 3x9 or 9x3, which is a matrix of partial derivatives of the output array components with respect to the input array components.