使用OpenCV中的分类器和颜色识别的苹果位置识别

使用OpenCV中的分类器和颜色识别的苹果位置识别

    • 环境配置和安装
    • 拍摄并处理样本
    • 生成正样本的描述文件pos.vec
    • 开始训练分类器
    • 单目测距
    • 完成分类器与颜色识别,轮廓提取算法的结合
    • 运行结果图片展示
    • 我的代码,训练分类器的文件夹下载

这是我本科毕业设计中的软件项目,看到目前本博客中还暂无既使用OpenCV级联分类器又使用颜色是被边缘检测的项目,本来想对目标水果——苹果做实例分割的,迫于硬件条件唯数不多的计算资源被研究生占用了,无奈只好使用OpenCV级联分类器和颜色识别边缘检测来模拟实例分割并输出苹果的坐标。

废话少说让我们开始吧。
.
.

环境配置和安装

.
.
OpenCV :需要安装文件夹中有 训练样本.exe和 训练级联分类器.exe两个文件的版本,我安装的 OpenCV 4.5.2版本有这两个文件,此版本在https://opencv.org/releases/网站去下载
编译器使用 Pycharm 2021.1.1 (Pycharm的版本影响不大,Jetbrain官网下最新的就行)
在Pycharm中Package中安装必要的Python包,进入Pycharm中Python Interpreter,安装下图中的包:在这里插入图片描述

去官网下载到opencv-3.4.14-xxxxxx.exe后安装到D://opecv即可,随后在D目录下新建一个文件夹用于后续训练分类器的样本存储,模型存储等,我的训练文件夹命名为train_example,随后将D:/opencv/build/x64/vc15/bin文件夹中的
opencv_createsamples.txt和 opencv_traincascade.exe文件拷贝到D:/train_example文件夹内,
并在该文件夹中新建3个空文件夹:posdata , negdata ,xml
分别用来存储训练的正样本图片集,负样本图片集和训练出来的模型。
在这里插入图片描述

准备工作到此结束。
.

拍摄并处理样本

.
Opencv中自带的级联分类器是opencv自带的一个训练好的,用于识别人脸的模型。但是opencv留了两个.exe文件用于给用户训练自己的识别模型。

1)正样本的拍摄:我的项目是识别苹果,所以需要拍摄大约1000张各个场景下的苹果的照片
使用QQ影音,图片工厂,或者Python脚本来处理样本图片为40*40,灰度化,并从1开始命名。
在这里插入图片描述
在文件夹内运行cmd,输入dir /b>pos.txt,生成所有文件的目录索引。
新建一个Python脚本,给生成的pos.txt文件每一行后面加上 1 0 0 40 40,意义为:1代表文件,0 0 40 40代表从(0,0)到(40,40)读取图片,处理文件的Python脚本如下:

import os
import numpy as npwith open("D:\\train_example\\posdata\\pos.txt") as txt:content = txt.readlines()  # 读全部行txt.close()
lines = np.array(content)  # 转换成array 类型
num_of_instances = lines.size  # 整个txt的行数
print("number of instances: ", num_of_instances)
list = []
for i in range(0, num_of_instances):name, label = lines[i].split("\n")list.append(name + " 1 0 0 40 40\n" + label)  # 统一每行加字符串"_aligned.
with open("D:\\train_example\\posdata\\pos1.txt", 'w')as F:F.writelines(list)  # 写入到另一个txt文件中F.close()

2)负样本的拍摄训练:任何画面中不包含识别物体的图片都可以作为训练的负样本。
我业余爱好摄影,直接从相机卡里考出大约3000张图片即可作为负样本,使用图片工厂,QQ图像等软件把图片分辨率降为500*500以下
在这里插入图片描述
同样,在该文件夹内使用dir /s/b >neg.txt,生成负样本中每个图片的路径
在这里插入图片描述

.

生成正样本的描述文件pos.vec

.
在项目文件夹(即D:/train_example目录下)运行cmd

opencv_createsamples.exe -vec pos.vec -info posdata\pos.txt -bg negdata\neg.txt -w 40 -h 40 -num 1000

