将向量 <cv::Point3f> 转换为 CV_32FC3 类型的 cv::Mat
converting vector<cv::Point3f> to cv::Mat of type CV_32FC3
我正在尝试将向量转换为 cv::Mat,其中它是一个具有 3 个通道的二维矩阵 (640*480),二维矩阵中的每个元素都是 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);
它还给出了指向以下行的访问冲突:
以下对我有用,但颜色太奇怪了:
xyzMap = cv::Mat(xyzBuffer, true).reshape(3, 480);
注意 true
标志。
我认为您填错了矩阵。应该不需要调整大小。如果您查看 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];
希望能解决问题。
我正在尝试将向量转换为 cv::Mat,其中它是一个具有 3 个通道的二维矩阵 (640*480),二维矩阵中的每个元素都是 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);
它还给出了指向以下行的访问冲突:
以下对我有用,但颜色太奇怪了:
xyzMap = cv::Mat(xyzBuffer, true).reshape(3, 480);
注意 true
标志。
我认为您填错了矩阵。应该不需要调整大小。如果您查看 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];
希望能解决问题。