基于视觉的植物枝芽尺寸测量(JavaWeb部分以及算法实现的一点思路)

一、案例分析和设计

1. 案例介绍

这是一个前后端分离的小项目,该案例包含的JavaWeb知识点如下:

涉及web知识点
基于MVC的三层架构的实现(项目搭建)
数据库连接(通过JDBC)
JavaWeb程序通过AJAX与前端交互的过程(Servlet+AJAX+JSON)
模拟前后端通过接口文档对接(简化版)以及使用postman模拟前端请求
跨域问题的解决(Filter)

(1) 案例背景
手工测量枝芽长度费时费力。。。。,因此我们编写一个基于视觉的测量系统。本文只简单涉及基本的web组件以及一点算法实现思路,暂未涉及物联网相关。
(2)实现功能
共有两个页面,使用流程如下:

Created with Raphaël 2.2.0 测量首页 上传图片和相关信息 web程序 连接MySQL判断产区名和摄像头编号 保存并测量图片 前端页面展示测量结果 前端页面给出错误提示 yes no

实现功能如下:

  1. 验证产区名和摄像头编号是否都正确
  2. 保存图片并测量枝芽长度
  3. 测量信息存入数据库

效果图:
1)上传图片及相关信息,返回1/0上传图片及相关信息,返回1/0
2)展示测量结果展示测量结果

MySQL数据:
在这里插入图片描述
在这里插入图片描述

2. 案例设计
(1) 数据库设计

数据库只简单涉及两个表: 产区与摄像头表测量结果表
两表所含字段如下:

产区与摄像头表测量结果表
placenamec_id
cameraidplacename
measure_date
neasure_result

其中,产区与摄像头表的数据是在创建表的时候就插入的,作用就是在测量首页输入产区名和摄像头编号后,服务端会去此表中验证是否一致,一致即保存图片数据并测量枝芽长度;否则,不保存图片,向前端返回0。

建表SQL语句如下:
产区与摄像头表

#创建产区与摄像头表
CREATE TABLE place_cam (
  placename VARCHAR(20) NOT NULL,  #产区名
  cameraid BIGINT(20) UNSIGNED NOT NULL,  #摄像头编号
  PRIMARY KEY (cameraid), #摄像头编号为主键
  UNIQUE KEY placename (placename) #产区名唯一
)

#插入产区名和摄像头编号
INSERT INTO place_cam
VALUES('zhifu',001),('kaifa',002),('laishan',003);

测量结果表

#创建测量结果表
CREATE TABLE measure_results(
	c_id BIGINT UNIQUE, #摄像头编号
	#placename VARCHAR(20) NOT NULL, #产区名
	#measure_date DATE DEFAULT NULL, #测量日期
	#measure_time TIME DEFAULT NULL, #测量时间
	measure_result FLOAT DEFAULT NULL,
	PRIMARY KEY(c_id) #主键
)

(2)后端设计—基于MVC的软件三层架构的实现

1)MVC就是Model(模型)、View(视图)、Controller(控制器)的缩写,它将软件系统分为三个部分。

  • Model(模型):接受视图层传递的数据,实现业务逻辑,访问数据库。比如,在本案例中,验证摄像头编号等信息和测量的功能就是由Model来实现。Model主要由JavaBean来实现。
    JavaBean即一个Java类,有以下特点: ①public修饰的类,提供public 无参构造方法② 所有属性都是private③ 提供get和set方法。(关系型书库)JavaBean往往对应于数据库中的一张表,如本案例中数据库中有两个表,place_cam表 和 measure_result表,则项目中就有会PlaceCam类和MeasurResultt类,这两个类中的属性即为数据库表中的字段,我们可将这两个类称为实体类。很好的体现了ORM的思想。
  • View(视图):主要负责的就是,①页面展示②与用户进行交互(用户点击按钮、填写各种数据等) ③收集数据,向Model层传递用户填写的数据。在本案例中,实现了前后端分离,故视图层均由前端实现,后端只负责接收前端传递的数据,以及向前端发送数据。
  • Controller(控制器):负责将View与Model一一对应起来,即View(前端)发送了一个请求时,这个请求会被Controller接收,然后Controller会将接收到的数据转到Model中对应的部分,Model处理完毕后,会将结果返回到Controller,之后再由Controller返回给View。这也意味着,View和Model的交互,都需要经过Controller。在JavaWeb中,Controller一般由servlet实现。

