c++ - 将 vector<cv::Point3f> 转换为 CV_32FC3 类型的 cv::Mat

标签 c++ opencv vector type-conversion realsense

我正在尝试将 vector 转换为 cv::Mat,其中它是一个具有 3 个 channel 的二维矩阵 (640*480),二维矩阵中的每个元素都是 CV_32FC3 类型(三个 channel 分别指代 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;

另外,当我使用其他方法进行 reshape 时:

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

最佳答案

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

希望能解决问题。

关于c++ - 将 vector<cv::Point3f> 转换为 CV_32FC3 类型的 cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44193340/

相关文章:

java - OpenCV Java 微笑检测

python - 在 Python 中显示具有较少关键点的 Brisk 关键点

c++ - 检查字符串是否作为 vector 中的元素存在

c++ - 多维 vector 和指向 vector 的指针

c++ - 将 STDOUT 重定向到文件时缺少输出

c++ - 使用 QtConcurrent 使用 QImageReader 读取图像文件

c++ - D3D11_BUFFER_SRV - 如何使用它?

c++ - 如何通过将类的对象和成员函数传递给 C++ 中的另一个函数来调用类?

c++ - 堆已损坏 opencv

c++ - 为什么在遍历此 vector 时会出现段错误?