三维栅格地图构建之二:视差图及点云图

本文介绍了三维栅格地图构建的过程,重点讨论了基于双目视觉的视差图生成和点云图制作。通过实验对比了不同匹配方法,包括基于兴趣点和不基于兴趣点的策略,并分享了OpenCV的cvFindStereoCorrespondenceBM函数在生成稠密点云图中的应用。最终,展示了如何通过摄像头参数和匹配结果生成三维点云图。
摘要由CSDN通过智能技术生成

在上一步骤——双目校正的基础上可以很方便的获取视差图。视差即空间中同一点在左右目图像上的水平位置差。

自己凭感觉(不知道对错的)总结了一下,主要分为两大类:基于兴趣点的,不基于兴趣点的。

基于兴趣点的:需要先找到一幅图像中的特征点(也可以是两幅图像中的特征点,基于SIFT特征的匹配即是这种情况,不过对于特征并不唯一的特征点提取方法还是只找一幅图像中的特征点为好),再在另一幅图像中的同一及线上的一定范围内搜索,搜索相似的方法有很多,如:相关度,SAD,SSD等等。

不基于兴趣点的:假定一幅图像中的每一像素点都是兴趣点,再在另一幅图片中找对应像素点。

我的实验

前期:利用H.P Moravec的论文《Robot Spatial Perception by Stereoscopic Vision and 3D Evidence Grids》中的方法。一看就懂的,其中的Moravec兴趣算子是相当相当的古老了,只要把它稍改改就是harris算子。其实Moravec给出的代码中的Moravec算子实现很像Harris。以下是根据自己感觉上的理解编写的Moravec算子MATLAB代码。

function [out top]=HIns(img,rows,cols)


%[rows cols]=size(img);
Vp=zeros(rows,cols);
thosd1=100;
thosd2=800;  %高通滤波门限,可调
sqsize=7;  
%%%%%%%%%%%%%%%%%%% Moravec算子框移动过程
for i=fix(sqsize/2)+1:sqsize:rows-fi
将occupancyGrid栅格地图转换为cv::Mat图片的步骤如下: 1. 获取栅格地图信息,包括地图的宽度、高度和分辨率等信息。 2. 创建一个空的cv::Mat图片,大小为栅格地图的宽度和高度。 3. 遍历栅格地图中的每个栅格,将其转换为像素点,并在cv::Mat图片中填充相应的像素值。这里可以使用不同的颜色表示不同的栅格状态,比如黑色表示障碍物,白色表示自由空间。 4. 最后将cv::Mat图片保存为图片文件或显示在屏幕上。 下面是一个示例代码,可以将ROS中的occupancyGrid栅格地图转换为cv::Mat图片: ```cpp #include <ros/ros.h> #include <nav_msgs/OccupancyGrid.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> void occupancyGridToMat(const nav_msgs::OccupancyGrid& occupancy_grid, cv::Mat& image) { int width = occupancy_grid.info.width; int height = occupancy_grid.info.height; double resolution = occupancy_grid.info.resolution; double origin_x = occupancy_grid.info.origin.position.x; double origin_y = occupancy_grid.info.origin.position.y; image.create(height, width, CV_8UC1); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int index = x + y * width; int value = occupancy_grid.data[index]; if (value == 100) { image.at<uchar>(y, x) = 0; // black represents obstacles } else if (value == 0) { image.at<uchar>(y, x) = 255; // white represents free space } else { image.at<uchar>(y, x) = 127; // gray represents unknown space } } } } int main(int argc, char** argv) { ros::init(argc, argv, "occupancy_grid_to_mat"); ros::NodeHandle nh; // subscribe to the occupancy grid topic nav_msgs::OccupancyGrid::ConstPtr occupancy_grid_ptr; occupancy_grid_ptr = ros::topic::waitForMessage<nav_msgs::OccupancyGrid>("map", nh); // convert occupancy grid to cv::Mat image cv::Mat image; occupancyGridToMat(*occupancy_grid_ptr, image); // display the image cv::imshow("Occupancy Grid", image); cv::waitKey(0); return 0; } ``` 在这个示例中,我们订阅ROS中的地图话题,并将其转换为cv::Mat图片。然后,我们将图片显示在屏幕上。你可以将代码中的显示部分替换为保存图片到文件的代码。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值