本次任务目标
理解预图像处理流程并完成预处理过程。
一、智能车图像处理环境介绍
智能车大多数组别使用C语言进行编程,而我们在本机处理图像时会用到OpenCV库,该库支持C++和Python,为保证兼容性,我们在编写图像处理部分代码时使用的是C++和OpenCV。
如果没有接触过C++语言和OpenCV也不用担心,对于C++语言我们只会用到C++的基础逻辑部分,这部分和C语言是一致的,因此不会涉及C++的特有特性,大家可以按照C语言的编程习惯进行代码编写;对于OpenCV,这里只作为显示图像的工具使用,整个图像处理流程不会涉及OpenCV。
二、示例代码框架下载
在群里下载,或者点击此链接:代码
三、环境安装
1、安装C++环境。
这里推荐几个C++编辑器:
(1) Visual Studio:
优点是易于配置,但缺点是占用空间较大。
配置方法参考:https://blog.csdn.net/m0_68719263/article/details/123883962
(2) VSCode+MinGW:
占用较小、插件丰富的代码编辑器,缺点是环境较难配置
配置方法请自行在网上寻找
2、安装OpenCV环境
使用Visual Studio参考:
https://blog.csdn.net/m0_47917394/article/details/122349918
https://blog.csdn.net/mars_xiaolei/article/details/78759041
使用VSCode或其他编辑器的同学请自行寻找方法
3、关于文件编码
如果打开文件没有出现乱码,所有中文字符都能正常显示,可以跳过此节。
为了移植方便,建议使用GB2312编码,上面给的代码也是GB2312格式。
如果使用的是Visual Studio那么默认应该就是GB2312,不需要做额外的更改。
如果使用的是VSCode或其他编辑器,请确保编辑器的文件编码是GB2312。
如果一打开文件发现中文是乱码状态,切记不要保存文件,这会破坏中文字符,修改为GB2312即可正常编辑。
三、图像格式简介
总钻风拍摄的图像为188*120的灰度图像,每个像素点的取值范围为0-255,越靠近0像素点越黑,越靠近255像素点越白。示例图像如下:
使用OpenCV读取灰度图像,图像会被处理成一个二维数组:image[IMAGE_H][IMAGE_W];
对于总钻风拍摄的原始图像,这个数组则为image[120][188];
图像共有120行,188列,在自己定义和使用函数或数组时一定要注意行和列的关系!!!
一张图像的最左上角像素点为
;image[0][0]
最右上角像素点为
;image[0][IMAGE_W-1]
最左下角像素点为
;image[IMAGE_H-1][0]
最右下角像素点为image[IMAGE_H-1][IMAGE_W-1]
图像索引示例如表
图像索引示例 | |||||
---|---|---|---|---|---|
image[0][0] | ... | ... | ... | ... | image[0][IMAGE_W-1] |
... | ... | ... | ... | ... | ... |
... | ... | ... | ... | ... | ... |
... | ... | ... | ... | ... | ... |
... | ... | ... | ... | ... | ... |
image[IMAGE_H-1][0] | ... | ... | ... | ... | image[IMAGE_H-1][IMAGE_W-1] |
四、图像的预处理
在正式处理图像前,我们需要对图像进行预处理,这里贴一张预处理完后的图像:
预处理完的图像对应程序中的bin_image[image_h][image_w];
预处理过程会将图像进行压缩,压缩后的图像大小为94*60,对应的二维数组为bin_image[60][94];
我们后面的操作都是以这张预处理后的图像为基础的,原图像从这里就不再使用了。
常用的预处理流程如下:
1、使用大津法对图像进行二值化:turn_to_bin();
turn_to_bin();
大津法在此不过多进行介绍,有兴趣可以去网络了解其原理,代码中已经集成了一个使用大津法进行计算的函数:otsuThreshold();
该函数已经在
函数中被调用。turn_to_bin();
图像二值化后,图像将只有黑(0)和白(255)两种颜色,易于我们进行处理。
2、压缩图像:image_compress();
image_compress();
压缩图像可以减轻芯片计算图像的压力。压缩后的图像大小为94*60
该函数接收两个参数,第一个是原图像,第二个是记录压缩后图像的数组。
对于我们提供的代码,可以通过
来调用此函数image_compress(image, bin_image);
我们在预处理后实际处理的图像数组为二值化和压缩过的bin_image[image_h][image_w];
3、图像滤波:image_filter();
image_filter();
图像滤波可以去除图像中的噪点,减轻噪点对我们处理图像的干扰。
五、一些辅助函数的使用说明
1、printToCSV();
printToCSV();
该函数可以将图片打印至一个csv文件中。使用office软件打开即可查看当前图像各像素点的值。
以下是生成的csv文件的示例:
为了更方便的阅读文件,建议按需对文件进行如下的处理:
(1) Ctrl+A全选所有单元格。
(2) 找到行和列,并打开
(3) 点击列宽,将列宽改为2
(4) Ctrl+H调出替换对话框,将0全部替换为黑色
查找内容填0
然后点击选项,点击“替换为”右边的“格式”,选择设置格式
然后选择图案,选择黑色,点击确认,最后全部替换即可。效果如图:
2、draw_point();
draw_point();
该函数可以改变某一点的颜色
函数有4个参数draw_point(col, row, GREEN, Binimage_color);
我们的图像格式为bin_image[image_h][image_w];
第一个参数是像素点的x轴的值
第二个参数是像素点的y轴的值
第三个参数为要改为的颜色,可供修改的颜色见 image_process.h 文件中的宏定义
第四个参数为要修改的图像,保持默认即可
提示:该函数配合for循环可以画出一条完整的线
注意:一般画线的操作是在整个图像处理过程结束后才进行的,该函数的调用位置已经在代码中使用说明文字(说明文字的样式见下一段文字)框起来了。
六、其他注意事项
// 说明文字-----------------------------------------
Your Code ...
// ------------------------------------------------
代码中有使用类似以上的代码段请仔细阅读,其中都是图像处理时可能用到的函数。
七、上手操作
如果已经配置好运行环境,直接以图片模式运行程序(PVFLAG=0),你会得到两个图像:
Original和Binimage_color
其中Original是原图像,Binimage_color是处理后的图像,此时处理后的图像应该是黑色的。
1、请编辑
对图像进行预处理,预处理后Binimage_color应该会正确显示处理后的二值化图像:image_process();