Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于opencv的卡尔曼滤波多目标跟踪_Opencv - Fatal编程技术网

基于opencv的卡尔曼滤波多目标跟踪

基于opencv的卡尔曼滤波多目标跟踪,opencv,Opencv,我成功地使用卡尔曼滤波器跟踪单个目标。现在我要跟踪两个对象。我不知道如何对两个物体应用卡尔曼滤波。任何人都可以帮忙。看看我的实现 GitHub上的资料来源: 以下是项目跟踪2个目标的main.cpp文件: #include "opencv2/opencv.hpp" //#include "BackgroundSubtract.h" //#include "Detector.h" #include <opencv2/highgui/highgui_c.h> #include "CT

我成功地使用卡尔曼滤波器跟踪单个目标。现在我要跟踪两个对象。我不知道如何对两个物体应用卡尔曼滤波。任何人都可以帮忙。

看看我的实现

GitHub上的资料来源:

以下是项目跟踪2个目标的main.cpp文件:

#include "opencv2/opencv.hpp"
//#include "BackgroundSubtract.h"
//#include "Detector.h"

#include <opencv2/highgui/highgui_c.h>
#include "CTracker.h"
#include <iostream>
#include <vector>

using namespace cv;
using namespace std;

float X=0,Y=0;
float Xmeasured=0,Ymeasured=0;
RNG rng;
//-----------------------------------------------------------------------------------------------------
// Mouse callback
//-----------------------------------------------------------------------------------------------------
void mv_MouseCallback(int event, int x, int y, int /*flags*/, void* /*param*/)
{
    if(event == cv::EVENT_MOUSEMOVE)
    {
        X=(float)x;
        Y=(float)y;
    }
}