将会在项目文件夹目录内生成pos.vec描述文件,并且告诉系统正样本集的目录和负样本的目录文件 posdata.txt与negdata.txt, 图片尺寸40*40像素,数量1000

.
.

开始训练分类器

.
.
在项目文件夹中(D://train_example文件夹下)运行cmd
输入

opencv_traincascade.exe -data xml -vec pos.vec -bg negdata\neg.txt -numPos 900 -numNeg 3000 -numStages 20 -w 40 -h 40 -minHitRate 0.9999 -maxFalseAlarmRate 0.5 -mode ALL

接下里就等着运行结果吧,别待机电脑
在这里插入图片描述
训练完成,接下来可以试试训练的结果如何,在Pycharm中新建一个train_test.py文件
用以下代码测试下分类器的分类效果:

import cv2
# 加载训练好的分类器
faceCascade = cv2.CascadeClassifier("cascade.xml")
faceCascade.load('D:\\train_example\\xml\\cascade.xml')cap = cv2.VideoCapture(0)
while True:ret, frame = cap.read()img = frame.copy()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)rect = faceCascade.detectMultiScale(gray,scaleFactor=1.15,minNeighbors=3,minSize=(3,3),flags = cv2.IMREAD_GRAYSCALE)for (x, y, w, h) in rect:cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.imshow('frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()

正常的话,对视频内的目标结果如下:
在这里插入图片描述
.
.

单目测距

.
.
由于本毕设项目需要获得苹果的三维坐标,还差一个苹果到摄像头的距离,由于使用了单相机,无法通过视差获取深度,原理为小孔成像的相似三角形,即需要知道自己使用的相机单个像素大小,详情可以见本CSDN博客:

https://blog.csdn.net/ikoiiii/article/details/85219059?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162616414516780265454688%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162616414516780265454688&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-85219059.pc_search_result_cache&utm_term=opencv%E5%8D%95%E7%9B%AE%E6%B5%8B%E8%B7%9D&spm=1018.2226.3001.4187

那么我的相机是1/2.3的底,查上述博客的表中得到单个像素是0.0008厘米,焦距写在相机外壳上为6mm,苹果的大小(直径)大约为60mm-80mm,我计算距离时取得是70mm。
.
.

完成分类器与颜色识别,轮廓提取算法的结合

.
.
对于复杂的画面,直接使用颜色识别,轮廓识别,会出现很多错误的目标,不妨使用分类器先将目标区域识别出来,再对目标区域进行颜色过滤,轮廓识别,获取到多个目标的轮廓再使用Circle()函数把获取到的目标框起来获得圆心的坐标。

import cv2
import numpy as np
faceCascade = cv2.CascadeClassifier("cascade.xml")# 加载训练好的分类器
faceCascade.load('D:\\train_example\\xml\\cascade.xml')
unit_pixel=0.0008
f=0.6
red_lower = np.array([0, 10, 50])
red_upper = np.array([20, 255, 255]) #设置过滤出苹果颜色的两个阈值,色彩模型是HSV 不是RGB
cap = cv2.VideoCapture(1) #外接相机为1,电脑自带相机为0,多接几个相机数字可以自己调
while True:ret, frame = cap.read()ROI = np.zeros(frame.shape, np.uint8)img = frame.copy()data = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],])# cv2.putText(draw2, 'biggest_apple_distance:', (0, 20), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 2)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)rect = faceCascade.detectMultiScale(gray,scaleFactor=1.15,minNeighbors=3,minSize=(3, 3),flags=cv2.IMREAD_GRAYSCALE)for (x, y, w, h) in rect:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)cv2.rectangle(ROI, (x,y), (x+w,y+h), (255, 255, 255), thickness=-1)imgroi = ROI & img #将分类器获取到的目标的矩形框内容保留,画面中剩下的# cv2.putText(frame, 'Target', (target_x, target_y), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 0), 2)hsv = cv2.cvtColor(imgroi, cv2.COLOR_BGR2HSV)# 设置阈值,去除背景 保留所设置的颜色mask = cv2.inRange(hsv, red_lower, red_upper)# ret, thresh = cv2.threshold(dilation, 150, 255, cv2.THRESH_BINARY)  # 阈值处理 二值化 用150不用255是因为有些细胞就直接变白thresh1 = cv2.GaussianBlur(mask, (3, 3), 0)  # 高斯滤波contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours1=[]for i in contours:# area.append(cv2.contourArea(i))# print(area)if cv2.contourArea(i) > 10000:  # 计算面积 去除面积小的 连通域contours1.append(i)# 以上使用面积去除小面积连通域, 参考CSDN中显微镜细胞项目# 以下是使用线条长度进行筛选min_size = 200delete_list = []for i in range(len(contours1)):if (cv2.arcLength(contours1[i], True) < min_size):delete_list.append(i)k=0for cont in contours1:(x,y), radius = cv2.minEnclosingCircle(cont)data[0][k]=radiusdata[1][k]=int(x)data[2][k]=int(y)cv2.circle(imgroi,(int(x),int(y)),int(radius),(0,255,255),10)k=k+1data.T[np.lexsort(data[::-1, :])].T# print("最大的苹果的距离为:%d" % banjin[0])width=data[0][0]*unit_pixeldistance=7*f/widthtarget_x=data[1][0]target_y=data[2][0]# for i, j in zip(contours, range(len(contours))):#     M = cv2.moments(i)#     cX = int(M["m10"] / M["m00"])#     cY = int(M["m01"] / M["m00"])#     draw = cv2.putText(imgroi, str(j + 1), (cX, cY), 5, 5, (255, 0, 255), 5)draw2 = cv2.circle(imgroi.copy(), (target_x, target_y), data[0][0], (255, 255, 255), -1)cv2.line(draw2, (0, target_y), (target_x, target_y), (255, 0, 0), 3)cv2.line(draw2, (target_x, 0), (target_x, target_y), (255, 0, 0), 3)cv2.line(draw2, (target_x, target_y), (640, target_y), (255, 0, 0), 3)cv2.line(draw2, (target_x, target_y), (target_x, 480), (255, 0, 0), 3)cv2.putText(draw2, 'biggest_apple_distance:', (0, 20), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 2)cv2.putText(draw2, 'And_its_coordinate_is::', (0, 90), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 2)cv2.putText(draw2, 'Target', (target_x, target_y), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 0), 2)distance_display = "% .2f cm" % distancetarget_x_display = "% .0f , " % target_xtarget_y_display = "% .0f " % target_ycv2.putText(draw2, distance_display, (40, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)cv2.putText(draw2, target_x_display, (40, 120), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)cv2.putText(draw2, target_y_display, (120, 120), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)# cv2.putText(draw2, target_x_display, (half_target_x, target_y), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)# cv2.putText(draw2, target_y_display, (target_x, half_target_y), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)draw2 = cv2.putText(draw2, target_x_display, (int(target_x / 2), int(target_y)), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(255, 0, 0), 2)draw2 = cv2.putText(draw2, target_y_display, (int(target_x), int(target_y / 2)), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(255, 0, 0), 2)cv2.imshow('ROI_image', imgroi)cv2.imshow('frame_with_rectangle', frame)cv2.imshow('Original_from_camera', img)cv2.imshow('target', draw2)if cv2.waitKey(1) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()

