您的位置:首页 > 其它

基于数字图像处理的橘子识别系统

2018-06-25 22:09 197 查看

1 系统分析

1.1 问题描述

以柑橘为例,开发一个水果识别系统。

要求:

1. 使用GUI界面,打开图像,对其中的柑橘进行标识,标识出的效果大致如下图所示,并统计其中的柑橘个数。

2. 主要根据柑橘和背景的颜色差异进行识别。

3. 应能够对不同环境下的柑橘进行识别。

要求能够保存每一步所处理的图像。

 

1.2 系统功能分析

(1)打开并展示图像。

(2)对图像中的柑橘进行标识并保留每一部所处理的图像。

(3)对柑橘个数进行统计。

 

1.3开发平台及工具介绍

开发平台:Netbeans

开发工具:opencv开源代码库、javaFX

 

1.4参考资料

《图像处理基本算法 车牌识别与定位》——

https://blog.csdn.net/renshengrumenglibing/article/details/8596333

《OpenCV For Java环境搭建与功能演示》——

https://www.geek-share.com/detail/2702029224.html

《OpenCV成长之路:直线、轮廓的提取与描述》——

http://mobile.51cto.com/aengine-435442.htm

《边缘检测完后,如何标出区域》——

http://wsq.discuz.com/?siteid=628107753&source=wap&c=index&a=viewthread&tid=82172&mobile=2

《Imgproc.findContours 例子,参数说明》——

http://m.bubuko.com/infodetail-1501621.html

 

 

2 系统设计

2.1 系统总体结构设计

 

 

 

 

 

2.2系统各个类及类之间关系设计

本系统由三个类组成,分别是FindOrangeSystem、Controller、findOrange。

FindOrangeSystem类:本系统的主类,有一个fxml文件与之映射,实现图形界面的展示。

Controller类:操作控制类,识别用户对界面的操作并主导流程的进行。调用findOrange类进行数字图像处理。

findOrange类:系统的核心,进行数字图像处理的操作,包含一系列数字图像处理的方法。包含构造方法,包含类属变量,其中original为初始图像,number为识别到的橘子的个数。

 

2.3数据存储的设计

用findOrange类的类属变量original储存用户打开的初始图像,number储存识别到的橘子的个数,每一步数字图像处理的结果直接保存到相对路径src/的文件夹中。

 

2.4界面设计

使用javafx sencebuilder设计界面,界面分为菜单栏,图片显示区,结果显示区,功能区四个部分。菜单栏有文件按钮,用于打开需要识别的图片,关于按钮里显示小组成员与分工。

界面左半部分是图片显示区,打开的图片会显示在上面,右半部分的下半部分是功能区有两个按钮为“上一个”“下一个”,由于展示图片识别过程。上半部分用于结果显示即识别出来的柑橘个数。

 

 

3 系统实现

3.1主要模块的流程图及代码段片段

主要模块:

(1)打开并展示初始图像。

 

 代码片段:

@FXML

private void openAction(ActionEvent event) throws MalformedURLException {

imageview.setVisible(true);

FileChooser fileChooser = new FileChooser();

                

fileChooser.getExtensionFilters().addAll(

    new FileChooser.ExtensionFilter("JPG", "*.jpg"),

    new FileChooser.ExtensionFilter("GIF", "*.gif"),

    new FileChooser.ExtensionFilter("BMP", "*.bmp"),

    new FileChooser.ExtensionFilter("PNG", "*.png")

);

fileChooser.setTitle("选择图片");

Window stage = null;

file= fileChooser.showOpenDialog(stage);

                textview.setText("");

                num=0;

String adress = file.toString();

imageview.setImage(new Image("file:///"+adress));

                example=new findOrange(file.getAbsolutePath());

                example.start();

                number=example.number;

}

(2)数字图像处理。

 

代码片段:

public void start(){

        this.Orange();

        this.kaiYunSuan();

        this.gray();

        this.GaussianBlur();

        this.sharpen();

        this.doCanny();

        this.biYunSuan();

        this.Contours();

    }

(3)展示下一步操作的图像。

 

 代码片段:

@FXML

        private void nextpicture(ActionEvent event) throws IOException{

            imageview.setVisible(true);

            Window stage = null;

            if(num==0){

                file = new File("D:\\java\\findOrangeSystem\\src/orange.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==1){

                file = new File("D:\\java\\findOrangeSystem\\src/kai.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==2){

                file = new File("D:\\java\\findOrangeSystem\\src/gray.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==3){

                file = new File("D:\\java\\findOrangeSystem\\src/GaussianBlur.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==4){

                file = new File("D:\\java\\findOrangeSystem\\src/canny.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==5){

                file = new File("D:\\java\\findOrangeSystem\\src/bicanny.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==6){

                file = new File("D:\\java\\findOrangeSystem\\src/contours.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                num++;

            }

            else if(num==7){

                file = new File("D:\\java\\findOrangeSystem\\src/result.jpg");

                imageview.setImage(new Image("file:///"+file.toString()));

                textview.setText(""+number);

                num++;

            }

        }

4 系统测试

4.1 模块测试

(1)打开并展示初始图像模块

测试结果:可以通过图形界面打开计算机中任意一张图片并展示出来。

(2)数字图像处理模块

测试结果:对于一个或多个相隔较远的橘子有比较好的识别效果,对于相隔很近或重叠的橘子识别效果较差。

(3)展示下一步/上一步模块

测试结果:能够查看流程中任意一个步骤的图片。

4.2系统测试

基本实现题目要求功能

 

5 系统运行界面

5.1初始界面

 

5.2初始图像

 

 5.3颜色筛选

 

5.4开运算

 

 5.5灰度化

 

5.6模糊处理

   

5.7边缘检测

 

5.8闭运算

 

5.9轮廓跟踪

 

5.10最终结果


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