【问题标题】:Initialize the values into Mat object in OpenCV在 OpenCV 中将值初始化为 Mat 对象
【发布时间】:2017-08-28 01:11:18
【问题描述】:

我需要将这些数组值直接初始化为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}

能否向我解释如何初始化我直接插入数组数据的new Mat 对象?

【问题讨论】:

  • 哪种编程语言?

标签: java opencv mat


【解决方案1】:

您的问题对我来说并不完全清楚,但我假设您正在尝试将 float array 加载到单行中的 OpenCV Mat 对象中。首先,一定要查看C++ 中关于构造Mat 的文档。由于您有一个一维数组,并且(我假设)您知道要提供 Matrowscolumns,因此您应该使用 this constructor

cv::Mat::Mat (int rows, int cols, int type, void * data, size_t step = AUTO_STEP)   

这是一个代码示例:

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

cout << your_matrix.at<float>(0,2) << endl;
cout << your_matrix << endl;

它会输出:

3
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

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

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

cout << your_matrix.at<float>(1,2) << endl;
cout << your_matrix << endl;

它会输出:

8
[1, 2, 3, 4, 5; 
6, 7, 8, 9, 10]

您现在已将 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);

请务必检查Java documentation on Mat

【讨论】:

  • 对不起先生误导你我在java中需要它我看到了这个方法但我无法在java中做到这一点构造函数没有将数据作为java中的参数
  • OK 没问题,它非常相似(至少逻辑是这样)。我添加了一些额外的代码以使您更清楚,希望对您有所帮助!
  • 谢谢先生是的,我忘记添加频道/深度 Cvtype.CV_32F 工作完美谢谢先生
  • 先生,我有另一个问题,我正在努力在 opencv java 中执行 glcm 搜索了很多没有参考,我得到了 c++ 中的 sn-ps,您可以请先生看一下我的问题链接: stackoverflow.com/questions/43172339/opencv-glcm-c-to-java
【解决方案2】:

如果您想硬编码这些值,请尝试内联初始化。:

    // 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;

偷来的

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

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

【讨论】:

  • 可以使用Mat1d 代替Mat_&lt;double&gt;。另外,不要忘记 Mat_ 表达式周围的括号将其转换为 Mat,否则它总是会产生错误。
【解决方案3】:

接下来,你可以这样做:

cv::Mat newMat(i,j,CV_32F,data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2019-08-28
    • 2023-04-01
    相关资源
    最近更新 更多