gpt4 book ai didi

c++ - Opencv Rect 只创建一个矩形

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:21 25 4
gpt4 key购买 nike

在我尝试实现粒子过滤器时,我首先在我的图像(红色)中的汽车周围手动绘制了一个矩形(x,y,w,h),然后我取了 50 个粒子,并为它们分配噪声,即x=x+噪声(0,15) 和 y=y+噪声(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;
}

输出看起来像这样

enter image description here

下图中的粒子xy坐标,第一个条目是手动硬编码的汽车,其余均为粒子坐标。

enter image description here

最佳答案

不幸的是,问题可能出在 vector 初始化中。在行中:

 //Initializing the particles
std::vector<cv::Mat> particle(N, cv::Mat(4, 1, CV_32F));

您要做的是创建 N 个 Mat 对象,这些对象初始化为大小为 4 x 1 的 float 类型。所以这似乎没问题......等等! 如果 vector 中的所有 Mat 对象共享相同的矩阵数据怎么办? 我们都知道 Mat 容器有一个 header 和 data。当 header 相互分配或执行复制构造函数时,不会复制数据。就像我们的情况一样。到底是什么让我们想象一下 vector 构造函数如何工作:

template<class T>
vector::vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type()) {
// how it can be written? Probably in the following way:
this->resize(n); // allocates using allocator
for(int i=0;i<n;i++)
this->innerBuffer[i] = alloc(val); // runs copy constructor with argument val
// in our case, this is cv::Mat(const cv::Mat &)
}

如果您考虑复制 cv::Mat 容器,只会复制标题。如果您想克隆数据本身,则必须直接指定它,例如使用 Mat::clone() 方法。并且 vector 构造函数绝对不使用 clone()。所以数据不会被克隆,所有 Mat 对象共享相同的数据,尽管 header 不同!

您可以轻松检查这是否属实(如果不是,我会感到惊讶):更改代码片段:

 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"; // it is obvius that HERE particles are different
// beacuse in the next loop run you overwrite them!
}

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);
}

 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;

}

for (int i = 0; i < N; i++)
{
cout << particle[i] << "\n";

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);
}

我希望所有粒子都是相同的。

引用: ( here )

 vector(size_type __n, const value_type& __value,
00199 const allocator_type& __a = allocator_type())
00200 : _Base(__n, __a)
00201 { this->_M_impl._M_finish = std::uninitialized_fill_n(this->
00202 _M_impl._M_start,
00203 __n, __value); }
00204

关于c++ - Opencv Rect 只创建一个矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24257784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com