1回答

2收藏

[大赛作品提交] 基于树莓派的透明溶液可见异物检测系统

Raspberry Pi Raspberry Pi 6663 人阅读 | 1 人回复 | 2017-12-23

本帖最后由 ky123 于 2018-1-31 14:13 编辑

前言:
在含杂质透明溶液的原始图像中,杂质大小不一样,并且存在光线不一样的问题。据此,设计如下方案:把对透明溶液中杂质的检测分为图像预处理和自动辨识杂质两部分,其中图像预处理要完成图像由原始真彩色图像到灰度图像的转换、图像增强等一系列操作,自动辨识杂质是以边缘检测为基本方法完成的。透明溶液杂质检测系统主要包括树莓派3开发板、800w的树莓派camera摄像头以及7HDMI显示屏等,其中树莓派3开发板用于主控中心,camera摄像头用采集和摄取透明溶液的原始图像,HDMI LCD显示屏用于检测结果显示,图像处理算法处理方面使用的是开源计算机视觉库OpenCV

一、透明溶液可见异物检测系统框架
基于智能视觉技术透明溶液可见异物检测系统的系统组成主要有以下几部分,CPU主控中心、电源管理系统、摄像头视觉系统、人机交互通道系统,CPU主控中心采用的是性能强大的开源硬件Raspberry Pi 3Raspberry Pi 3是一款基于ARM的微型电脑,CPUBroadcom BCM2837,采用的是四核心ARM Cortex-A5364位架构,最高主频能达到1.2GHzGPU的最高主频达到了400MHz,板卡上还搭配了WiFi&蓝牙模块、摄像头接口、4USB接口、HDMI接口以及多个通用GPIO口,性能强大,外设丰富,易于开发和拓展,在电源系统方面,采用专门定制的2.5A@5V电源,能提供大功率电流,摄像头视觉系统的组成是原装树莓派摄像头二代Raspberry Pi Camera v2:RPI 8MP Board V2Raspberry Pi NoIR Camera v2二代原装摄像头采用IMX219模组,视场角()73.8, 800万像素人机交互通道系统的组成主要是微雪电子打造的7LCD电容触摸HDMI显示器,能提供非常好的触摸精度识别以及显示效果,总体的硬件设计思路就如上述一样,采用Raspberry Pi 3作为主控中心,控制800万摄像头采集透明溶液原图,通过七寸HDMI显示屏显示出来后,采用专门的OpenCV库算法进行图像处理,从而达到识别出医用药剂中的可见异物效果。
可见异物检测系统总体框图如下所示:


二、树莓派3安装OpenCV
1、安装必要的依赖以及软件包
更新
$ sudo apt-get update
$ sudo apt-get upgrade
安装必要的开发人员工具
$ sudo apt-get install build-essential cmake pkg-config

安装常用的图像输入输出包,允许从磁盘加载各种格式的图片
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

安装常用的视频输入输出包,允许从磁盘加载各种格式的视频文件
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev

OpenCV库附带一个名为highgui的子模块,用于在屏幕上显示图像并构建基本的gui。为了编译highgui模块,需要安装GTK开发库:
$ sudo apt-get install libgtk2.0-dev libgtk-3-dev

OpenCV内部的许多操作(即矩阵操作)可以通过安装一些额外的依赖项来进一步优化:
$ sudo apt-get install libatlas-base-dev gfortran

安装Python头文件
$ sudo apt-get install python2.7-dev python3-dev

2、下载Opencv源码
$ cd /share
$ unzip opencv.zip
下载opencv_contrib
$ unzip opencv_contrib.zip

3、安装Python包管理(可选择)
$ sudo python get-pip.py
$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf /share/.cache/pip
修改环境变量
$ vim ~/.profile
文件末尾添加
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
$ source ~/.profile
创建Python视觉环境
$ mkvirtualenv cv -p python2
使用Opencv,在终端raspberry前多出(cv)即可
$ source ~/.profile
$ workon cv
树莓派上安装NumPy
$ pip install numpy

4、编译安装Opencv
$ workon cv
$ cd /share/opencv-3.3.0/
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules \
    -D BUILD_EXAMPLES=ON ..
$ make

$ sudo make install
$ sudo ldconfig
编译完成后,对于Python2.7还需要下面操作
$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/
$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so

5、测试Opencv安装结果
$ source ~/.profile
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'3.3.0'
>>>

退出Python,删除源码
$ rm -rf opencv-3.3.0 opencv_contrib-3.3.0

三、OpenCV中调用camera摄像头
添加树莓派camera摄像头,将摄像头插入到开发板的CSI接口即可

