вектор преобразования & lt; cv :: Point3f & gt; в cv :: Mat типа CV_32FC3

Я пытаюсь преобразовать вектор в cv :: Mat, в котором это является 2D-матрицей (640 * 480) с 3 каналами, каждый элемент в 2D-матрице имеет тип CV_32FC3 (три канала, каждый из которых ссылается на x, y и z соответственно ).

n_rows = 480 and n_cols=640

Я не уверен почему xyzMap = cv::Mat(xyzBuffer).reshape(3, 480); заканчивается исключением нарушения прав доступа
введите описание изображения здесь

vector<cv::Point3f> xyzBuffer;

также, когда я использую другой метод для изменения формы:

cv::Mat xyzBuffMat = cv::Mat(xyzBuffer.size(), 1, CV_32FC3);
for (int i = 0; i < xyzBuffer.size(); i++) {
xyzBuffMat.at<float>(i, 0, 0) = xyzBuffer[i].x;
xyzBuffMat.at<float>(i, 0, 1) = xyzBuffer[i].y;
xyzBuffMat.at<float>(i, 0, 2) = xyzBuffer[i].z;
}

xyzMap = xyzBuffMat.reshape(3, 480);

это также дает нарушение доступа, указывая на следующую строку:
введите описание изображения здесь

0

Решение

Я думаю, что вы заполняете матрицу неправильно. Не должно быть необходимости изменять размер. Если вы посмотрите на метод removeNoise () в DepthCamera.cpp, значения координат (x, y, z) назначаются с использованием следующего соглашения:

xyzMap.at<cv::Vec3f>(y, x)[0] = [x value];
xyzMap.at<cv::Vec3f>(y, x)[1] = [y value];
xyzMap.at<cv::Vec3f>(y, x)[2] = [z value];

Надеюсь, что это решит проблему.

3

Другие решения

Следующее работает для меня, но цвета такие странные:

xyzMap = cv::Mat(xyzBuffer, true).reshape(3, 480);

Обратите внимание на true флаг.

0

По вопросам рекламы [email protected]