如何在OpenCV中创建一维垫并将所有条目初始化为零?

时间:2015-04-13 19:25:02

标签: c++ opencv matrix initialization opencv-mat

以下代码似乎不起作用。这里有一个类似的问题How to fill Matrix with zeros in OpenCV?但是,我想要一个1-D垫子,而不是这个链接中提到的2-D垫子。

int histSize = 8;
Mat colorHist;

for (int i = 0; i < (histSize * histSize * histSize); i++)
    colorHist.at<float>(i) = 0.0;

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

1 - 首先创建一个浮点数组,它是您的1-D数据结构:

float arr[10] = {0}; // initialize it to all 0`s

2 - 现在按如下方式创建opencv矩阵并将数组填入其中:

cv::Mat colorHist = cv::Mat(2, 4, CV_32F, arr);

3 - 如果您想访问单个条目,请使用以下内容:

for(int i=0; i<10; i++) {
    colorHist.at<float>(0,i);
}

其中i是您想要的条目的索引from 0 to 9

或只是:

colorHist.at<float>(0,2);

如果您需要个别。这里我们得到索引为2的条目,当然它将返回0,因为矩阵在那时全部为零。

编辑:正如尼古拉斯建议的那样:

cv::Mat colorHist = cv::Mat::zeros(1, 10, CV_32F); // size=10
如果你不想处理一个浮点数组,那么

是创建一个全零的一维行矩阵的简短方法(积分转到尼古拉斯)。和访问当然是:

for(int i=0; i<10; i++) {
    colorHist.at<float>(i);
}

希望有所帮助!

答案 1 :(得分:2)

在您发布的代码中,您尚未将Mat初始化为任何大小或类型。但是,有一种使用零初始化矩阵的简单方法。

将Matrix值初始化为0:

cv::Mat colorHist = cv::Mat::zeros(1, histSize, CV_32F);

这将产生一个带有histSize列的行向量(1维),CV_32F只是指矩阵正在处理的数据类型(在这种情况下为float)。 / p>

如果您希望使用列向量,只需交换尺寸:

cv::Mat colorHist = cv::Mat::zeros(histSize, 1, CV_32F);

访问元素:

for(int i = 0; i < histSize; i++)
    float c = colorHist.at<float>(i);