在 C++ 中将 vector<Rect> OpenCV 转换为 vector<vector<float>>

Posted

技术标签:

【中文标题】在 C++ 中将 vector<Rect> OpenCV 转换为 vector<vector<float>>【英文标题】:Convert vector<Rect> OpenCV to vector<vector<float>> in C++ 【发布时间】:2017-06-29 13:39:46 【问题描述】:

我正在尝试将 vector Rect 数据类型转换为 vector vector float 以对向量使用非最大抑制。向量包含面的矩形点。我想申请nms,如下所示:Non Maximum Suppression。

尝试编译时出现以下错误:

**

undefined reference to `nms(std::vector<std::vector<float, std::allocator<float> >, std::allocator<std::vector<float, std::allocator<float> > > > const&, float const&)'
collect2: error: ld returned 1 exit status

**

我不知道为什么它给nms 函数2x vector vector float? 感谢您的帮助!

   vector<Rect> apply_pre_filters(vector<Rect>faces_vector)


    // Non Max Suppression
    float threshold = 0.5;
    vector<vector<float>> faces_vector_float_container;
    cout << "original vector size" << faces_vector.size() << endl;

    for (int i=0; i < faces_vector.size(); i++) 
        vector<int> faces_vector_int = faces_vector[i].tl().x,faces_vector[i].tl().y,faces_vector[i].br().x, faces_vector[i].br().y;
        vector<float> faces_vector_float(faces_vector_int.begin(), faces_vector_int.end());

        faces_vector_float_container.push_back(faces_vector_float);
    

    cout << "modified vector size" << faces_vector_float_container.size() << endl;
    vector<Rect> filtered_faces_vector = nms(faces_vector_float_container, threshold);

    // Change Faces detected flag
    if(faces_vector.size() > 0)
        faces_detected = true;
    else
        faces_detected = false;
    

    return faces_vector;

【问题讨论】:

如果你想把vector&lt;Rect&gt;转换成vector&lt;vector&lt;float&gt;&gt;,你为什么不把矩形的Mat(边界框但仍然是Mat)转换成list(你也可以将其转换为矢量)?您可以使用 Rect.tl() 和 Rect.br() 从 Rect 填充向量 您是否忘记编译nms 的实现并将其与您的代码链接? 该错误是链接错误,这意味着您包含一个带有函数的 .h 文件,您使用了该函数,但编译的 .cpp 文件没有链接到代码。你应该写下你是如何编译它来发现你缺少什么的。 我正在使用 Clion 并包含这两个文件。它实际上应该自动编译它。如果我查看函数nms 的定义,它需要std::vector&lt;cv::Rect&gt; nms(const std::vector&lt;std::vector&lt;float&gt;&gt; &amp;, const float &amp;); 我的错误说我正在传递向量浮点数2x?还是我错了。我正在使用这个库:github.com/martinkersner/non-maximum-suppression-cpp 【参考方案1】:

我将nms 文件添加到CMakeFileList.txt SOURCE_FILES()。现在好像可以了。

【讨论】:

以上是关于在 C++ 中将 vector<Rect> OpenCV 转换为 vector<vector<float>>的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将输入正确读入 2D 向量 vector<vector<int>>

在 C++ 中将 const vector<uint8_t> 转换/转换为 const vector<char>

从 MATLAB 生成代码后,在 C++ 中将 vector<> 转换为 emxArray_real_T

如何使用 <numpy/arrayobject.h> 在 c++ 中将数据从 np.array 获取到 std::vector?

在现代 C++ 中将 std::array<std::array<T,N>> 转换为 std::vector<T>

如何在 JniWrapper 中将 Java ArrayList<float[]> 映射到 C++ Vector<array<float,size>>?