计算机毕业设计 机器视觉害虫种类及数量检测系统(源码+论文)

本文主要是介绍计算机毕业设计 机器视觉害虫种类及数量检测系统(源码+论文),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0 项目说明
  • 1 研究目的
  • 2 研究内容及结论
  • 3 文件介绍
  • 4 论文目录
  • 5 项目源码


0 项目说明

基于机器视觉的害虫种类及数量检测

提示:适合用于课程设计或毕业设计,工作量达标,源码开放

项目分享:

https://gitee.com/asoonis/feed-neo


1 研究目的

研究的目的在于建立一套远程病虫害自动识别系统,有助于缓解农业植保人员和病虫害鉴定专家的人力资源紧张,有助于病虫害知识有限的农业人员进行及时的病虫害检测,并且,通过害虫种类数目的监测和信息收集,定期对昆虫数据进行整理和分析,建立病虫害爆发的规律模型,进而预测判断病虫害爆发的时间,及时通知农业植物保护人员和农户进行合理地科学地预防。提高农作物产量和质量。

2 研究内容及结论

(1) 设计实现了一套可适用于野外的害虫捕获和图像采集装置。该装置放置在农业种植区域,24 小时进行害虫的诱杀和图像采集,同时,装置可以通过无线网络将害虫图像上传至农业监控中心虫类鉴别服务器,并进行害虫种类的识别,进行产区内害虫种类数目的信息收集。

(2) 开发了一套基于机器视觉的昆虫计数工作方法。开发了一套的适用于苍蝇粘板等包含多数昆虫设备的图像的基于机器视觉的昆虫计数工作方法。该方法首先对包含多数昆虫的图片进行二值化预处理,然后进行轮廓的查找,并进行轮廓的计数,得到的数目反映了图片中的昆虫数目的数量级。该方法适用于苍蝇粘板图像等包含多数昆虫虫体的图像上。

(3) 开发了一套基于机器视觉的昆虫识别工作方法和流程。该方法在参考已有研究成果的基础山,选取了昆虫形态特征中的昆虫矩形度、昆虫延长度、昆虫圆形度、昆虫球状性、昆虫叶状性等 5 个特征,进行昆虫图像的特征提取。之后,采用逻辑斯蒂回归模型、线性 SVM 模型和 K 邻近分类器分别进行训练,并测试比较训练结果,以进行分类器算法的筛选。该方法适用于本套图像采集装置。

(4) 设计了一套远程害虫自动识别系统。结合上述三个功能,该系统可以实现:在图像采集节点进行害虫捕获和昆虫图像采集,在虫类鉴别服务器进行昆虫图像的识别和分类。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 文件介绍

用户界面
MainWindow.ui———————–PyQtDesigner设计的主界面文件
MainWindow.py———————-PyUIC转换而成的主界面程序

运行逻辑
VideoMainWindow.py————–PyQt结合OpenCV实现在界面中显示视频画面
PreProcess.py————————-对源数据样本进行预处理

特征提取
P_circle.py——————————似圆度
P_extend.py—————————-延长度
P_leaf.py——————————–叶状性
P_rect.py——————————–矩形度
P_spherical.py————————球形度
GetFeatures.py———————–提取特征的模块
GetFiveFeatures.py—————–五个特征提取的测试代码
FeatureExtract.py——————-提取样本库特征保存到CSV文件

机器学习模块
LinearSVM.py————————-线性SVM分类器的训练和模型保存
LinearRegression.py—————逻辑回归分类器的训练和模型保存
KneiborsClassfier.py—————KNN分类器的训练和模型保存
Predict.py——————————加载预训练模型,对特征进行预测
Thresholding.py—————————大津法程序实现和OpenCV大津法函数的效果对比
Count.py————————————-实现加载图片,二值化(大津法),查找轮廓进行计数的效果
GetChineseName.py——————–分类中英文转换

4 论文目录

摘 要 
ABSTRACT 
目 录 
第 1 章 绪论 
1.1 课题研究的背景和意义
1.2 国内外研究现状 
1.2.1 国内研究现状 
1.2.2 国外研究现状 
1.3 研究的内容和目的
1.3.1 研究内容 
1.3.2 研究目的 
1.4 章节安排 
第 2 章 系统总体设计 
2.1 系统设计目标 
2.2 系统总体架构 
2.3 图像采集节点 
2.3.1 装置总体设计 
2.3.2 运行流程 
2.4 虫类鉴别服务器和虫类信息数据库设计
2.4.1 服务器设计 
2.4.2 服务器虫类分类器实现 
2.4.3 PC 上的昆虫分类识别软件 
第 3 章 昆虫图像预处理与计数研究
3.1 昆虫图像的采集 
3.2 昆虫图像的预处理 
III3.2.1 图像的灰度化,高斯滤波和尺度变换
3.2.2 二值化 
3.2.3 大津法 OTSU 在昆虫图像二值化上的应用 
3.3 昆虫图像的计数
3.3.1 检测轮廓 
3.3.2 昆虫计数 
第 4 章 昆虫图像特征提取与识别研究 
4.1 特征的选取 
4.2 特征描述以及提取方式
4.3 分类器的选择和训练
4.4 机器学习结果分析 
4.4.1 性能评价指标 
4.4.2 三种分类器的性能比较 
第 5 章 总结与展望 
5.1 总结 
5.1.1 完成的工作
5.1.2 创新点和不足之处 
5.2 展望 
致谢

