【问题标题】:converting vector<cv::Point3f> to cv::Mat of type CV_32FC3将 vector<cv::Point3f> 转换为 CV_32FC3 类型的 cv::Mat
【发布时间】:2017-10-26 20:40:42
【问题描述】:

我正在尝试将向量转换为 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);

它还给出了指向以下行的访问冲突:

【问题讨论】:

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


    【解决方案1】:

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

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

    注意true 标志。

    【讨论】:

    • 颜色很奇怪通常意味着通道顺序错误。你的向量中的顺序是什么? RGBRGBRGB..? OpenCV 使用 BGR 排序,因此之后您可能需要cvtColor(xyzMap, xyzMap, CV_RGB2BGR);。请上传示例图片以获取更多建议。
    【解决方案2】:

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

    希望能解决问题。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2017-07-23
      • 2013-09-02
      相关资源
      最近更新 更多