智能车图像处理入门 1

本次任务目标

理解预图像处理流程并完成预处理过程。

一、智能车图像处理环境介绍

智能车大多数组别使用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();

大津法在此不过多进行介绍,有兴趣可以去网络了解其原理,代码中已经集成了一个使用大津法进行计算的函数:otsuThreshold();
该函数已经在 turn_to_bin();函数中被调用。

图像二值化后,图像将只有黑(0)和白(255)两种颜色,易于我们进行处理。

2、压缩图像:image_compress();

压缩图像可以减轻芯片计算图像的压力。压缩后的图像大小为94*60
该函数接收两个参数,第一个是原图像,第二个是记录压缩后图像的数组。
对于我们提供的代码,可以通过image_compress(image, bin_image);来调用此函数

我们在预处理后实际处理的图像数组为二值化和压缩过的bin_image[image_h][image_w];

3、图像滤波:image_filter();

图像滤波可以去除图像中的噪点,减轻噪点对我们处理图像的干扰。

五、一些辅助函数的使用说明

1、printToCSV();

该函数可以将图片打印至一个csv文件中。使用office软件打开即可查看当前图像各像素点的值。
以下是生成的csv文件的示例:

为了更方便的阅读文件,建议按需对文件进行如下的处理:

(1) Ctrl+A全选所有单元格。
(2) 找到行和列,并打开

(3) 点击列宽,将列宽改为2

(4) Ctrl+H调出替换对话框,将0全部替换为黑色

查找内容填0
然后点击选项,点击“替换为”右边的“格式”,选择设置格式

然后选择图案,选择黑色,点击确认,最后全部替换即可。效果如图:

2、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、请编辑image_process();对图像进行预处理,预处理后Binimage_color应该会正确显示处理后的二值化图像:

2、尝试使用draw_point();在图片中央画一条线,效果如图:

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