如何将矢量<...> 转换为 cv::Mat?

Posted

技术标签:

【中文标题】如何将矢量<...> 转换为 cv::Mat?【英文标题】:How to convert vector<...> to cv::Mat? 【发布时间】:2013-02-11 06:57:49 【问题描述】:

vector&lt;Descriptor&gt; m_keyDescs

描述符指定如下:

Descriptor(float x, float y, vector<double> const& f)

    xi = x;
    yi = y;
    fv = f;

推像:

m_keyDescs.push_back(Descriptor(descxi, descyi, fv));

如何将此向量转换为 cv::Mat?

我试过了

descriptors_scene = cv::Mat(m_keyDescs).reshape(1);

项目调试没有错误,但是当它运行时在我的mac上的Qt Creator中出现错误:

测试意外退出 单击重新打开以再次打开应用程序。

【问题讨论】:

【参考方案1】:

您不能将手动定义的类的向量直接转换为 Mat。例如,OpenCV 不知道将每个元素放在哪里,并且这些元素甚至都不是相同的变量类型(第三个甚至不是单个元素,因此它不能是 Mat 中的元素)。但是,例如,您可以将整数或浮点数的向量直接转换为 Mat。在答案here中查看更多信息。

【讨论】:

【参考方案2】:
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

class Descriptor 
public:
  float xi;
  float yi;
  vector< double > fv;
  Descriptor(float x, float y, vector<double> const& f) :
    xi(x), yi(y), fv(f)
;

int main(int argc, char** argv) 
  vector<Descriptor> m_keyDescs;
  for (int i = 0; i < 10; i++) 
    vector<double> f(10, 23);
    m_keyDescs.push_back(Descriptor(i+3, i+5, f));
  
  Mat_<Descriptor> mymat(1, m_keyDescs.size(), &m_keyDescs[0], sizeof(Descriptor));
  for (int i = 0; i < 10; i++) 
    Descriptor d = mymat(0, i);
    cout << "xi:" << d.xi << ", yi:" << d.yi << ", fv:[";
    for (int j = 0; j < d.fv.size(); j++)
      cout << d.fv[j] << ", ";
    cout << "]" << endl;
  

【讨论】:

以上是关于如何将矢量<...> 转换为 cv::Mat?的主要内容,如果未能解决你的问题,请参考以下文章

将vector<Mat>转换为矢量文件Opencv

如何将 <class 'streamlit.uploaded_file_manager.UploadedFile'> 类型的文件转换为 Ptr<cv::UMat>?

将“Emgu.CV.Image<Emgu.CV.Structure.Bgr,byte>”转换为“System.Drawing.Image”

犰狳:将立方体子视图(管)转换为矢量

使用 OpenCV 将光栅图像转换为矢量图形?

将 cv::Mat 转换为 vector<int>