基于Java+OpenCV技术
对几何图像颜与形状识别
杨思阳黄军吴春秋
(黔东南民族职业技术学院,贵州凯里556000)
[摘要]通过Java调用OpenCV视觉库实现几何图像颜、形状识别。将图像转化为HSV颜空间,按各颜H、S、V 的取值范围分割图像,对分割图像进行滤波处理、灰度处理、二值化、轮廓提取、去除干扰轮廓、轮廓形状拟合、获取轮廓凸点个数、用凸点距离判断形状,从而实现对各种颜的三角形、圆、矩形、正方形、多边形等几何图像颜、形状的识别。该方法可应用于现实生活中,例如识别交通信号灯和信号转向灯等有颜和形状识别的领域。
[关键词]OpenCV;颜分离;形状拟合
中图分类号:TP391.41文献标识码:A文章编号:1008-6609(2019)01-0079-04
1引言
随着社会科学技术的发展进步,特别是近几年计算机软硬件技术的高速发展和计算机视觉的广泛应用,对图像处理的要求越来越高。通过翻阅大量文献发现对彩几何图像的识别,要么用C、C++语言,要么用Python、matlab实现,而采用Java编程实现的较少。同时,在Java实现几何图像识别算法中,大多采用R、G、B三原基础进行图像识别,而用HSV 颜空间进行颜识别的较少,且对颜、形状识别率也不是很高。
本文提出用Java编程调用OpenCV视觉库实现对7种常见颜几何图像的识别。首先将图像从BGR转化为HSV 颜空间图像,并用OpenCV中算法对图像颜分离,然后分别对各种颜图像进行轮廓提取、形状拟合,从而实现对几何图像形状和颜的识别,该方法可借鉴用于现实生活中有颜和形状识别的领域。
2导入OpenCV的Java包
在OpenCV下载OpenCV3.0.0,解压后,在已建项目的Eclipse开发环境里将OpenCV解压文件里的build\Java 文件,根据电脑系统选择相对应的OpenCV-300库导入现有项目,即可在项目中正常调用OpenCV-Java库。本文电脑系统为32位系统,选择OpenCV-x86包导入。3颜图像分割
3.1缩小图像
因在后面需要处理图像像素值,为了提高处理速度,将图像缩小。用OpenCV-Java库里的函数size(src,dst, dsize)缩小图片,src为原图,dst为输出图像。
3.2转化为HSV颜空间
OpenCV默认处理的图片是BGR颜空间,而现多为RGB型图像。首先将RGB转为BGR,再将BGR转为HSV。因为BGR、RGB都是红、绿、蓝三原组合成的颜图形,如果需对三原外的其他颜识别,用R、G、B值实现难度较大,识别率不高。
而用HSV中的H、S、V值识别图像颜较为容易,且各颜的H、S、V取值范围也比较容易划分。在HSV颜空间中,各颜三个分量H、S、V取值范围如图1。
用函数Imgproc.cvtColor(imageResized,HSVImg, Imgproc.COLOR_RGB2BGR)将RGB转为BGR。用函数Imgproc.cvtColor(imageResized,HSVImg,Imgproc.COL-OR_BGR2HSV)将BGR转为HSV。imageResized为输入图像,HSVImg为输出图像。
3.3获取图像像素点H、S、V值
在HSV颜空间内遍历图像像素点,用HSV图形中H、S、V的取值范围判断各颜,从而获取各颜像素点,并累计
作者简介:杨思阳(1987-),男,贵州天柱人,硕士研究生,讲师,研究方向为控制理论与控制工程。
个数。用下面代码获取HSV 各像素点H 、S 、V 三个分量的值:
double[]clone =(i,j).clone();int h=(int)clone[0];int s =(int)clone[1];int v =(int)clone[2];
3.4分割图像颜
用上面方法获取各颜像素点的个数,设置阈值,本文设置阈值大于200,则说明图形中有此颜图形,否则没有此颜图形。这是为了防止环境和外界、
反光带来颜的干扰。用opencv 中Scalar 类,得到各颜最大最小值。例如,分割图像中绿部分,绿的最小值和最大值为:
Scalar minval=newScalar(35,43,46);//绿最小值Scalar Maxval=newScalar(77,255,255);//绿最大值然后,用函数Core.inRange()把原图像各颜部分分割为新图像,例如:绿的部分图像分离:Core.inRange(lmag,min-val,Maxval,mask)。
最后,
用函数Core.bitwise_and()把各颜图像与源图像取与运算得到各颜的分割图像,保存在Mat 类型的局部变量rdst 里。
绿分割图像:Core.bitwise_and(imageResized,lmag,rdst,mask)。
3.5颜分割图像实现
通过图2~图6可看出已经正确将各颜图像分离。此处只举了4种例,其他颜分割用相同方法实现。
4各颜图像形状识别
分割后的各颜图像分别保存在局部变量rdst 里。此时rdst 图像不是三通道图像,不能进行灰度化处理,用函数vertTo(rdst,CvType.CV_8UC3)将rdst 转为三通道图像。然后再经过以下步骤实现形状识别:
(1)图形滤波除噪
图1各颜H 、S 、V
范围
图2识别原图
图3分割红图图4分割黄
图形中可能有光线、
反光的干扰,可用高斯滤波去除一些干扰。用函数Imgproc.GaussianBlur ,也叫高斯平滑。
(2)图形灰度化
要将图形二值化,必须是灰度图形。对分离后的各颜图像灰度处理,
用函数:Imgproc.cvtColor(imageResized,HSVImg,Imgproc.COL-OR_BGR2GARY)。
(3)图形二值化
要对图形寻轮廓,
须对图像边缘检测或二值化处理,本文采用二值化处理,用函数Imgproc.threshold 。
(4)
轮廓先用腐蚀函数:de 去掉不连通、零散的像素点;再用膨胀函数:Imgproc.dilate 将已有的轮廓连通。
例如:用上面滤波、腐蚀、膨胀等算法,将图4中干扰直线像素点去掉,图6不封闭轮廓去掉。如图7、图8。
用函数:Imgproc.findContours 获取图像中的轮廓。用程序:for (int j =0;j <contours.size();j++){
(j));if(area<=10||area>=ve
((j));}
去除很小、很大的轮廓,
并删除这些干扰轮廓。(5)对轮廓形状拟合,得到图形形状
用函数:Imgproc.approxPolyDP 对轮廓形状拟合,用函数:Array().length 获取凸点个数和相邻凸点距离。利用凸点个数和相邻凸点距离来判断正方形、长方形、五边形、多边形、圆、三角形等几何图形,如图9、10。
5总结
本文经过大量实验验证后,识别准确率在99%以上,且用Java 编程调用OpenCV 视觉库对目标图像转换为HSV ,用各颜H 、S 、V 的取值范围分割图像,然后分别对各颜图像进行滤波处理、灰度化、二值化、轮廓提取、消除干扰轮廓、轮廓形状拟合、获取轮廓凸点个数和相邻凸点距离判断形状,从而实现了对各颜的三角形、
圆、矩形、正方形、多边形等几何图形颜和形状的识别。未来还可以用于识别十字形、五角星等形状。可借鉴用于生活的各个方面,如典型交通灯、火焰识别等。
参考文献:
[1]周倩,王军,王亮亮.基于OpenCV 轮廓逼近的Android 简单图形识别[J].福建电脑,2016,32(2):122-123.
[2]于仕琪,刘瑞祯.学习OpenCV[M].北京:清华大学出版
图5分割绿图图6分割橙
resized图7去噪二值化图
图8去噪二值化
图9样图1识
图10样图2识别
Geometric Image Color and Shape Recognition Based on Java +OpenCV
YANG Si-yang HUANGJun WUChun-qiu
(Qiandongnan Vocational and technical College for Nationalities,Kaili 556000,
Guizhou)
This paper uses Java and OpenCV visual library to realize geometric image color and shape recognition.The image is
transformed into HSV color space,and the image is segmented according to the range of H,S and V values of each color.The seg-mented image is processed by filtering,grayscale processing,binarization,contour extraction,removing interference profile,contour shape fitting,obtainingt
he number ofconvex points,judging the shape by the distance of convex point,so as to realize the image color and shape recognition.It can be used in real life,such as the recognition oftraffic lights and signal
turninglights.
OpenCV;color separation;shape fitting
社,2009.
[3]阴法名.基于OpenCV 图像处理[J].科技信息,2009(32):220.
[4]甘玲,林小晶.基于连通域提取的车牌字符分割算法[J].计算机应用与软件,2011,28(4):336-339.