作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用OpenCV来预测使用网络摄像头看到的球的运动。但是,我在cvKalmanPredict状态上总是遇到错误,因此我将代码简化为以下几行,并尝试单独测试过滤器:
CvKalman* kalman = cvCreateKalman(6,3,1);
kalman->temp2 = cvCreateMat(1, 1, CV_32FC1);
float alpha = 0.1, beta = 0.2;
float kalmA[] = {1.0+t0/t1, 0, 0, -t0/t1, 0, 0,
0, 1.0+t0/t1, 0, 0, -t0/t1, 0,
0, 0, 1.0+t0/t1, 0, 0, -t0/t1,
1, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0};
float kalmB[] = {0, 0, 1, 0, 0, 0};
float kalmH[] = {1, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0};
float kalmQ[] = {alpha, 0, 0, 0, 0, 0,
0, alpha, 0, 0, 0, 0,
0, 0, beta, 0, 0, 0,
0, 0, 0, alpha, 0, 0,
0, 0, 0, 0, alpha, 0,
0, 0, 0, 0, 0, beta};
float kalmR[] = {alpha, 0, 0,
0, alpha, 0,
0, 0, beta};
float kalmS[] = {0,0,0, 0, 0, 0};
float kalmP[] = {480, 0, 0, 0, 0, 0,
0, 480, 0, 0, 0, 0,
0, 0, 480, 0, 0, 0,
0, 0, 0, 480, 0, 0,
0, 0, 0, 0, 480, 0,
0, 0, 0, 0, 0, 480};
memcpy( kalman->transition_matrix->data.fl, kalmA, sizeof(kalmA) );
memcpy( kalman->control_matrix->data.fl, kalmB, sizeof(kalmB) );
memcpy( kalman->measurement_matrix->data.fl, kalmH, sizeof(kalmH) );
memcpy( kalman->process_noise_cov->data.fl, kalmQ, sizeof(kalmQ) );
memcpy( kalman->measurement_noise_cov->data.fl, kalmR, sizeof(kalmR) );
// initialize state and covariance
memcpy( kalman->state_post->data.fl, kalmS, sizeof(kalmS) );
cvSetIdentity( kalman->error_cov_post, cvRealScalar(3));
// update the control
float t0 = 0.3;
cvSetReal2D( kalman->temp2, 0, 0, -490 * t0 * t0 );
const CvMat* kalmanPred = cvKalmanPredict(kalman, kalman->temp2);
CvMat* kalmMeas = cvCreateMat(3,1,CV_32FC1);
cvSetReal2D(kalmMeas, 0, 0, 3);
cvSetReal2D(kalmMeas, 1, 0, 2);
cvSetReal2D(kalmMeas, 2, 0, 5.5);
cvKalmanCorrect(kalman, kalmMeas);
cvReleaseMat(&kalmMeas);
// release memory
OpenCV Error: Assertion failed ((D.rows == ((flags & CV_GEMM_A_T) == 0 ? A.rows : A.cols)) && (D.cols == ((flags & CV_GEMM_B_T) == 0 ? B.cols : B.rows)) && D.type() == A.type() in unknown function. file C:\Users\opencv\modules\core\src\matmul.cpp. line 2930
最佳答案
合理的解释
在阅读详细的错误消息时,该断言似乎正在测试A和B是否符合D的大小。大概此检查发生在涉及这三个矩阵的计算(cvKalmanPredict
)之前。
错误消息中指定的矩阵A,B和D可能与示例中提供的三个或更多矩阵直接相关(A
可能对应于kalmA
等)。
需要更多代码来阐明A,B和D与声明的矩阵之间的关系(如果有)。在openCV库中设置断点可能会有所帮助。
列出矩阵大小可以提供一个见解:
Variable Size Variable Size Variable Size
kalmA 6x6 kalmQ 6x6 kalmR 3x3
kalmB 6x6 kalmS 6x6
kalmH 6x6 kalmP 6x6
kalmR
是唯一大小不同的矩阵,因此该矩阵可能是断言失败的来源。
kalmR
是开始跟踪代码的有用变量。
flags & CV_GEMM_B_T
表达式中的关联标志,以指示阵列是MxN还是NxM格式。
//should that solitary B be an A?
D.rows == .. A.rows && D.cols == .. B.cols && D.type() == A.type()
D.type() == A.type()
//simplified assertion with B replaced by A
D.rows == .. A.rows && D.cols == .. A.cols
type()
短路,因此具有不同行数或列数的任意两个矩阵将排除对断言中对
&&
的调用。然而,在最初的断言中,仅测试D和A的一个维度是否相等,这表明检查是确定两个矩阵是否兼容乘法。
D.rows == .. B.rows && D.cols == .. B.cols && D.type == B.type()
CV_GEMM_A_T
,
CV_GEMM_B_T
的存在支持此 View -A和B的信息,与D不同包含在单数
flags
中。
D.type() == B.type()
,因为它会是多余的)。
D.rows == .. A.cols && D.type() == A.type() && D.cols == .. B.rows
D * A
,这是一个乘法运算(加法运算将需要比较此处未发生的每个矩阵维度)。
B * D
。
D * A + B * D
或可能的
D * A - B * D
或一些类似的矩阵组合由GEMM函数执行。
A * B
或
A + B
。
D = A * B
。
B = D * A
和
A = B * D
等其他组合充分相关
cvMatMul
,
cvMatMulAdd
或
cvGEMM
,其相应的矩阵运算是:
D = A * B // cvMatMul
D = A * B + C // cvMatMulAdd
D = α A * B + β C // cvGEMM - Generalized Matrix Multiplication
// alpha, beta are scalars unlike A, B, C, D
flags
变量
flags
变量中的位字段由CV_GEMM_A_T和CV_GEMM_B_T标识。类似的讨论适用于这些标志设置的各种组合。
CV_GEMM_A_T
和
CV_GEMM_B_T
对应的位不为零时,将应用两个断言中的第一个(素数表示转置操作):
// matrix-size selected by the conditional operator when the ...
D.rows == .. A'.rows && D.cols == .. B'.cols // ... bit fields are set
D.rows == .. A .cols && D.cols == .. B .rows // ... bit fields are unset
flags & CV_GEMM_A_T
和
flags & CV_GEMM_B_T
为零时,断言采用不同的形式。
关于c++ - OpenCV卡尔曼滤波器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10459126/
为了帮助人们理解我要问的问题,我选择完全改写它。我希望这能解决问题。 我正在以 1 秒的速率收集 GPS 数据(纬度/经度)。了解此数据可能不是 100% 准确,并且偶尔有一个(1 个或多个)数据点偏
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我正在关注 Matlab编码器kalman教程在 Matlab帮助。使用时 codegen ,出现如下错误: /usr/bin/ld: cannot find -lstdc++ collect2: l
我是一名优秀的程序员,十分优秀!