我正在尝试将 vector 转换为cv::Mat,其中它是一个具有3个通道的2D矩阵(640 * 480),2D矩阵中的每个元素的类型均为CV_32FC3(三个通道分别代表x,y和z )。

n_rows = 480 and n_cols=640

我不确定xyzMap = cv::Mat(xyzBuffer).reshape(3, 480);为什么会出现访问冲突异常
c++ - 将vector <cv::Point3f>转换为CV_32FC3类型的cv::Mat-LMLPHP
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);

它还提供了指向以下行的访问冲突:
c&#43;&#43; - 将vector &lt;cv::Point3f&gt;转换为CV_32FC3类型的cv::Mat-LMLPHP

最佳答案

我认为您填写的矩阵不正确。不需要调整大小。如果您查看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];

希望能解决问题。

10-08 08:32