将值初始化到 OpenCV 中的 Mat 对象中

问题描述 投票:0回答:3

我需要将这些数组值直接初始化为

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
3个回答
30
投票

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

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

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


28
投票

你的问题对我来说并不完全清楚,但我假设你正在尝试将

float array
加载到单行中的 OpenCV
Mat
对象中。首先,一定要检查
Mat
中构造
C++
的文档。由于您有一个一维数组并且(我假设)您知道您想要提供的
rows
columns
,因此您应该使用
this 构造函数
: 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
rows
参数来实现:
cols

它将输出:

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]

对象拆分为两行 5 列,而不是 1 行 10 列。

如果是 Java:

如果您想在 Java 中执行此操作,那么您已经走在正确的道路上了。但是,您可能忘记指定行、列和通道/深度。像以前一样根据适合您数据的内容更改行、列和 CvType。您可以执行以下操作: Mat

请务必查看 
Mat 上的 Java 文档


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.