在 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}

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

原文由 AciD IoN 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 839
2 个回答

你的问题对我来说并不完全清楚,但我假设你正在尝试将 float array 加载到 OpenCV Mat 对象中。首先,一定要查看关于在 --- 中构建 Mat C++ 文档。因为你有一个一维数组并且(我假设)你知道 rowscolumns 你想给你的 Mat 构造函数,:你应该使用–

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

一定要检查 Mat 上的 Java 文档

原文由 Jurjen 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

原文由 Micka 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题