Следующий фрагмент кода не работает. Здесь есть похожий вопрос Как заполнить Матрицу нулями в 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;
Вы можете попробовать что-то вроде этого:
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);
}
Надеюсь, это поможет!
В коде, который вы разместили, вы не инициализировали коврик любого размера или типа. Однако существует очень простой способ инициализации матрицы нулями.
cv::Mat colorHist = cv::Mat::zeros(1, histSize, CV_32F);
Это создаст вектор строки (1-мерный) с histSize
колонны, CV_32F
просто относится к типу данных, с которыми имеет дело матрица (float
в этом случае).
Если вы хотите работать с векторами столбцов, просто поменяйте местами размеры:
cv::Mat colorHist = cv::Mat::zeros(histSize, 1, CV_32F);
for(int i = 0; i < histSize; i++)
float c = colorHist.at<float>(i);