- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想使用 Opencv 卡尔曼滤波器实现来平滑一些噪声点。所以我尝试为它编写一个简单的测试。
假设我有一个观察结果(一个点)。我收到新观察的每一帧,我称卡尔曼预测和卡尔曼正确。 opencv Kalman filter正确后的状态是“following the point”,没问题。
那么假设我有一个缺失的观察结果,无论如何我都希望更新卡尔曼滤波器并预测新状态。这里我的代码失败了:如果我调用 kalman.predict() 值不再更新。
这是我的代码:
#include <iostream>
#include <vector>
#include <sys/time.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/tracking.hpp>
using namespace cv;
using namespace std;
//------------------------------------------------ convenience method for
// using kalman filter with
// Point objects
cv::KalmanFilter KF;
cv::Mat_<float> measurement(2,1);
Mat_<float> state(4, 1); // (x, y, Vx, Vy)
void initKalman(float x, float y)
{
// Instantate Kalman Filter with
// 4 dynamic parameters and 2 measurement parameters,
// where my measurement is: 2D location of object,
// and dynamic is: 2D location and 2D velocity.
KF.init(4, 2, 0);
measurement = Mat_<float>::zeros(2,1);
measurement.at<float>(0, 0) = x;
measurement.at<float>(0, 0) = y;
KF.statePre.setTo(0);
KF.statePre.at<float>(0, 0) = x;
KF.statePre.at<float>(1, 0) = y;
KF.statePost.setTo(0);
KF.statePost.at<float>(0, 0) = x;
KF.statePost.at<float>(1, 0) = y;
setIdentity(KF.transitionMatrix);
setIdentity(KF.measurementMatrix);
setIdentity(KF.processNoiseCov, Scalar::all(.005)); //adjust this for faster convergence - but higher noise
setIdentity(KF.measurementNoiseCov, Scalar::all(1e-1));
setIdentity(KF.errorCovPost, Scalar::all(.1));
}
Point kalmanPredict()
{
Mat prediction = KF.predict();
Point predictPt(prediction.at<float>(0),prediction.at<float>(1));
return predictPt;
}
Point kalmanCorrect(float x, float y)
{
measurement(0) = x;
measurement(1) = y;
Mat estimated = KF.correct(measurement);
Point statePt(estimated.at<float>(0),estimated.at<float>(1));
return statePt;
}
//------------------------------------------------ main
int main (int argc, char * const argv[])
{
Point s, p;
initKalman(0, 0);
p = kalmanPredict();
cout << "kalman prediction: " << p.x << " " << p.y << endl;
/*
* output is: kalman prediction: 0 0
*
* note 1:
* ok, the initial value, not yet new observations
*/
s = kalmanCorrect(10, 10);
cout << "kalman corrected state: " << s.x << " " << s.y << endl;
/*
* output is: kalman corrected state: 5 5
*
* note 2:
* ok, kalman filter is smoothing the noisy observation and
* slowly "following the point"
* .. how faster the kalman filter follow the point is
* processNoiseCov parameter
*/
p = kalmanPredict();
cout << "kalman prediction: " << p.x << " " << p.y << endl;
/*
* output is: kalman prediction: 5 5
*
* note 3:
* mhmmm, same as the last correction, probabilly there are so few data that
* the filter is not predicting anything..
*/
s = kalmanCorrect(20, 20);
cout << "kalman corrected state: " << s.x << " " << s.y << endl;
/*
* output is: kalman corrected state: 10 10
*
* note 3:
* ok, same as note 2
*/
p = kalmanPredict();
cout << "kalman prediction: " << p.x << " " << p.y << endl;
s = kalmanCorrect(30, 30);
cout << "kalman corrected state: " << s.x << " " << s.y << endl;
/*
* output is: kalman prediction: 10 10
* kalman corrected state: 16 16
*
* note 4:
* ok, same as note 2 and 3
*/
/*
* now let's say I don't received observation for few frames,
* I want anyway to update the kalman filter to predict
* the future states of my system
*
*/
for(int i=0; i<5; i++) {
p = kalmanPredict();
cout << "kalman prediction: " << p.x << " " << p.y << endl;
}
/*
* output is: kalman prediction: 16 16
* kalman prediction: 16 16
* kalman prediction: 16 16
* kalman prediction: 16 16
* kalman prediction: 16 16
*
* !!! kalman filter is still on 16, 16..
* no future prediction here..
* I'm exprecting the point to go further..
* why???
*
*/
return 0;
}
我认为这段代码很好地说明了我不理解的地方。我试着关注 some theory还有一些practical example但仍然不知道如何获得对 future 位置的新预测..
任何人都可以帮助我理解我做错了什么?
最佳答案
致那些在使用 OpenCV 卡尔曼滤波时仍有问题的人
上面发布的代码经过小的修改后运行良好。您可以按如下方式设置,而不是将转换矩阵设置为 Identity。
修改
KF.transitionMatrix = *(Mat_<float>(4, 4) << 1,0,1,0, 0,1,0,1, 0,0,1,0, 0,0,0,1);
输出
关于c++ - 没有新观察的Opencv卡尔曼滤波器预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18403918/
我想知道是否有一种方法可以重复记录而不进行排序?有时候,我想保持原始顺序,只想删除重复的记录。 是否可以? 顺便说一句,以下是我所知道的有关重复记录的信息,这些记录最终会进行排序。 1。 proc s
我想更新我的 Activity 中依赖于另一个列表的数据的列表。这两个数据列表都是从我的 View 模型的 Activity 中观察到的。从第一个列表获取数据后,我需要在此列表上运行 for 循环以获
我无法理解这个问题。我怎样才能等待 i==2 完成然后再继续其他 i 的操作? class Observable { constructor() { this.observer
我正在观察这样的 Ember Data RecordArray: myArray: function() { return MyRecord.find(); }.property(), isDir
我想在动画开始时观察 strokeEnd 键路径。但是它不起作用,我哪里出错了? - (void)addAnimation { // do animation CABasicAnima
是否可以在 Algorand 中观看某个交易,就像在以太坊中观看某个事件一样? 最佳答案 官方 algod 和 indexer API 目前不支持在 Algorand 上观看交易/事件。 您可以通过使
我有一个可以拖放到其他 View 之上的 View (可以说是类别)。为了检测我在哪个类别 View 之上,我将它们的帧存储在一个帧数组中,这发生在它们不可见叠加层的 onAppear 中。 (这基于
是否可以将观察者添加到可见性更改(即调用 show() 和 hide())时触发的 DOM 元素?谢谢! 最佳答案 如果您想观察任何对 .show() 或 .hide() 的调用,并且可以访问 jQu
我对保存在 NSUserdefaults 中的特定键的值变化感兴趣。然而,我所拥有的并不适合我。 observeValueForKeyPath 不会被触发。 更新:我想我已经发现了这个问题。如果我使用
我正在寻找在 UITableView 顶部实现捏入/捏出,我已经研究了几种方法,包括这个: Similar question 但是,虽然我可以创建一个 UIViewTouch 对象并将其覆盖到我的 U
我有一个在界面中公开的可变数组。我还公开了数组访问器来修改数组。如果数组内发生任何修改,我将不得不使用 KVO 重置并重新计算一些数据。为了支持 KVO,我使用 array accessors如下图:
当 NSPopupButton 发生变化时如何获得方法调用?谢谢! 最佳答案 您只需添加一个操作方法,就像使用 NSButton 或任何其他控件一样。 关于iphone - 观察 NSPopupBut
我正在尝试让键值观察适用于 NSMutableArray。下面是被观察类 MyObservee 的 .h 文件: @interface MyObservee : NSObject { @pri
我很难理解让 Node.js 进程(异步)运行但仍然触发“退出”状态,以便在 CPU 处理完成后我可以做更多事情。 例如,我有一个 Google 地方信息抓取工具,可以在所有可用的 CPU 上高效地分
我正在尝试编写行为类似于kubectl get pods --watch . 这样,每次 pod 的状态发生变化时,我都会被触发。 我创建了一个 go项目(在集群中运行)并添加以下代码: podsWa
我有这个代码: 当时我需要触发Javascript方法或具有给定 id 的 div 隐藏或显示,这将在屏幕调整大小期间发生(因此 u k-hidden-small ),这可以
我想使用 Couchbase,但我想在一些类似于 RethinkDB 的方式实现更改跟踪。 似乎有很多方法可以将更改从 Couchbase 服务器推送给我。 DCP 点击 XDCR 哪一个是正确的选择
虽然 MutationObserver 允许监视 HTMLElement 属性的显式大小更改,但它似乎没有一种方法/配置允许我监视其大小的隐式更改,这些更改是由浏览器。 这是一个例子: const o
我有一个 auto-carousel 指令,它循环访问链接元素的子元素。 但是,子级尚未加载到 DOM 中,因为它们的 ng-if 表达式尚未解析。 如何确保父指令知道其 DOM 树已发生更改?
有没有办法观察 AngularJS 指令中函数表达式的值变化?我有以下 HTML 和 JavaScript,模板中 {{editable()}} 的插值显示该值计算为 true,而检查 Chrome
我是一名优秀的程序员,十分优秀!