5 项目源码

# coding=utf-8
# 先读图,然后二值化,
# 延长度import cv2
import math
import numpy as np
from matplotlib import pyplot as plt#  此处读入图片,作为接口
origin = cv2.imread('dataset/fly6.jpg')
grayimage = cv2.imread('dataset/fly6.jpg', 0)#  高斯滤波
blur = cv2.GaussianBlur(grayimage, (5, 5), 0)#  二值化:用大津法,此处选项若是THRESH_BINARY_INV,则同意选用白色背景的图片样本
ret, otsu = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 找轮廓
contours = cv2.findContours(otsu, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 轮廓集数目largest_area = 0
largest_contour_index = 0
num = len(contours[1])
for i in range(num):area = cv2.contourArea(contours[1][i], False)if area > largest_area:largest_area = arealargest_contour_index = imaxContour = contours[1][largest_contour_index]
# 画轮廓
cv2.drawContours(origin, maxContour, -1, (0, 0, 255), 2)
print "最大面积" + str(largest_area)# 质心计算
M = cv2.moments(maxContour)
Centroid_x = int(M['m10'] / M['m00'])
Centroid_y = int(M['m01'] / M['m00'])
print "质心" + str(Centroid_x) + " " + str(Centroid_y)
cv2.circle(origin, (Centroid_x, Centroid_y), 8, (255, 255, 255), -1)# 获取长轴
Major_Axis_Length = 0
Major_Axis_Angle = 0
Major_Axis_End_x = 0
Major_Axis_End_y = 0
Major_Axis_Begin_x = 0
Major_Axis_Begin_y = 0# 此处需要注意质心是否在轮廓内
# 找长轴
for angle in range(180):theta = angle * 3.14 / 180.0lengthBackward = 0lengthForward = 0point_End_x = Centroid_xpoint_End_y = Centroid_ypoint_Begin_x = Centroid_xpoint_Begin_y = Centroid_y# 步进越小准确率越高,设置成1可以先找到准确的直线角度,再根据角度和质心得到的直线计算出正确的长轴和轮廓交点while cv2.pointPolygonTest(maxContour, (point_End_x, point_End_y), False) > 0:lengthForward = lengthForward + 0.1point_End_x = int(round(point_End_x + lengthForward * math.cos(theta)))point_End_y = int(round(point_End_y + lengthForward * math.sin(theta)))while cv2.pointPolygonTest(maxContour, (point_Begin_x, point_Begin_y), False) > 0:lengthBackward = lengthBackward + 0.1point_Begin_x = int(round(point_Begin_x - lengthBackward * math.cos(theta)))point_Begin_y = int(round(point_Begin_y - lengthBackward * math.sin(theta)))if lengthForward + lengthBackward >= Major_Axis_Length:Major_Axis_Length = lengthForward + lengthBackwardMajor_Axis_Angle = angleMajor_Axis_End_x = point_End_xMajor_Axis_End_y = point_End_yMajor_Axis_Begin_x = point_Begin_xMajor_Axis_Begin_y = point_Begin_y# 计算实际长轴长度
Real_Major_Axis_Length = math.sqrt(math.pow((Major_Axis_End_x - Major_Axis_Begin_x), 2) + math.pow((Major_Axis_End_y - Major_Axis_Begin_y), 2))Real_Major_Axis_Length = round(Real_Major_Axis_Length, 1)
print "长轴长度 = " + str(Real_Major_Axis_Length)
print "长轴角度 = " + str(Major_Axis_Angle)
# print "起点 = " + "x: " + str(Major_Axis_Begin_x) + "  y: " + str(Major_Axis_Begin_y)
# print "起点 = " + "x: " + str(Major_Axis_End_x) + "  y: " + str(Major_Axis_End_y)# 画长轴
cv2.line(origin, (Major_Axis_Begin_x, Major_Axis_Begin_y), (Major_Axis_End_x, Major_Axis_End_y), (255, 0, 0), 2)# 找短轴
# 1. 先得到长轴直线的表达式y=k*x+b,用来计算点到直线距离和判断点在直线上方还是下方
Major_Axis_k = math.tan(Major_Axis_Angle * 3.14 / 180.0)
Major_Axis_b = Centroid_y - Major_Axis_k * Centroid_x# 2. 点(x0,y0)到直线(Ax+By+C=0)的距离为d =abs (A*x0+B*y0+C)/sqrt(A^2+B^2)
Minor_Axis_A = Major_Axis_k
Minor_Axis_B = -1
Minor_Axis_C = Major_Axis_b# 3. 遍历轮廓上的点
Minor_Axis_Under_length = 0
Minor_Axis_Above_length = 0
Minor_Axis_Under_End_x = 0
Minor_Axis_Under_End_y = 0
Minor_Axis_Above_End_x = 0
Minor_Axis_Above_End_y = 0# 轮廓点集
ContourItems = maxContour.shape[0]
for item in range(ContourItems):point_x = maxContour[item][0][0]point_y = maxContour[item][0][1]# 判断点在直线哪一侧# 上侧if point_y > int(Major_Axis_k * point_x + Major_Axis_b):# 点到直线距离dis = abs((Minor_Axis_A * point_x + Minor_Axis_B * point_y + Minor_Axis_C) / math.sqrt(Minor_Axis_A * Minor_Axis_A + Minor_Axis_B * Minor_Axis_B))if dis >= Minor_Axis_Above_length:Minor_Axis_Above_length = disMinor_Axis_Above_End_x = point_xMinor_Axis_Above_End_y = point_y# 下侧elif point_y < int(Major_Axis_k * point_x + Major_Axis_b):# 点到直线距离dis = abs((Minor_Axis_A * point_x + Minor_Axis_B * point_y + Minor_Axis_C) / math.sqrt(Minor_Axis_A * Minor_Axis_A + Minor_Axis_B * Minor_Axis_B))if dis >= Minor_Axis_Under_length:Minor_Axis_Under_length = disMinor_Axis_Under_End_x = point_xMinor_Axis_Under_End_y = point_y# 第三种可能就是轮廓与直线的交点# # 标记两个点,可以忽略
cv2.circle(origin, (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y), 4, (255, 255, 255), -1)
cv2.circle(origin, (Minor_Axis_Under_End_x, Minor_Axis_Under_End_y), 4, (255, 255, 255), -1)
# 画出两点直线
cv2.line(origin, (Minor_Axis_Under_End_x, Minor_Axis_Under_End_y), (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y),(0, 255, 255), 3)# 计算实际短轴长度
Real_Minor_Axis_Length = math.sqrt(math.pow((Minor_Axis_Above_End_x - Minor_Axis_Under_End_x), 2) + math.pow((Minor_Axis_Above_End_y - Minor_Axis_Under_End_y), 2))Real_Minor_Axis_Length = round(Real_Minor_Axis_Length, 1)
print "短轴长度 = " + str(Real_Minor_Axis_Length)P_extend = Real_Minor_Axis_Length * 1.0 / Real_Major_Axis_Length
P_extend = round(P_extend, 3)print "延长度 = " + str(P_extend)
# 画出与长轴距离最远的两点的辅助线,使用时可以不用,画图用作论文使用
# 画出长轴右方
line_above_k = math.tan((Major_Axis_Angle - 90) * 3.14 / 180.0)
line_above_b = Minor_Axis_Above_End_y - line_above_k * Minor_Axis_Above_End_x
Minor_Axis_Above_Begin_x = int((line_above_b - Major_Axis_b) / (Major_Axis_k - line_above_k))
Minor_Axis_Above_Begin_y = int(line_above_k * Minor_Axis_Above_Begin_x + line_above_b)
cv2.line(origin, (Minor_Axis_Above_Begin_x, Minor_Axis_Above_Begin_y), (Minor_Axis_Above_End_x, Minor_Axis_Above_End_y),(255, 0, 255), 3)line_under_k = math.tan((Major_Axis_Angle - 90) * 3.14 / 180.0)
line_under_b = Minor_Axis_Under_End_y - line_under_k * Minor_Axis_Under_End_x
Minor_Axis_Under_Begin_x = int((line_under_b - Major_Axis_b) / (Major_Axis_k - line_under_k))
Minor_Axis_Under_Begin_y = int(line_under_k * Minor_Axis_Under_Begin_x + line_under_b)
cv2.line(origin, (Minor_Axis_Under_Begin_x, Minor_Axis_Under_Begin_y), (Minor_Axis_Under_End_x, Minor_Axis_Under_End_y),(255, 255, 0), 3)cv2.putText(origin, 'Major_Axis : ' + str(Real_Major_Axis_Length), (280, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 155), 2, cv2.LINE_AA)
cv2.putText(origin, 'Minor_Axis : ' + str(Real_Minor_Axis_Length), (280, 85), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 155), 2, cv2.LINE_AA)
cv2.putText(origin, 'P_Rect: ' + str(P_extend), (280, 120), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 155), 2, cv2.LINE_AA)# 显示
cv2.namedWindow('Butterfly', cv2.WINDOW_AUTOSIZE)
cv2.imshow('Butterfly', origin)
cv2.imwrite('picture/p-extend.png',origin)k = cv2.waitKey(0)# 'ESC'
if k == 27:cv2.destroyAllWindows()

项目分享:

https://gitee.com/asoonis/feed-neo

这篇关于计算机毕业设计 机器视觉害虫种类及数量检测系统(源码+论文)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/316499

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X