2)软件的三层架构
通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)再加上一个用于封装数据的实体类库(JavaBean)。该实体类库不属于以上三层的任何一层,它是用于三层之间的通信的。
三层架构是一种自上而下的依赖方式,上层与下层无关,上层不需要考虑下层的操作,对下层的改变也不会影响上层。

UI(表现层)
通俗来讲就是展现给用户使用的界面,用于显示数据和接收用户输入的数据。
一般来说,前端页面,以及后端的Servlet就属于表现层,因为两者的功能符合表现层的定义。
BLL(业务逻辑层)
主要负责的就是处理涉及业务逻辑相关的问题,比如在调用访问数据库之前,先处理数据、判断数据。
DAL(数据访问层)
该层主要负责就是直接访问数据库,并对数据库进行一系列操作,比如增删改查等。
在这里插入图片描述

3)两者对应关系
在这里插入图片描述

(3) 基于MVC和三层架构项目搭建(后面再加maven支持)
  • beans:存放的是JavaBean。即实体类包,负责封装数据。
  • controller:存放的是servlet,即负责控制器的内容。
  • service:存放的是与业务逻辑相关的类,负责业务处理,实现核心需求
  • dao:存放与数据库连接相关的类,负责连接数据库
  • utils:存放的是连接数据库的工具类,是用来连接数据库的工具
  • 前端部分

由上面的几个包,我们可以得到以下的层次关系:
①前端通过AJAX发送请求
②controller层接收请求,调用service层
③service层进行处理后,调用dao层
④dao层使用工具类utils进行数据库的访问
⑤调用数据库完成后,dao层不做任何处理,直接返回数据给service层,service层进行业务处理后,返回给controller控制器,最后由控制器返回结果给前端。
⑥过程中,beans里的JavaBean承担着封装数据以使各层能够正常使用的角色。

基本的调用关系如下:
前段 ------->controller------>service------>dao----->数据库

每一层访问下一层都是通过接口来进行的,上一层与下一层无关。同时不允许跨层调用。
层与层调用关系:在这里插入图片描述
从MVC模式的角度看:
本案例中的前端部分即属于View(视图部分),controller则属于Controller(控制器部分),而service层和dao层以及JavaBean则属于Model(模型部分)。
在一般的MVC模式下,Model层也会分为业务层(service)和数据访问层(dao),而不是直接把业务和数据访问写在同一个包或者同一个类下。

从软件三层架构的角度看:
本案例的前端部分和controller即为UI(表现层),而service层则为BLL(业务逻辑层),dao层则为DAL(数据访问层)。beans和utils虽然不属于三层,但是其是为了更好的实现三层而存在的,故是符合三层规范的。

以上可以得到其实MVC设计模式和三层架构是可以一起使用的。

3. 开发与简单测试
接口文档链接
3.1 前端

ajax发起请求,数据传输格式为form-date或json

3.2后端

(1)项目搭建
时用到的工具:

  • 数据库:MySQL 5.7.2
  • 数据库图形工具:Navicat
  • 编译器:IDEA 2020.2
  • 服务器软件:Tomcat 9.0.38

涉及的Jar包:
①mysql-connector ---------JDBC连接MySQL数据库的驱动
②druid --------阿里巴巴的数据库连接池,能够重复利用数据库连接,提高对请求的响应时间和服务器的性能。
③commons-dbutils ---------Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
④fastjson --------阿里巴巴开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。
。。。。

(2)功能实现
(3)跨域问题的解决
Access-Control-Allow-Origin是HTML5中定义的一种解决资源跨域的策略。在filter类中实现。

3.3 算法

(1)软件库:opencv 3.42

(2)测量实现:灰度化,FLD算法获取直线,简单的筛选聚类,点的自动获取
(3)生成动态链接库:jni

3.4测试

(1)单元测试
工具包:Junit 4.12
测试类:

(2)接口测试:postman模拟前端

未完待续

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值