基于Open CV的植物图像分类识别项目

一、项目简介

1.主要内容

          本项目主要是基于Open CV进行植物图像进行分类识别。展示部分采用了网页的形式(Vue+Element+.net Core),由用户上传图片,服务器返回该图片的分类结果。Web服务(.net Core)和c++图像处理模块的交互采用了TCP的形式,即利用.net的TCP客户端和Qt的Tcp服务器端进行交互。最后是Qt的服务器端调用了c++的图像处理类,返回分类识别结果。有一点需要注意,进行图像处理前,先进行图像训练。

2.开发环境

         前端展示:Vue+element

         Web服务:.net Core

         TCP客户端:.net framework

它的版本号,我也没晓得用的哪个版本的,只要支持TcpClient就可以的。

         TCP服务端:Qt

Qt的版本号是5.12.0,记得要安装时要选择MSVC 32和64。

         图像处理模块:Open CV+ msvc

Open CV的版本是2.4.13.6,msvc就用刚刚装的那个

         其他:

前端模块开发面板用的是vue ui(可视化界面),如图2-1所示。项目安装的插件如图2-2所示和依赖如图2-3所示。编辑器是VSCode(最新版的就行)。配置过程不懂得,可以直接看https://www.bilibili.com/video/BV1EE411B7SU?p=18前几节内容。

                                               (图2-1 Vue 可视化界面)

                                              (图2-2  已安装的插件)

                                                               (图2-3 已安装的依赖)

Web服务和Tcp客户端是写在一块的,用的编辑器是VSCode,项目用dotnet去创建就好了,详细的可以看相关的创建过程。

配置不懂的可以看https://www.bilibili.com/video/BV11E411n74a?from=search&seid=16803251335123231391前半段视频。

Qt TCP客户端界面和mscv图像处理类用的编译器是VS 2019,配置过程详见https://www.jianshu.com/p/1db7fbe407f8

opencv的环境配置的详见https://blog.csdn.net/xinjiang666/article/details/80785210

3.效果演示

演示包括前端页面(如图3-1)、上传图片(如图3-2)、返回结果(如图3-3)、TCP服务端UI(如图3-4)

                                                                           (图3-1 前端页面)

                                                             (图3-2 上传图片)

                                               (图3-3 服务器返回的结果)

                                                                              (图3-4 TCP服务器端UI展示)

二、项目讲解

1.前端模块

//Vue 文件上传代码
<el-uploadclass="upload-demo"dragaction="http://localhost:5000/api/values":before-upload="beforeAvatarUpload":on-success="successUpload"multiple><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip" slot="tip">只能上传jpg文件,且不超过500kb</div>
</el-upload>

该段源码为Vue的文件上传代码,其中上传前回调beforeAvatarUpload()方法,成功后的回调使用了successUpload()方法。

beforeAvatarUpload (file) {const isJPG = file.type === 'image/jpeg'const isLt2M = file.size / 1024 / 1024 / 4 < 1if (!isJPG) {this.$message.error('上传图片只能是 JPG 格式!')}if (!isLt2M) {this.$message.error('上传图片大小不能超过 2MB!')}return isJPG && isLt2M},
successUpload (response, file, fileList) {this.$message({message: response.end,type: 'success'})
}

该段源码包含两个方法,分别是上传前回调,主要是验证图片类型和大小;成功后的回调,显示服务器返回的内容。

2.Web服务源码

public void ConfigureServices(IServiceCollection services){services.AddCors(option=>option.AddPolicy("cors", policy => policy.AllowAnyHeader().AllowAnyMethod().AllowCredentials().WithOrigins(new []{"http://localhost:8080"})));services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseCors("cors");app.UseMvc();}

上面的源码是配置跨域的源码

public async Task<IActionResult> Post(List<IFormFile> file){long size = file.Sum(f => f.Length);string fileName = "";foreach (var formFile in file){if (formFile.Length > 0){fileName = formFile.FileName.Substring(formFile.FileName.LastIndexOf("\\") + 1);var filePath = "F:/publicImages/" + fileName;using (var stream = new FileStream(filePath, FileMode.Create)){await formFile.CopyToAsync(stream);}}}String endStr = Connect("127.0.0.1", fileName);return Ok(new { fcount = file.Count, fsize = size, end=endStr});}

上面的源码时Web接口的源码,主要功能是接受客户端传输的文件,并保存在本地的F:/publicImages文件夹下,然后调用TCP客户端并返回结果。

