【问题标题】:Object track with Kalman filter带卡尔曼滤波器的目标跟踪
【发布时间】:2014-02-13 19:19:39
【问题描述】:

我想实现一个卡尔曼滤波器来跟踪一个点,这是我的代码

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {        
    mRgba = inputFrame.rgba();
    mGray = inputFrame.gray();      

    switch (viewMode) {

    case VIEW_MODE_ColorDetect:


            /**
             * 
             * some code for color detect 
             * 
             */

            int ObjectCenterX = (int)((mboundingRect.tl().x + mboundingRect.br().x) / 2);
            int ObjectCenterY = (int)((mboundingRect.tl().y + mboundingRect.br().y) / 2);

            //get the object center point , and I whant to track it by kalman filter.
            Core.circle(mRgba, new Point(ObjectCenterX, ObjectCenterY), 5, ColorGreen, 2);


            /***********************************************Kalman************************************************************/
            try {                   
                Mat ObjectPoint = new Mat(1, 2, CvType.CV_32F);
                int[] PreObjectCenter = {ObjectCenterX, ObjectCenterY};
                ObjectPoint.put(0, 0, PreObjectCenter[0]);
                ObjectPoint.put(0, 1, PreObjectCenter[1]);
                ObjectPoint = myKalmanFilter(ObjectPoint);

                /**Question 2: How to get corrected point from Mat?**/

            } catch (Exception e) {
                Log.e("In camera fram: ", e.toString());
            }
            /*****************************************************************************************************************/

        }
     return mRgba;



return mRgba;
}

private Mat myKalmanFilter(Mat objectPoint){
    KalmanFilter KF = new KalmanFilter();
    try {
        KF.predict(objectPoint);

        KF.correct(objectPoint);
    } catch (Exception e) {
        Log.e("myKalmanFilter: ", e.toString());
    }

    return objectPoint;
}

我有 2 个问题,Q1。我收到此代码的以下错误:

17:44:22.727: E/cv::error()(24902): OpenCV 错误: 断言失败 (type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) in void cv::gemm(cv::InputArray, cv::InputArray, double, cv::InputArray, double, cv::OutputArray, int), 文件 /home/reports /ci/slave_desktop/50-SDK/opencv/modules/core/src/matmul.cpp,第 711 行 17:44:22.727: E/org.opencv.video(24902): video::predict_10() 捕获 cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/ matmul.cpp:711: 错误: (-215) type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2) in function void cv: :gemm(cv::InputArray, cv::InputArray, double, cv::InputArray, double, cv::OutputArray, int) 17:44:22.727: E/myKalmanFilter:(24902): CvException [org.opencv.core.CvException: cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/ matmul.cpp:711: 错误: (-215) type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2) in function void cv: :gemm(cv::InputArray, cv::InputArray, double, cv::InputArray, double, cv::OutputArray, int) 17:44:22.727: E/myKalmanFilter:(24902): ]

第二季度。修改了可以运行的代码后,如何从 Mat 中获取 x 和 y 点?

编辑: 我还是不知道怎么设置 KalmanFilter 尺寸,我这样设置private KalmanFilter KF = new KalmanFilter(1, 2, 16, CvType.CV_32F);和eclipse show

线程 [ main](挂起(UnsatisfiedLinkError 异常))
KalmanFilter.(int, int, int, int) 行:72
Tutorial1Activity.() 行:65 Class.newInstanceImpl() 行:不可用 [本机方法] Class.newInstance() 行:1319
Instrumentation.newActivity(ClassLoader, String, Intent) 行:1069 ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) 行:2258
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) 行:2387 ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) 行:151
ActivityThread$H.handleMessage(Message) 行:1331
ActivityThread$H(Handler).dispatchMessage(Message) 行:99 Looper.loop() 行:155 ActivityThread.main(String[]) 行:5485
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) 行:不可用 [本机方法]
Method.invoke(Object, Object...) 行:511
ZygoteInit$MethodAndArgsCaller.run() 行:1028 ZygoteInit.main(String[]) 行:795 NativeStart.main(String[]) 行:不可用 [本机方法]

【问题讨论】:

    标签: android opencv image-processing kalman-filter


    【解决方案1】:
    • 请不要为每个预测/校正创建新的 KalmanFilter,它必须在程序工作的整个持续时间内保持状态。

    • 您需要为测量尺寸和 dynparamsize 创建具有正确尺寸的 KalmanFilter,调用空构造函数会出现上述错误。

    • KF.predict(objectPoint) 将覆盖 objectPoint 中的内容,因此您使用的是预测值而不是测量值进行校正。要么在那里使用 2 个不同的 Mats,要么颠倒预测/正确的顺序

    • 不幸的是,opencv java 包装器不允许您为卡尔曼滤波器设置 statePre 或转换垫。它的当前界面有点无法使用。你要么需要 jni 来设置它们,要么使用 javacv 绑定(它们已经过时了,但至少可以更好地处理这部分)

    【讨论】:

    • 我修改了代码,但还是有一些错误,我会再问一个问题。谢谢你的帮助。
    【解决方案2】:

    很好的例子

    卡尔曼滤波器实现(跟踪鼠标位置)

    http://opencvexamples.blogspot.com/2014/01/kalman-filter-implementation-tracking.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多