是这样的,有个同学有个图像用AD-Census算完视差,想借助视差图生成点云,找到的函数是reprojectImageTo3D。
我测试的时候图方便,将视差图直接用cv::imwrite保存成图片,用这个图片生成点云。免得每次都算一遍视差花好多时间(保存成的视差图片格式是CV_8U)
用opencv的reprojectImageTo3D函数用来生成点云文件,但是点云一直有问题。
问了gpt发现
给出的2个解决方法:
第一个
//disparity为CV_8U的视差图//CV_8U类型转换为CV_16S类型。然后,我们使用reprojectImageTo3D函数将disparity_16s转换为三维点云xyzcv::Mat disparity_16s;cv::Mat depth, xyz;// 将CV_8U格式的视差图像转换为CV_16S类型disparity.convertTo(disparity_16s, CV_16S);// 使用reprojectImageTo3D函数生成三维点云cv::reprojectImageTo3D(disparity_16s, xyz, Q, true);
第二个
//disparity为CV_8U的视差图//CV_8U类型转换为CV_32F类型。然后,我们使用reprojectImageTo3D函数将disparity_f转换为三维点云xyzcv::Mat disparity_16s, disparity_f;
cv::Mat depth, xyz;// 将CV_8U类型的视差图像转换为CV_16S类型
disparity.convertTo(disparity_16s, CV_16S);// 将CV_16S类型的视差图像转换为浮点型视差图像
disparity_16s.convertTo(disparity_f, CV_32F, 1.0 / 16.0);// 使用reprojectImageTo3D函数生成三维点云
cv::reprojectImageTo3D(disparity_f, xyz, Q, true);// 将三维点云转换为深度图像
cv::extractChannel(xyz, depth, 2);
对于disparity_16s.convertTo(disparity_f, CV_32F, 1.0 / 16.0);中
参数1.0 / 16.0,chatgpt是这样解释的:
应该可以理解为根据实际的点云计算情况,从点云的结果对这个比例因子调参吧哈哈