本帖最后由 ky123 于 2018-1-31 14:13 编辑
前言: 在含杂质透明溶液的原始图像中,杂质大小不一样,并且存在光线不一样的问题。据此,设计如下方案:把对透明溶液中杂质的检测分为图像预处理和自动辨识杂质两部分,其中图像预处理要完成图像由原始真彩色图像到灰度图像的转换、图像增强等一系列操作,自动辨识杂质是以边缘检测为基本方法完成的。透明溶液杂质检测系统主要包括树莓派3开发板、800w的树莓派camera摄像头以及7寸HDMI显示屏等,其中树莓派3开发板用于主控中心,camera摄像头用采集和摄取透明溶液的原始图像,HDMI LCD显示屏用于检测结果显示,图像处理算法处理方面使用的是开源计算机视觉库OpenCV。
一、透明溶液可见异物检测系统框架 基于智能视觉技术透明溶液可见异物检测系统的系统组成主要有以下几部分,CPU 主控中心、电源管理系统、摄像头视觉系统、人机交互通道系统,CPU主控中心采用的是性能强大的开源硬件Raspberry Pi 3,Raspberry Pi 3是一款基于ARM 的微型电脑,CPU为Broadcom 的BCM2837,采用的是四核心ARM Cortex-A53的64位架构,最高主频能达到1.2GHz,GPU的最高主频达到了400MHz,板卡上还搭配了WiFi&蓝牙模块、摄像头接口、4路USB接口、HDMI接口以及多个通用GPIO口,性能强大,外设丰富,易于开发和拓展,在电源系统方面,采用专门定制的2.5A@5V 电源,能提供大功率电流,摄像头视觉系统的组成是原装的树莓派摄像头二代Raspberry Pi Camera v2:RPI 8MP Board V2 ,Raspberry Pi NoIR Camera v2二代原装摄像头采用IMX219模组,视场角(度):73.8, 800万像素,人机交互通道系统的组成主要是微雪电子打造的7 寸LCD电容触摸HDMI显示器,能提供非常好的触摸精度识别以及显示效果,总体的硬件设计思路就如上述一样,采用Raspberry Pi 3作为主控中心,控制800 万摄像头采集透明溶液原图,通过七寸HDMI显示屏显示出来后,采用专门的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 $ 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就能正常调用了 在OpenCV的C++程序进行调用Camera摄像头采集图像,video.cpp源码如下 Makefile如下: 测试结果如下: 上述的程序使用了OpenCV的高斯滤波还有边缘检测进行简单的检测,从测试结果看,在OpenCV中使用C++编程可以成功的调用了树莓派官方的800w摄像头了。 微雪电子的这款通用HDMI LCD 触摸显示屏非常地强大,工作于PC的Windows,系统能自动识别分辨率,并不需要手动设置,当工作与树莓派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 卡插入到树莓派3的TF卡槽,将树莓派的USB以及HDMI接口和LCD显示屏幕连接,并将电源开关打开上电即可 启动成功后如下所示 五、使用OpenCV进行透明溶液可见异物识别 1、图像处理原理以及相关技术说明 1)图像二值化技术 图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是将整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。 2)图像边缘检测技术 边缘检测的实质是采用某种算法来提取出图像中对象与背景问的交界线。我们将边缘定义为图像中灰度发生急剧变化的区域边界。图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。经典的边缘检测方法,是通过对原始图像中像素的某小邻域构造边缘检测算子来达到检测边缘这一目的的。 常见的边缘检测算子有如下几种: 一阶:Roberts Cross算子,Prewitt算子,Sobel算子,Canny算子, Krisch算子,罗盘算子; 二阶: Marr-Hildreth,在梯度方向的二阶导数过零点。 边缘检测的步骤如下: ①滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。需要指出,大多数滤波器在降低噪声的同时也导致了边缘强度的损失,因此,增强边缘和降低噪声之间需要折中。 ②增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将邻域(或局部)强度值有显著变化的点突显出来。边缘增强一般是通过计算梯度幅值来完成的。 ③检测:在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点。最简单的边缘检测判据是梯度幅值阈值判据。 2、程序代码实现流程 在程序的实现过程中,图像处理使用的是OpenCV 算法库的C++ API接口,树莓派开发板控制摄像头对待测样本进行照片采样,并创建一系列的的图像内存处理空间,将摄取的样品照片进行二值化处理,得到灰度图像,另外,根据实际情况对二值化的灰度图像进行对比度以及亮度调节,以达到最佳的处理效果,接下来使用Sobel算子对已经增强的灰度化图像进行边缘检测处理,识别出透明溶液中的可见异物,处理完成后,对处理结果进行显示,同时施放已申请的内存空间。 代码的总图流程图如下所示 |