在OpenCV中将值初始化为Mat对象

Aci*_*IoN 3 opencv mat

我需要将这些数组值直接初始化为Mat对象.我尝试使用,obj.put(i,j,data)但这不起作用,Mat对象仍然是空的.我在java中需要这个

data [] = {103547.0, 2.0959531E7, 5.152769223E9, 1.415924406121E12, 2.0842905E7, 
           4.195143491E9, 1.025510364741E12, 5.000561607E9, 9.99289545049E11, 
           1.332451366923E12}
Run Code Online (Sandbox Code Playgroud)

可以向我解释一下如何初始化一个new Mat直接插入数组数据的对象?

Mic*_*cka 15

如果要对这些值进行硬编码,请尝试内联初始化:

    // For small matrices you may use comma separated initializers:

    Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    cout << "C = " << endl << " " << C << endl << endl;
Run Code Online (Sandbox Code Playgroud)

从...偷来的

http://opencvexamples.blogspot.de/2013/09/creating-matrix-in-different-ways.html?m=1

如果要使用(可能是动态的)数组作为输入,请将数据数组用作源,如其他人的答案中所示.

  • 可以使用“Mat1d”代替“Mat_&lt;double&gt;”。另外,不要忘记“Mat_”表达式周围的括号将其转换为“Mat”,否则它总是会产生错误。 (2认同)

Jur*_*jen 8

你的问题对我来说并不完全清楚,但我会假设你试图在一行中加载float array一个OpenCV Mat对象.首先,请务必查看有关构建Matin 的文档C++.既然你有一维数组并且(我假设)你知道rows并且columns你想要给你Mat,你应该使用这个构造函数:

cv::Mat::Mat (int rows, int cols, int type, void * data, size_t step = AUTO_STEP)   
Run Code Online (Sandbox Code Playgroud)

这是一个代码示例:

float data[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
cv::Mat your_matrix = cv::Mat(1, 10, CV_32F, data);

cout << your_matrix.at<float>(0,2) << endl;
cout << your_matrix << endl;
Run Code Online (Sandbox Code Playgroud)

它将输出:

3
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

当然,您可以根据需要更改数据类型(例如,使用int而不是float).您可以忽略该AUTO_STEP参数,但如果要使用它,请务必查看有关用法的文档.此外,如果要更改结构Mat(例如,将数组拆分为多行),可以通过更改构造函数中的rowscols参数来实现:

float data[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
cv::Mat your_matrix = cv::Mat(2, 5, CV_32F, data);

cout << your_matrix.at<float>(1,2) << endl;
cout << your_matrix << endl;
Run Code Online (Sandbox Code Playgroud)

它将输出:

8
[1, 2, 3, 4, 5; 
6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

您现在已将Mat对象拆分为两行5列,而不是1行10列.

对于Java: 如果您想在Java中执行此操作,那么您已经走上正轨.但是,您可能忘记指定行,列和通道/深度.根据您之前的数据更改行,列和CvType.您可以执行以下操作:

float data[] = new float[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Mat mat = new Mat(1, 10, CvType.CV_32F);
mat.put(0, 0, data);
Run Code Online (Sandbox Code Playgroud)

一定要检查Mat上Java文档!