.
.

运行结果图片展示

.
.
最终运行结果如下:

在这里插入图片描述
.
.

我的代码,训练分类器的文件夹下载

.
.

已上传百度网盘

链接:https://pan.baidu.com/s/1S7wXacR8qolPSqACd3wosA
提取码:0000

.
.

本文组织架构

    • 环境配置和安装
    • 拍摄并处理样本
    • 生成正样本的描述文件pos.vec
    • 开始训练分类器
    • 单目测距
    • 完成分类器与颜色识别,轮廓提取算法的结合
    • 运行结果图片展示
    • 我的代码,训练分类器的文件夹下载


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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB红苹果提取(颜色分割)

&#xff08;1&#xff09;将已知图像进行消噪处理 &#xff08;2&#xff09;对彩色图像进行目标和背景分析 &#xff08;3&#xff09;通过颜色将图像进行分割 &#xff08;4&#xff09;进行形态学处理&#xff0c;提取目标 看了一下这几个博客&#xff0c;重要的是要得到…

什么是时间复杂度?

时间复杂度定义&#xff1a;在计算机科学中&#xff0c;时间复杂性&#xff0c;又称时间复杂度&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间。这是一个代表算法输入值的的长度的函数。时间复杂度常用大O符号表述&#xff0c;不包括这个函数的…

