我需要将这些数组值直接初始化为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
对象吗?
答案 0 :(得分:11)
如果要对这些值进行硬编码,请尝试进行内联初始化。
// 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
如果你想使用(可能是动态的)数组作为输入,那么使用数据数组作为源,如其他人的答案所示。
答案 1 :(得分:7)
我的问题并不完全清楚,但我假设您正在尝试将float array
加载到一行中的OpenCV Mat
对象中。首先,请务必查看有关在Mat
中构建C++
的文档。由于你有一维数组(我猜)你知道rows
和columns
你想要给Mat
,你应该使用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, 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, 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!
答案 2 :(得分:0)
接下来,你可以这样做:
cv::Mat newMat(i,j,CV_32F,data);