【发布时间】:2014-06-17 07:14:49
【问题描述】:
在我尝试实现粒子过滤器时,我首先在图像中的汽车周围手动绘制了一个矩形(x,y,w,h)(红色),然后我选取了 50 个粒子,并为它们分配了噪声,即x=x+noise(0,15) 和 y=y+noise(0,15)。
然后我想用绿色为每个粒子绘制所有矩形,但不是显示 50 个矩形,而是只显示一个矩形。
#include<opencv2\core\core.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<stdio.h>
#include<iostream>
#include<random>
using namespace cv;
using namespace std;
const int N = 50;// no of particles
string intToString(int number){
//this function has a number input and string output
std::stringstream ss;
ss << number;
return ss.str();
}
int main()
{
Mat frame;
frame = imread("f (1).png");
namedWindow("Out");
//locating the car manually
Rect car(175, 210, 42, 31);
//making a rectangle around the car
rectangle(frame, car, Scalar(0, 0,255), 1, 8, 0);
//getting tht height and width of the frame
const int FRAME_HEIGHT = frame.rows;
const int FRAME_WIDTH = frame.cols;
//Particle filter initialization
Mat Init = (Mat_<float>(4, 1) << car.x, car.y, 0, 0);
//for a gaussian noise distribution
std::default_random_engine generator;
std::normal_distribution<double> distribution(0, 15);
//Initializing the particles
std::vector<cv::Mat> particle(N, cv::Mat(4, 1, CV_32F));
cout << car.x << " " << car.y << "\n";
for (int i = 0; i < N; i++)
{
particle[i].at<float>(0, 0) = Init.at<float>(0, 0) + distribution(generator);
particle[i].at<float>(1, 0) = Init.at<float>(1, 0) + distribution(generator);
particle[i].at<float>(2, 0) = 0.0;
particle[i].at<float>(3, 0) = 0.0;
cout << particle[i] << "\n";
}
for (int i = 0; i < N; i++)
{
int x = particle[i].at<float>(0, 0);
int y = particle[i].at<float>(1, 0);
rectangle(frame, Rect(x, y, 42, 31), Scalar(0, 255, 0), 1, 8, 0);
}
imshow("Out", frame);
waitKey();
return 0;
}
输出如下所示
粒子xy坐标如下图,第一项是手动硬编码的汽车,其余都是粒子坐标。
【问题讨论】:
-
在绘制之前,棱角的位置是什么?似乎所有粒子的位置几乎相同......
-
好吧,将您的问题分成多个任务并评估每个任务,首先:您的随机数生成器
distribution(generator)是否正常工作?例如。将其替换为rand()%15。 -
@marol 的出色回答。尝试更简单的容器,例如 std::vector<:rect> 或 std::vector<:point>.
-
可以通过在绘图前再次打印粒子位置来简化定位问题。
-
@Micka 这正是我在回答中所建议的。
标签: c++ opencv particle-filter