int main(int ac, char** av)
{
    int k=0;
    // Track colors
    Scalar Colors[]={Scalar(255,0,0),Scalar(0,255,0),Scalar(0,0,255),Scalar(255,255,0),Scalar(0,255,255),Scalar(255,255,255)};
    namedWindow("Video");
    Mat frame=Mat(800,800,CV_8UC3);

    VideoWriter vw=VideoWriter::VideoWriter("output.mpeg", CV_FOURCC('P','I','M','1'), 20, frame.size());

    // Attach mouse callback to window
    setMouseCallback("Video",mv_MouseCallback,0);

    CTracker tracker(0.2,0.5,60.0,25,25);
    float alpha=0;
    while(k!=27)
    {
        frame=Scalar::all(0);

        // add some noise (simulation of real measurement)
        Xmeasured=X+rng.gaussian(2.0);
        Ymeasured=Y+rng.gaussian(2.0);

        // Add tracking targets
        // sin and cos added for more fun :)
        vector<Point2d> pts;
        pts.push_back(Point2d(Xmeasured+100.0*sin(-alpha),Ymeasured+100.0*cos(-alpha))); // 1-st target coords
        pts.push_back(Point2d(Xmeasured+100.0*sin(alpha),Ymeasured+100.0*cos(alpha)));   // 2-nd target coords 
        //pts.push_back(Point2d(Xmeasured+100.0*sin(alpha/2.0),Ymeasured+100.0*cos(alpha/2.0)));
        //pts.push_back(Point2d(Xmeasured+100.0*sin(alpha/3.0),Ymeasured+100.0*cos(alpha/1.0)));
        alpha+=0.05;

    // Draw targets
    for(int i=0; i<pts.size(); i++)
    {
    circle(frame,pts[i],3,Scalar(0,255,0),1,CV_AA);
    }

    // Update tracks
        tracker.Update(pts);

    //  cout << tracker.tracks.size()  << endl;

    // Draw tracks
        for(int i=0;i<tracker.tracks.size();i++)
        {
            if(tracker.tracks[i]->trace.size()>1)
            {
                for(int j=0;j<tracker.tracks[i]->trace.size()-1;j++)
                {
                    line(frame,tracker.tracks[i]->trace[j],tracker.tracks[i]->trace[j+1],Colors[i%6],2,CV_AA);
                }
            }
        }
        imshow("Video",frame);

        // write videoframe to file
        // vw << frame;
        k=waitKey(10);
    }
    vw.release();
    destroyAllWindows();
    return 0;


}
#包括“opencv2/opencv.hpp”
//#包括“背景减去.h”
//#包括“Detector.h”
#包括
#包括“CTracker.h”
#包括
#包括
使用名称空间cv;
使用名称空间std;
浮动X=0,Y=0;
浮点数Xmeasured=0,Ymeasured=0;
RNG-RNG;
//-----------------------------------------------------------------------------------------------------
//鼠标回调
//-----------------------------------------------------------------------------------------------------
void mv_MouseCallback(int事件、int x、int y、int/*标志*/、void*/*参数*/)
{
if(event==cv::event\u MOUSEMOVE)
{
X=(浮动)X;
Y=(浮动)Y;
}
}
内部主(内部ac,字符**av)
{
int k=0;
//轨道颜色
标量颜色[]={标量(255,0,0)、标量(0255,0)、标量(0,0255)、标量(255255,0)、标量(025525255)、标量(255255)};
namedWindow(“视频”);
垫架=垫(800800,CV_8UC3);
VideoWriter vw=VideoWriter::VideoWriter(“output.mpeg”,CV_FOURCC('P','I','M','1'),20,frame.size());
//将鼠标回调附加到窗口
setMouseCallback(“视频”,mv_MouseCallback,0);
CTracker跟踪器(0.2,0.5,60.0,25,25);
浮点α=0;
而(k!=27)
{
帧=标量::全部(0);
//添加一些噪声(真实测量的模拟)
Xmeasured=X+rng.高斯(2.0);
Y测量=Y+高斯分布(2.0);
//添加跟踪目标
//为增加更多乐趣,增加了罪恶和罪恶:)
向量pts;
点推后(点2D(X测量+100.0*sin(-alpha),Y测量+100.0*cos(-alpha));//第一个目标坐标
点推后(点2D(X测量+100.0*sin(alpha),Y测量+100.0*cos(alpha));//第二个目标坐标
//pts.推回(点2D(X测量+100.0*sin(α/2.0),Y测量+100.0*cos(α/2.0));
//pts.推回(点2D(X测量+100.0*sin(α/3.0),Y测量+100.0*cos(α/1.0));
α+=0.05;
//打靶
对于(inti=0;itrace[j+1],颜色[i%6],2,CV_AA);
}
}
}
imshow(“视频”,帧);
//将视频帧写入文件

//vw看看我的实现

GitHub上的资料来源:

以下是项目跟踪2个目标的main.cpp文件:

#include "opencv2/opencv.hpp"
//#include "BackgroundSubtract.h"
//#include "Detector.h"

#include <opencv2/highgui/highgui_c.h>
#include "CTracker.h"
#include <iostream>
#include <vector>

using namespace cv;
using namespace std;

float X=0,Y=0;
float Xmeasured=0,Ymeasured=0;
RNG rng;
//-----------------------------------------------------------------------------------------------------
// Mouse callback
//-----------------------------------------------------------------------------------------------------
void mv_MouseCallback(int event, int x, int y, int /*flags*/, void* /*param*/)
{
    if(event == cv::EVENT_MOUSEMOVE)
    {
        X=(float)x;
        Y=(float)y;
    }
}

int main(int ac, char** av)
{
    int k=0;
    // Track colors
    Scalar Colors[]={Scalar(255,0,0),Scalar(0,255,0),Scalar(0,0,255),Scalar(255,255,0),Scalar(0,255,255),Scalar(255,255,255)};
    namedWindow("Video");
    Mat frame=Mat(800,800,CV_8UC3);

    VideoWriter vw=VideoWriter::VideoWriter("output.mpeg", CV_FOURCC('P','I','M','1'), 20, frame.size());

    // Attach mouse callback to window
    setMouseCallback("Video",mv_MouseCallback,0);

    CTracker tracker(0.2,0.5,60.0,25,25);
    float alpha=0;
    while(k!=27)
    {
        frame=Scalar::all(0);

        // add some noise (simulation of real measurement)
        Xmeasured=X+rng.gaussian(2.0);
        Ymeasured=Y+rng.gaussian(2.0);

        // Add tracking targets
        // sin and cos added for more fun :)
        vector<Point2d> pts;
        pts.push_back(Point2d(Xmeasured+100.0*sin(-alpha),Ymeasured+100.0*cos(-alpha))); // 1-st target coords
        pts.push_back(Point2d(Xmeasured+100.0*sin(alpha),Ymeasured+100.0*cos(alpha)));   // 2-nd target coords 
        //pts.push_back(Point2d(Xmeasured+100.0*sin(alpha/2.0),Ymeasured+100.0*cos(alpha/2.0)));
        //pts.push_back(Point2d(Xmeasured+100.0*sin(alpha/3.0),Ymeasured+100.0*cos(alpha/1.0)));
        alpha+=0.05;

    // Draw targets
    for(int i=0; i<pts.size(); i++)
    {
    circle(frame,pts[i],3,Scalar(0,255,0),1,CV_AA);
    }

    // Update tracks
        tracker.Update(pts);

    //  cout << tracker.tracks.size()  << endl;

    // Draw tracks
        for(int i=0;i<tracker.tracks.size();i++)
        {
            if(tracker.tracks[i]->trace.size()>1)
            {
                for(int j=0;j<tracker.tracks[i]->trace.size()-1;j++)
                {
                    line(frame,tracker.tracks[i]->trace[j],tracker.tracks[i]->trace[j+1],Colors[i%6],2,CV_AA);
                }
            }
        }
        imshow("Video",frame);

        // write videoframe to file
        // vw << frame;
        k=waitKey(10);
    }
    vw.release();
    destroyAllWindows();
    return 0;


}
#包括“opencv2/opencv.hpp”
//#包括“背景减去.h”
//#包括“Detector.h”
#包括
#包括“CTracker.h”
#包括
#包括
使用名称空间cv;
使用名称空间std;
浮动X=0,Y=0;
浮点数Xmeasured=0,Ymeasured=0;
RNG-RNG;
//-----------------------------------------------------------------------------------------------------
//鼠标回调
//-----------------------------------------------------------------------------------------------------
void mv_MouseCallback(int事件、int x、int y、int/*标志*/、void*/*参数*/)
{
if(event==cv::event\u MOUSEMOVE)
{
X=(浮动)X;
Y=(浮动)Y;
}
}
内部主(内部ac,字符**av)
{
int k=0;
//轨道颜色
标量颜色[]={标量(255,0,0)、标量(0255,0)、标量(0,0255)、标量(255255,0)、标量(025525255)、标量(255255)};
namedWindow(“视频”);
垫架=垫(800800,CV_8UC3);
VideoWriter vw=VideoWriter::VideoWriter(“output.mpeg”,CV_FOURCC('P','I','M','1'),20,frame.size());
//将鼠标回调附加到窗口
setMouseCallback(“视频”,mv_MouseCallback,0);
CTracker跟踪器(0.2,0.5,60.0,25,25);
浮点α=0;
而(k!=27)
{
帧=标量::全部(0);
//添加一些噪声(真实测量的模拟)
Xmeasured=X+rng.高斯(2.0);
Y测量=Y+高斯分布(2.0);
//添加跟踪目标
//为增加更多乐趣,增加了罪恶和罪恶:)
向量pts;
点推后(点2D(X测量+100.0*sin(-alpha),Y测量+100.0*cos(-alpha));//第一个目标坐标
点推后(点2D(X测量+100.0*sin(alpha),Y测量+100.0*cos(alpha));//第二个目标坐标
//pts.推回(点2D(X测量+100.0*sin(α/2.0),Y测量+100.0*cos(α/2.0));
//pts.推回(点2D(X测量+100.0*sin(α/3.0),Y测量+100.0*cos(α/1.0));
α+=0.05;
//打靶
对于(inti=0;itrace[j+1],颜色[i%6],2,CV_AA);
}
}
}
imshow(“视频”,帧);
//将视频帧写入文件

//vw我无法正确理解代码,请任何人给我使用opencv中的卡尔曼滤波器跟踪两个对象的源代码。我已经更正了我的答案并翻译了一些评论。你能给我使用卡尔曼滤波器跟踪两个对象的代码吗。在我的代码中,我能够检测到两个对象。我已经使用了背景减法器,我能够为它画边界框。在我的代码中,预测函数正在工作,但我们不知道如何应用估计函数。请帮忙。等待你的答复。谢谢。你能把你的探测器和测试视频发给我吗?我将尝试将跟踪器和探测器结合起来。很抱歉,我无法上传测试视频。有没有其他方法可以帮助我我无法正确理解代码,请任何人给我在opencv中使用卡尔曼滤波跟踪两个对象的源代码。我已经更正了我的答案并翻译了一些评论。你能给我使用卡尔曼滤波跟踪两个对象的代码吗。在我的代码中,我能够检测到两个对象。我已经使用了背景减法器,我能够为它画边界框。在我的代码中,预测函数正在工作,但我们不知道如何应用估计函数。请帮忙。等待你的答复。谢谢。你能把你的探测器和测试视频发给我吗?我会试着把追踪器和你的探测器结合起来。对不起