视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
图像处理过程
2025-09-25 14:08:46 责编:小OO
文档
图像处理过程

图像处理作为小车走迷宫过程中获得信息的第一过程,对于小车的计算路径和确认位置起到了根本的作用,经过了对于OPENCV和LABVIEW两种软件的了解,我们发现虽然OPENCV在图像处理方面确实十分强大,但是其扩展性与易用性均不如LABVIEW来的好,我们权衡利弊,决定使用LABVIEW进行对于图像的处理。

LABVIEW以其强大的虚拟仪器库著称,我们在本次小车图像处理中用到了以下的组件:

1. NI.Labview 8.2

2. NI.Vision.v8.5.Acquisition.Software

3. NI.Vision.v8.5.Development.Module

4. NI-IMAQ FOR USB*

*对于XP SP2系统还需要加载ImaqDirectShowDll.dll、ImaqDirectShowExportDll.dll

图像处理部分分为主要由以下几个部分组成的:

1.图像采集

2.图像阈值分析和转化

3.迷宫出入口检测与小车检测

4.迷宫转化成数组(提供给迷宫算法的接口)

在Labview中我们可以很容易的利用其本身就拥有的扩展库来完成以上的操作,下面对于我们的图像处理程序进行介绍:

1.图像采集

我们组在图像采集部分采用的是动静结合的方法,即先采集一张静态的迷宫图像,通过这个图像,标定出迷宫出入口和小车初始位置,事先计算出小车应该走的路径,之后在小车开始行动之后进行动态采集,分析小车的位置,再对比算出的位置与之前的最短路径来确定小车如何行动。相对于其他组利用OPENCV进行的动态采集,需要不断的计算路径和修正小车方向,我们的方法大大减少了运算量,也减少了小车卡在角落的可能。

静态采集较为简单,可以通过外部软件获取图像,也可以直接调用Labview中NI-IMAQ组件的相关函数来进行单次的采集,在这里我们利用的是Labview中NI-IMAQ相关函数

结合上图来看,先枚举摄像头利用IMAQ USB Enumerate Cameras,然后对摄像头初始化IMAQ USB Init,分配空间并设置基础IMAQ USB Grab Setup,最后进行采集图像IMAQ USB Grab Acquire。

当需要进行动态采集的时候,只需要把采集的部分即IMAQ USB Grab Acquire进行一个循环就可以了。

2.图像降噪和阈值分析(图像二值化)

图像采集完毕之后,必须要进行二值化才能继续进行操作,因为摄像头和光线条件的等原因,图像采集之后会有大量的噪点存在,二值化之后可能会在路径上产生黑斑影响计算,而我们想到如果迷宫计算不是采用寻找路径的方法而是采用检测出墙壁进行计算的方法,就可以很好的避免大量噪点的问题。对于阈值分析Labview中同样有合适的函数可以进行

利用IMAQ ColorThreshold,我们可以调整各种颜色阈值来将图像二值化,如下图所示:

其中族控制输入三个阈值的数据,255是二值化后的灰度。

3.迷宫出入口的检测与定标。

在计算中我们把迷宫转化成了一个矩阵,但是图的边界不一定是迷宫的边界,我们需要手动标定出迷宫的边界,这是就需要用到IMAQ Select Point,通过鼠标点选选出迷宫的边界(角)的坐标,如下图所示。

在标定了迷宫边界之后,我们就可以进行对于小车和终点位置的标定了,我们在小车上放上与迷宫颜色同样的圆形,终点处也放一个圆形,两个圆形拥有不同的大小,它们的颜色与迷宫墙壁相同,于是可以通过二值化被保留下来。

利用IMAQ Detect Circles可以检测到这些圆形,因为半径的不同可以设置合适的值来分辨出小车和出口的不同。

4.迷宫算法程序在LABVIEW中的接入

在经过了以上的过程之后,我们已经拥有了二值化后的迷宫(矩阵形式)还有迷宫出口的坐标,小车的坐标(即起始点坐标),可以开始计算小车走迷宫的路径了,这时就需要接入C++程序来对路径进行计算。Labview的可扩展性很强,我们可以把C++代码生成一个DLL文件来插入Labview中去。在函数选板中找到互连接口->库和可执行程序->调用库函数节点就可以建立一个dll调用节点。设置各种参数并导入dll文件就可以了。

我们的迷宫算法接口输入了一个二维数组和小车的坐标以及出口的坐标,假设迷宫是4×4大小,则在这里生成一个4×4的二维数组其中标出了小车应该走的路径,具体的实现参见迷宫算法部分。

5.串口通信

Labview因为其强大的扩展功能对于串口通信来说自然是不在话下,如下图就是一个串口通信的例子:

如图写入一个0到串口。

感想:

这次也是我进入大学以后第二次做科创类的课题了,与科创1的玩玩闹闹不同,科创3的难度确实给了我们不少的挑战,一开始我们觉得Labview是可视化编程或许相对于纯代码的OPENCV要简单不少,但是随着对于Labview进行了了解了之后,我发现它并不是一个简单的东西,而且我们也不能像使用OPENCV的组那样有很多能够用来参照的样例。但是我还是坚持下来并把这个图像处理的部分做了下来,回头来看看,这过程中翻查资料,试验编程的过程中,自己还是有了长足的进步。然而之后却遇到了更大的难题,就是Labview各个版本不统一,且对于中文系统的支持不好,导致我们动态采集部分一直会报错,我们暂时用静态的图片迭加解决了这个问题。然而在我们组编好迷宫算法,虚拟调试能够找到正确的路径,并且发送正确的命令时,小车却一动不动了。因为我们组拿到小车的时间很晚,没有对小车进行初步的调试就直接模拟了环境,但不料小车却无法正确接收指令,而我们到最后也没能解决这个问题,实在是非常遗憾。

但是我想经过了这次科创的学习与实践,我对于Labview以及单片机控制都有了入门的了解,相信如果之后能够遇到类似的问题,一定能够成功的解决。下载本文

显示全文
专题