AI Canon精选资源清单;带AI功能的PS安装文件与教程;讯飞星火10月对标 ChatGPT;直播换脸工具盘点 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; AI Canon&#xff1a;人工智能精选资源清单 思维导图 ShowMeAI知识星球资源编码&#xff1a;R106 AI Canon 是由美国著名的风投机构 …

网络攻防技术--论文阅读--《基于自动数据分割和注意力LSTM-CNN的准周期时间序列异常检测》

英文题目&#xff1a;Anomaly Detection in Quasi-Periodic Time Series based on Automatic Data Segmentation and Attentional LSTM-CNN 论文地址&#xff1a;Anomaly Detection in Quasi-Periodic Time Series Based on Automatic Data Segmentation and Attentional LST…

Mybatis学习(狂神)

文章目录 前言1、 Mybatis简介1.1、什么是MyBatis1.2 、持久化1.3、持久层1.4、为什么需要Mybatis 2、MyBatis第一个程序2.1、源码演示2.2、可能遇到的问题 3、CRUD操作3.1、namespace3.2、select3.3、insert3.4、update3.5、delete3.6、使用Map3.7、模糊查询 4、配置解析4.1、…

近期很火的PHOTOSHOP特效教程集合

身为设计师&#xff0c;应该经常给自己充充电(最近一直在忙一下家里的事情&#xff0c;首先得忏悔一下~哈哈哈~~) 比如临摹一些优秀作品或学习最新流行的Photoshop教程&#xff0c;这样的话你可以从中获得一些新的设计技巧及提高自身的设计能力。 今天为了弥补这几天荒废的时间…

高级特效-PS多边形特效/Photoshop特效/动态人像速成 [精品推荐]

课程目标 学习本课程&#xff0c;你可以学会简单的屏幕录制&#xff0c;也可以快速的制作出流行的PS多边形特效&#xff0c;不再需要用PS软件一个一个的绘制多边形&#xff0c;就能制作出各种酷炫且超有质感的画面。随便拿出一个素材&#xff0c;就能瞬间生成PS多边形特效。 适…

ps入门教程高阶教程各工作领域视频教程合集

PS在工作中的运用非常之广泛&#xff0c;在这里推荐一些系统的PS教程大家&#xff0c;从初级到进阶教程&#xff0c;涉及不同的职业或者岗位&#xff0c;学习起来更方便和系统。      ps高清视频教程入门到精通&#xff1a;zhpsjc.top      PS教程及其在行业中的运用  …

PS|如何制作出‘粒子消失特效’的效果呢

欢迎点击「算法与编程之美」↑关注我们&#xff01; 本文首发于微信公众号&#xff1a;"算法与编程之美"&#xff0c;欢迎关注&#xff0c;及时了解更多此系列文章。 欢迎加入团队圈子&#xff0c;与作者面对面&#xff0c;直接点击&#xff01; 说起灭霸的‘响指’&…

【有利可图网】PS教程:用PS合成立体特效的穿插照片效果

把人物和背景融为一体&#xff0c;使人物从照片中穿出来&#xff0c;这种想法是不是很神奇&#xff0c;这种操作在我们的PS软件里就可以实现&#xff0c;人物与背景的穿插效果&#xff0c;相信很多同学们都喜欢&#xff0c;具体如何制作&#xff0c;相信同学们很好奇&#xff0…

ps教程分享:一定要记住这20种PS技术!

一定要记住这20种PS技术&#xff01;会让你的照片美的不行&#xff01; 一种简单的数码照片后期润饰 1&#xff09;打开图片,执行色像/饱和度&#xff08;-40&#xff09;降低饱和度。 2&#xff09;新建一图层&#xff0c;将图层模式改为柔光&#xff0c;用画笔工具将需要润…

