将vector <cv :: point3f>转换为CV_32FC3类型的cv :: Mat

时间:2017-05-26 03:57:50

标签: c++ opencv vector type-conversion realsense

我正在尝试将矢量转换为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);最终会出现访问冲突异常 enter image description here

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

它还提供指向以下行的访问冲突: enter image description here

2 个答案:

答案 0 :(得分:3)

我认为你错误地填写了矩阵。不应该需要调整大小。如果查看DepthCamera.cpp中的方法removeNoise(),则使用以下约定分配(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];

希望能解决问题。

答案 1 :(得分:0)

以下对我有用,但颜色太奇怪了:

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

注意true标志。