static String Connect(String server, String message){try{// Create a TcpClient.// Note, for this client to work you need to have a TcpServer// connected to the same address as specified by the server, port// combination.Int32 port = 8001;TcpClient client = new TcpClient(server, port);// Translate the passed message into ASCII and store it as a Byte array.Byte[] data = System.Text.Encoding.UTF8.GetBytes(message);// Get a client stream for reading and writing.//  Stream stream = client.GetStream();NetworkStream stream = client.GetStream();// Send the message to the connected TcpServer.stream.Write(data, 0, data.Length);Console.WriteLine("byte: {0}",ByteArrayToHexString(data));Console.WriteLine("Sent: {0}", message);// Receive the TcpServer.response.// Buffer to store the response bytes.data = new Byte[256];// String to store the response ASCII representation.String responseData = String.Empty;// Read the first batch of the TcpServer response bytes.Int32 bytes = stream.Read(data, 0, data.Length);responseData = System.Text.Encoding.UTF8.GetString(data,0,bytes);Console.WriteLine("Received: {0}", responseData);// Close everything.stream.Close();client.Close();return responseData;}catch (ArgumentNullException e){Console.WriteLine("ArgumentNullException: {0}", e);}catch (SocketException e){Console.WriteLine("SocketException: {0}", e);}return "程序错误";}

上段源码时TCP客户端源码,主要功能时连接TCP服务端,等待接受数据,然后返回收到的结果。

3.Qt的TCP服务端demo

由于该demo的源码过多,不进行一一展示了,只进行部分展示,

//设置布局setLayout(mainLayout);//tcp服务端初始化server = new QTcpServer;serverSocket = new QTcpSocket;if (!server->listen(QHostAddress::AnyIPv4, quint16(serverPort))){qDebug() << serverPort << "端口被占用!请更换端口";return;}connect(server, SIGNAL(newConnection()), this, SLOT(serverNewconnected()));connect(serverSendButton, SIGNAL(clicked(bool)), this, SLOT(serverSendData()));//tcp客户端初始化clientSocket = new QTcpSocket;connect(clientConnectButton, SIGNAL(clicked()), this, SLOT(clientNewConnecting()));connect(clientDisConnectionButton, SIGNAL(clicked()), this, SLOT(clientDisConnecting()));connect(clientSendButton, SIGNAL(clicked(bool)), this, SLOT(clientSendData()));connect(clientSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(clientReadError(QAbstractSocket::SocketError)));//图像处理类初始化categorizer = new Categorizer;

上面的源码主要是设置界面的layout,然后进行服务端和客户端的初始化,还有图像处理类的初始化。

4.图像处理类

	//初始化Categorizer();//特征聚类void bulid_vacab();//构造BOWvoid compute_bow_image();//训练分类器void trainSvm();

上面的源码时图像进行训练的过程,详细讲解可以看https://blog.csdn.net/yincheng_917/article/details/82684337

string Categorizer::category_By_svm_file(string picturePath)
{//初始化SVMstor_svms = new CvSVM[categories_size];for (int i = 0; i < categories_size; i++){string svm_filename = string(DATA_FOLDER) + category_name[i] + string("SVM.xml");stor_svms[i].load(svm_filename.c_str());}//获取并初始化字典string vocab_filename = string(DATA_FOLDER) + string("vocab.yml");FileStorage fs;fs.open(vocab_filename, FileStorage::READ);fs["vocabulary"] >> vocab;bowDescriptorExtractor->setVocabulary(vocab);fs.release();//初始化图像Mat input_pic = imread(picturePath), gray_pic;cvtColor(input_pic, gray_pic, CV_BGR2GRAY);Mat test_pic = gray_pic;// 提取BOW描述子vector<KeyPoint>kp;Mat test;featureDecter->detect(test_pic, kp);cout << kp[0].size;bowDescriptorExtractor->compute(test_pic, kp, test);cout << test.cols;float best_score = -999;string prediction_category = "";for (int j = 0; j < categories_size; j++){float scoreValue = stor_svms[j].predict(test, true);float classValue = stor_svms[j].predict(test, false);float curConfjdence;int sjgn;sjgn = (scoreValue < 0.0f) == (classValue < 0.0f) ? 1 : -1;curConfjdence = sjgn * stor_svms[j].predict(test, true);cout << "测试图:" << picturePath << "在" << category_name[j] << "的成绩为:" << curConfjdence << "\n";if (curConfjdence > best_score){best_score = curConfjdence;prediction_category = category_name[j];}}cout << "测试图:" << picturePath << "最相似的是:" << prediction_category << "\n";Mat mat = imread(string(DATA_FOLDER) + prediction_category + "/1.jpg");
//    imshow(picturePath + "系统匹配图", mat);return prediction_category;
}

上面的源码是对测试图像进行测试的函数。首先是载入之前训练好的SVM数据并初始化、然后载入之前训练好的字典数据并初始化,然后提取该图片的BOW描述子,最后对每一类图像进行predive,并获取分最高的那个作为结果返回。

 

最后,所有源码和训练图像、测试图像、训练数据可见https://gitee.com/clove682/Plant_image_classification_and_recognition_project_based_on_open_CV.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29944.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RNA-seq——五、根据差异基因画火山图、在火山图上标记基因名

目录 1. 设置阈值来显示对应的基因名2. 指定基因名展示 写在前面——之前写的RNA-seq&#xff08;一到四&#xff09;是根据别人文章中提到的数据进行一系列分析的&#xff0c;但是找公司做的单细胞测序&#xff0c;一般不需要自己进行数据清洗之类的操作&#xff0c;公司会直接…

如何通过图片识别植物?识别植物软件有哪些?

想必大家都有这样的经历&#xff0c;当我们在外面散步时&#xff0c;看到一种美丽的植物&#xff0c;但是却不知道它的名字。现在&#xff0c;有一种神奇的技术可以帮助我们解决这个问题&#xff0c;那就是通过图片识别植物。现在你只需要拍下这种植物的照片&#xff0c;然后上…

识别各种花草植物是什么软件?这些识别软件可以帮你识别

小伙伴们平时要是在路边看到一些比较好看的花花草草时&#xff0c;会不会像我一样&#xff0c;特别好奇想知道这些花花草草叫什么吗&#xff1f;由于花花草草&#xff0c;很多都长得相似&#xff0c;只能靠文字来描述它们&#xff0c;很难知道它的身份。但其实我们可以借助一些…

基于分子对接与体外实验数据的一致性研究预测出槲皮素衍生物可以为α-Glucosidase 新的抑制剂

摘要&#xff1a;本文通过运用Discovery Studio中的CDOCKER方法&#xff0c;验证了α-Glucosidase 抑制剂与体外实验数据的一致性&#xff0c;并预测出槲皮素衍生物&#xff08;compound 7&#xff09;可以作为潜在α-Glucosidase 抑制剂的骨架分子并且具有治疗肥胖的作用。 分…

植物表型组学研究平台建设及技术应用

在生物学和遗传育种领域,表型是指构成生物体的全部特征&#xff0c;包括外观、基本维度、形态和颜色,是基因型和环境因素互相作用的结果。表型采集分析是指以定性和定量的方式测量这些特征。表型组(phenome)则是指某一生物的全部性状特征&#xff0c;不仅局限于农艺性状&#x…

教程 | 规模化物种同源基因分析 - orthofinder [上篇]

写在前面 基因组测序项目已然是几乎所有课题组都可以负担的水平。相比于几年前火爆的通过转录组测序挖掘生物学问题策略&#xff0c;通过基因组&#xff0c;尤其是比较基因组分析&#xff0c;往往可以给我们带来更多确定性结果&#xff0c;如相比于近源物种A为何物种B的果皮更…

部分植物基因组数据库汇总

牛年大吉 植物基因组数据库&#xff1a;1、NCBI中的genome&#xff0c;直接下载NCBI上的基因组文件 ftp://ftp.ncbi.nlm.nih.gov/genomes/ 2、植物基因组数据库&#xff08;包含约30个左右的植物&#xff0c;具体查看:&#xff09; 30个左右植物基因组对应列表下载 http://www.…

【4】RagTag-基于近缘/同物种的基因组同源组装

RagTag简介 RagTag可以进行错误组装校正、scaffold组装和修补、scaffold合并等&#xff0c;一共分四步&#xff1a;correct&#xff0c;scaffold&#xff0c;patch&#xff0c;merge。之后&#xff0c;可以用Liftoff进行基因注释。 RagTag的conda安装 conda install -c bioco…

iMeta | 兰大张东等使用PhyloSuite进行分子系统发育及系统发育树的统计分析

点击蓝字 关注我们 使用PhyloSuite进行分子系统发育及系统发育树的统计分析 iMeta主页&#xff1a;http://www.imeta.science 方 法 ● 原文链接DOI: https://doi.org/10.1002/imt2.87 ● 2023年2月16日&#xff0c;兰州大学张东团队在 iMeta 在线发表了题为“Using PhyloSuit…

易基因|植物育种:ChIP-seq(组蛋白)揭示H3K36me修饰影响温度诱导的植物可变剪接和开花

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2017年&#xff0c;荷兰瓦格宁根大学分子实验室RGH Immink团队以“Histone H3 lysine 36 methylation affects temperature-induced alternative splicing and flowering in plants”在《…

Kaggle图像识别竞赛 Plant Seedlings Classification(植物幼苗分类)具体实现

目录 0. 前言1. 总体设计2. import部分3. 具体实现步骤一、数据预处理&#xff08;一&#xff09;均衡化&#xff08;二&#xff09;提取图片中叶子&#xff08;绿色&#xff09;的部分 二、提取特征&#xff08;一&#xff09;SIFT提取关键点&#xff08;二&#xff09;BOW(Ba…

易基因:禾本科植物群落的病毒组丰度/组成与人为管理/植物多样性变化的相关性 | 宏病毒组

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 现代农业通过简化生态系统、引入新宿主物种和减少作物遗传多样性来影响植物病毒的出现。因此&#xff0c;更好理解农业生态中种植和未种植群落中的病毒分布&#xff0c;以及它们之间的病…

植物激素基因高级分析来啦~

很多植物转录组学文章中&#xff0c;都有整合激素相关基因和表达数据的pathway图&#xff0c;直观地展示通路及其中重要基因的位置和功能。 植物激素&#xff08;Phytohormone&#xff09;亦称植物天然激素或植物内源激素&#xff0c;是指植物体内产生的一些微量而能调节&…

⁡⁡‍⁤⁡⁣⁢‍⁢​​‌​⁡⁡ ​​‍⁡⁢⁤⁡​⁤‍​⁣​⁤‌‍⁤⁢​⁤ ​ ⁢ ​⁡⁣GPT/AIGC/LLM/NLP/ChatGPT学习资料汇总(互联网活菩萨)

一些群友写的文档&#xff0c;干货很多 有关 ⁡⁡‍⁤⁡⁣⁢‍⁢​​‌​⁡⁡&#xfeff;​​‍⁡⁢⁤⁡​⁤‍​⁣​⁤‌‍⁤⁢​⁤&#xfeff;​&#xfeff;⁢&#xfeff;​⁡⁣GPT/AIGC/LLM/NLP/ChatGPT &#xff0c;干货很多&#xff0c;原幕布的产品负责。 https://go…

大学生问AI

大学生问AI 写在最前面2&#xff0c;描述你在学习工作中碰到的最高级的 AI 是什么&#xff1f;1&#xff0c;你人生中第一次接触到 “人工智能” 的概念和产品是什么&#xff1f; 让你觉得 “人类做得东西的确有智能”&#xff1f;3&#xff0c;你听说过最近的 GPT&#xff0c;…

#41 AI-002-十分钟理解ChatGPT的技术逻辑及演进(前世 、今生)

#41 AI-002-十分钟理解ChatGPT的技术逻辑及演进&#xff08;前世、今生&#xff09; 目录 目录0、 前言1、什么是GPT2、GPT之技术演进时间线3、GPT之T-Transformer(2017) 3.1、重点在好&#xff0c;还是重点在人&#xff1f;3.2、对不起&#xff0c;你是个好人3.3、回归正题&am…

渗透测试part(二):Vulnhub配置(以EMPIRE: BREAKOUT为例)

注&#xff1a;哈尔滨工程大学-渗透测试-2020065122 -0.21 在part&#xff08;一&#xff09;中&#xff0c;简要介绍了渗透测试的基本概念&#xff0c;并在第七部分提及了Vulnhub靶场。本文主要针对Vulnhub靶场的配置以及攻击机Kali的配置进行说明&#xff0c;希望能够帮助大…

腾讯云发布5G远程驾驶云;中国电信发布通用视觉大模型2.0;Meta推新语言模型Toolformer丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 腾讯云联合中国联通宁夏、福建分公司发布5G远程驾驶云 4月28日&#xff0c;在第六届数字中国建设峰会上&#xff0c;腾讯云携手中国联通宁夏、福建两省区分公司&#xff0c;首次对外发布了“基于闽宁云的5G远程…

互联网晚报 | 一季度全国居民人均可支配收入10870元;郑渊洁称维权艰难将不再发表作品;苹果版余额宝上线,年利率4.15%...

国家统计局&#xff1a;一季度全国居民人均可支配收入10870元&#xff0c;比上年同期名义增长5.1% 据国家统计局官网&#xff0c;一季度&#xff0c;全国居民人均可支配收入10870元&#xff0c;比上年同期名义增长5.1%&#xff0c;扣除价格因素&#xff0c;实际增长3.8%。分城乡…

世界上首条主要为互联网服务的海底光缆开通 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 3 月 7 日&#xff0c;在 1765 年的今天&#xff0c;法国发明家约瑟夫涅普斯&#xff08;Joseph Niepce&#xff09;出生。涅普斯是拍摄了现存最早照片的人&…