实现效果

获得的某个地图.jpg如图所示,最后实现效果在MATLAB中绘制出栅格地图
在这里插入图片描述

利用PC的绘图工具预处理图像

例如:获得的图片test.jpg在绘图软件显示像素大小为412162,导入到MATLAB的栅格个数也为412162不大合理,因此在绘图软件重新调整图片大小,使得一个像素对应一个栅格点,这里按照比例缩放成大小为40*15个栅格矩阵。

在这里插入图片描述

利用OpenCV识别图像得出障碍点信息

OpenCV识别障碍物信息的程序步骤:

1、读图
2、将图片装换成二值图
3、获取像素点信息(这里获取的是索引值)
4、将数据存入.txt文件用于MATLAB读取

OpenCV读图的具体程序,值得注意的是,测试图片本身就两种颜色,黑和白,如果需要识别其他信息,利用OpenCV的阈值处理,来化成你所需要的的二值图。

import cv2    

# 读取图片
img = cv2.imread('test.jpg') 

# 将图片进行二值化处理
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,img_bin = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)

# 查看处理的图像是否符合要求
cv2.imshow("img_bin", img_bin) 
cv2.waitKey(0)
cv2.destroyAllWindows()

'''
对图像进行像素点捕捉,其中0表示黑,255表示白
row和col表示图像的行列,像素[row,col]对应其所处位置的像素点的值
image_line 存放线性值图片,1表示障碍物,0表示自由区
image_index存放图片像素点的索引值,参考MATLAB的ind2sub函数解释
'''

# 获取图片像素行列高度
row,col = img_bin.shape

# 定义数据类型
image_line = []
index = 0
image_index = []


# 循环判断像素点信息
for c in range(col):
    for r in range(row):
        index = index + 1
        if img_bin[r,c] == 0:
            image_line.append(1)
            image_index.append(index)
        else:
            image_line.append(0)
    image_line.append('^p')

# 写入地图数据到txt文件
file = open('data_map.txt','w') 
file.write(str(image_line)); 
file.close()

# 写入索引数据到txt文件
file = open('data_index.txt','w') 
file.write(str(image_index)); 
file.close()

图像像素row和col的解释

图片在OpenCV里各个像素对应的点关系为:
在这里插入图片描述


查看图像数据

打开data_map.txt复制到Word中,在替换功能里,将’^p’替换成 ^p实现换行,复制数据到txt文查看效果更佳;
将data_index.txt数据的开头 [ 和末尾 ] 符号删除
data_map数据的效果:

在这里插入图片描述

将index数据导入MATLAB绘制栅格

将去了开头 [ 和末尾 ] 的data_index数据导入MATLAB

在这里插入图片描述

按照下面程序读取index数据进行路径规划,路径规划参考链接: 5 MATLAB与栅格路径规划算法(1 栅格化图像和dijkstra算法).

clc;
clear;
data = load('data.txt');

XRows = 40; YCols = 15;
StartCoord = [3,6];
GoalCoord = [35,2];

[obsx,obsy] = ind2sub([YCols,XRows],data);
ObsCoord = [obsy' obsx'];

[Opt,Field] = Dijkstra_main(XRows,YCols,StartCoord,GoalCoord,ObsCoord);

实现路径规划效果:
在这里插入图片描述

本章小结

1、栅格地图在MATLAB的复现程度取决于像素点,所以可以不在绘图软件中修改图片尺寸,OpenCV获取到row和col按照等分关系也可以复现地图
2、图片地图和MATLAB的地图存在反转关系,可以考虑利用绘图软件先将图片竖直反转再去读图