基于opencv的卡尔曼滤波多目标跟踪
我成功地使用卡尔曼滤波器跟踪单个目标。现在我要跟踪两个对象。我不知道如何对两个物体应用卡尔曼滤波。任何人都可以帮忙。看看我的实现 GitHub上的资料来源: 以下是项目跟踪2个目标的main.cpp文件:基于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
#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中使用卡尔曼滤波跟踪两个对象的源代码。我已经更正了我的答案并翻译了一些评论。你能给我使用卡尔曼滤波跟踪两个对象的代码吗。在我的代码中,我能够检测到两个对象。我已经使用了背景减法器,我能够为它画边界框。在我的代码中,预测函数正在工作,但我们不知道如何应用估计函数。请帮忙。等待你的答复。谢谢。你能把你的探测器和测试视频发给我吗?我会试着把追踪器和你的探测器结合起来。对不起