直接在树莓派下的CSI接口插入camera摄像头,在系统中是没有直接生成/dev/video0设备节点的,需要进行相应的配置。
$ cd /etc/modules-load.d/
$ sudo vim modules.conf
在该文件下添加bcm2835-v4l2,意思是在系统启动后加载bcm2835-v4l2这个模块。

添加完成后,重启,会发现/dev/下面发现video0设备节点,opencv就能正常调用了
OpenCVC++程序进行调用Camera摄像头采集图像,video.cpp源码如下
Makefile如下:


测试结果如下:

上述的程序使用了OpenCV的高斯滤波还有边缘检测进行简单的检测,从测试结果看,在OpenCV中使用C++编程可以成功的调用了树莓派官方的800w摄像头了。
四、树莓派添加HDMI LCD显示屏
微雪电子的这款通用HDMI LCD触摸显示屏非常地强大,工作于PCWindows,系统能自动识别分辨率,并不需要手动设置,当工作与树莓派3开发板时,需要手动配置config.txt文件。
树莓派的系统镜像烧写到TF后后,在PC端打开TF镜像中的boot分区,修改config.txt文件,在文件的末尾添加如下:
max_usb_current=1
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 1024 600 60 6 0 0 0
hdmi_drive=1
修改完成后,将TF卡插入到树莓派3TF卡槽,将树莓派USB以及HDMI接口和LCD显示屏幕连接,并将电源开关打开上电即可

启动成功后如下所示

到此,树莓派3添加LCD显示屏完成。
五、使用OpenCV进行透明溶液可见异物识别
1、图像处理原理以及相关技术说明
1)图像二值化技术
图像的二值化处理就是讲图像上的点的灰度置为0255,也就是将整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样有利于再对图像做进一步处理时,图像的集合性质只与像素值为0255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。
2)图像边缘检测技术
边缘检测的实质是采用某种算法来提取出图像中对象与背景问的交界线。我们将边缘定义为图像中灰度发生急剧变化的区域边界。图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。经典的边缘检测方法,是通过对原始图像中像素的某小邻域构造边缘检测算子来达到检测边缘这一目的的。
常见的边缘检测算子有如下几种:
一阶:Roberts Cross算子,Prewitt算子,Sobel算子,Canny算子, Krisch算子,罗盘算子;
二阶: Marr-Hildreth,在梯度方向的二阶导数过零点
边缘检测的步骤如下:
       ①滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。需要指出,大多数滤波器在降低噪声的同时也导致了边缘强度的损失,因此,增强边缘和降低噪声之间需要折中。
  ②增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将邻域(或局部)强度值有显著变化的点突显出来。边缘增强一般是通过计算梯度幅值来完成的。
  ③检测:在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点。最简单的边缘检测判据是梯度幅值阈值判据。
2、程序代码实现流程
在程序的实现过程中,图像处理使用的是OpenCV算法库的C++ API接口,树莓派开发板控制摄像头对待测样本进行照片采样,并创建一系列的的图像内存处理空间,将摄取的样品照片进行二值化处理,得到灰度图像,另外,根据实际情况对二值化的灰度图像进行对比度以及亮度调节,以达到最佳的处理效果,接下来使用Sobel算子对已经增强的灰度化图像进行边缘检测处理,识别出透明溶液中的可见异物,处理完成后,对处理结果进行显示,同时施放已申请的内存空间。
代码的总图流程图如下所示

code.txt (1.08 KB, 下载次数: 5)
3、Sobel算子边缘检测实现原理
索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。
Sobel卷积因子为:

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,GxGy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:

图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

如果梯度G大于某一阀值 则认为该点(x,y)为边缘点。
4、异物检测结果
使用树莓派3开发板控制摄像头摄取异物样品照片,在OpenCV下可调用VideoCapture类接口,测试的照片如下

将采取的照片进行预处理,使用灰度转换变为二值化图像,如下所示(左为原图,右为灰度处理)

对图像预处理完成后,使用Sobel算子进行边缘检测,结果显示如下(从左到右依次是X方向梯度、Y方向梯度、合并的近似梯度)

从检测结果上看出,sobel算子边缘检测能准确地识别处理可见异物的边缘,接下来对,边缘检测后的图像进行膨胀操作, 填充边缘缝隙

通过膨胀操作, 填充边缘缝隙操作能更加凸显出可见异物的位置,检测的过程基本如上所示,最后的显示检测结果

六、总结与展望
感谢爱板网以及e络盟提供了这么好的e络盟树莓派创意设计大赛平台,也感谢e络盟官方提供的的比赛基金券,让笔者得以完成基于树莓派的透明溶液可见异物识别检测,在比赛的过程中,学习到了很多,谢谢。

关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

武阳

发表于 2017-12-27 09:25:08 | 只看该作者

不错,学习了。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条