保姆级PS教程:建筑表现后期中的照明处理

作者&#xff1a;OUgraphics 今天与大家分享OUgraphics出品的 建筑表现后期的照明表现PS教程 在视频中&#xff0c;作者将通过一个案例的处理 为大家演示如何在Photoshop中创建光效 过程中有很多非常实用的技巧 正如作者所说&#xff0c;它彻底改变你处理夜景和照明的方式 …

html css ps切图教程,Photoshop(PS)CSS切图必用工具

Adobe PHOTOSHOP日常咱们又被称为PS。 div CSS必备切图工具PS截图 多数人对于PHOTOSHOP的了解仅限于“一个很好的图象编辑软件”&#xff0c;并不晓得它的诸多使用方面&#xff0c;理论上&#xff0c;PHOTOSHOP的运用规模很广泛的&#xff0c;在图像、图形、笔墨、视频、出版各…

PS特效动作制作合成创意报纸人物效果

动作支持CS3以上版本软件&#xff0c;首先到陌鱼社区下载“制作创意报纸印刷故障人像效果PS动作”&#xff0c;然后我们用这个动作就可以制作出下图效果哦。 01、打开软件&#xff0c;载入图案(.pat)、动作(.atn)&#xff0c;关闭软件。 02、接下来就是把软件切换成英文&#x…

珍藏的老照片损坏如何修复?今天分享PS老照片修复教程别错过!

原图素材虽然很旧&#xff0c;不过人物部分并没有怎么损坏&#xff0c;只是有一些色块和杂色。修复的工程相对来说也少很多。只需要给人物磨好皮&#xff0c;然后把暗调和高光部分调出来即可。原图 一、打开原图素材&#xff0c;按Ctrl J 把背景图层复制一层&#xff0c;图层混…

PS动作制作3D分散抽离人物粉尘特效

本次所使用动作支持CS5以上版本软件,还是我们需要到陌鱼社区下载“制作粉尘抽离3D立体特效人物PS动作”最后用这个动作一键制作出下图效果。 01、打开软件&#xff0c;载入画笔、动作&#xff0c;关闭软件。 02、把软件变成英文&#xff0c;看这个“怎么把PS界面语言变成英文方…

html css ps切图教程,CSS切图学习之认识PHOTOSHOP(PS)

CSS切图软件之ps截图 Adobe PHOTOSHOP平时咱们又被喻为PS。 少数人关于PHOTOSHOP的了解仅限于“一个很好的图象编纂软件”&#xff0c;其实不晓得它的诸多应用方面&#xff0c;实践上&#xff0c;PHOTOSHOP的运用领域很广泛的&#xff0c;在图象、图形、翰墨、视频、出书各方面…

炫酷木炭裂缝燃烧钢丝人物特效PS动作

依然需要用到一组“制作钢丝缠绕人物木炭燃烧效果PS动作”然后载入相关预设即可做出这样的效果&#xff0c;动作支持CS4以上版本PS软件&#xff0c;下面请看演示。 01、载入画笔、图案、渐变、动作&#xff0c;关闭软件。 02、把软件转换成英文&#xff0c;不懂转换的可以参考这…

PS制作人物消失特效烟雾GIF动画

首先我们需要到陌鱼社区下载制作人像烟雾炫光GIF动画效果PS动作&#xff0c;然后就可以继续我们下面的教程了&#xff0c;下面是这个动作制作出来的一些效果。 01、载入画笔、动作然后关闭软件&#xff0c;怎么载入可参考下图。 02、把软件切换成英文&#xff0c;在软件安装目录…

计算机ps特效教程,计算机一级photoshop给照片制作半素描效果教程

计算机一级photoshop给照片制作半素描效果教程 引导语&#xff1a;素描是一种用绘图工具使其表现在二维材质上的视觉艺术。那么如何用ps做出素描效果呢&#xff0c;以下是百分网小编分享给大家的计算机一级photoshop给照片制作半素描效果教程&#xff0c;欢迎参考学习! 1、启动…