习惯性使用c++,所以在制作JPG数的时候采用的**c++**写的,代码如下:
void moCreateImg()
{cv::Mat test_map(800,800,CV_8UC3,cv::Scalar(0,0,0));Rect rec = cv::Rect(cv::Point(200,200),cv::Point(600,600));vector contour;contour.push_back(rec.tl()); // 左上角坐标信息contour.push_back(Point(rec.tl().x + rec.width , rec.tl().y ) ); // 右上角contour.push_back(Point(rec.tl().x + rec.width , rec.tl().y + rec.height)); // 左下角contour.push_back(Point(rec.tl().x , rec.tl().y + rec.height )); // 右下角// 多边形填充cv::fillConvexPoly(test_map, contour, cv::Scalar(255,255,255));//fillPoly函数的第二个参数是二维数组!!// 显示cv::namedWindow("test_map", cv::WINDOW_AUTOSIZE);cv::imshow("test_map", test_map);// 保存imwrite("./reuslt.jpg",test_map);waitKey(0);}
生成的结果如下:
生成jpg文件以后,先检查全覆盖路径规划中使用的数据是什么格式的,通过NotePad++软件打开以后发现是P5格式的:
普及一下pgm格式,PGM文件的格式类型有P2和P5,但是我在转换的过程中发现还有P6,P2是纯文本格式,P5是二进制格式,从下图可知我需要的是P5二进制格式的pgm数据。
一开始采用C++实现,代码繁琐,后来直接用python进行转换,顿时感觉python太强了。
# coding=utf-8
from PIL import Image
import os.path
import glob# python 函数
def jpg2pgm( jpg_file , pgm_dir ):# 首先打开jpg文件jpg = Image.open( jpg_file )out_name =(str)(os.path.join( pgm_dir , os.path.splitext( os.path.basename(jpg_file) )[0] ))+".pgm"# 创建目标pgm 文件jpg.convert('L').save(out_name)print("Save succeed!!!")# 将所有的jpg文件放在当前工作目录,或者 cd {存放jpg文件的目录}
for jpg_file in glob.glob("/home/ai/work/workspace/robot/path_planning/*.jpg"):jpg2pgm( jpg_file , "/home/ai/work/workspace/robot/path_planning/")
注意:
其中比较重要的是jpg.convert(‘L’),如果没有这一句命令,转换出来的是P6格式的pgm数据,因为我生成的jpg是三通道的,从上面的代码中可以看到。
结果如下:
科普:
jpg = jpg.convert() 是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式
PIL有九种不同模式:
1: 1位像素,黑白,每字节一个像素存储
L: 8位像素,黑白
P: 8位像素,使用调色板映射到任何其他模式
RGB: 3x8位像素,真彩色
RGBA: 4x8位像素,带透明度掩模的真彩色
CMYK: 4x8位像素,分色
YCbCr: 3x8位像素,彩色视频格式
I: 32位有符号整数像素
F: 32位浮点像素
=================================== 附加==================================
全覆盖路径使用该数据集结果:
仿真机器人运行结果: