opencv实现物体识别,opencv识别视频中特定物体

  opencv实现物体识别,opencv识别视频中特定物体

  

opencv 实时识别指定物体

一. 引入

opencv人脸识别大家应该都听说过。本文的目的是利用OpenCV从视频帧中识别出指定的物体,并对其进行分帧,所拍摄的物体图像可以保存。我们会讲整个过程,包括训练我们自己的分类器,使用训练好的分类器进行识别。这里以识别舌头为例。

  二。环境:1。python 3.6.3 2。opencv3.4.0

  3.训练你的分类器。

  1.注:训练集分为正样本和负样本,都是灰度图像。阳性样本的大小需要固定,一般在40*40左右。当计算机太大时,负样本的大小是不固定的,负样本的数量应该多于正样本的数量。少了就有问题了。图像批量还原工具下载:链接:https://pan.baidu.com/s/1pMAp19p密码:vpp1图像批量灰度处理:使用美图秀秀

  2.正样制作:用美图秀秀把舌头的图片全部剪下来(同样大小40*40)保存在文件夹pos里。当然,你可以先用一个大的方框把它们裁掉,然后用图片缩小工具进行尺寸缩小。最后用美图秀秀进行批量灰化。附加具有自动名称排序的Java代码:string path= c: users administrator desktop pos ;File f=新文件(路径);file[]files=f . list files();for(File File:files){ I;file.renameTo(新文件(路径I . file.getName()。拆分( . )[1]));}处理后得到如下图:

  3.负样制作:以上操作类似,但此处不要求大小相同。但是,要识别的区域(如这里的舌头)不得包含在如下的负样本图片中:

  4.生成示例资源记录文件:

  A.阳性样本资源记录文件

  新建一个pos文件夹,将正例样本的灰度复制到里面,用JAVA代码生成正例样本资源记录文件:String Path= e: Tools Python Eclipse Work Python Test Demo 0202 IMG Train Tongue 。File txtfile=新文件(路径 pos . txt );file output stream fos=new file output stream(txt file);PrintWriter pw=new PrintWriter(fos,true);字符串s=“”;File[] files=新文件(路径)。list files();for(File File:files){ pw . println( pos/ File . getname() 1 0 0 40 40 );}生成后删除最后一行带(pos.txt)的内容,让正例资源记录文件内容如下:

  (1 0 0 40 40)分别指:量的左上坐标位置(x,y)和右下坐标位置(x,y)。处理后,将pos.txt移动到上一级文件夹。

  B.负样本资源记录文件

  新建一个neg文件夹,把负样的灰度复制到里面,用JAVA代码生成负样资源记录文件:String Path= E: Tools Python Eclipse Work Python Test Demo 0202 IMG Train Tongue。File txtfile=新文件(路径 neg . txt );file output stream fos=new file output stream(txt file);PrintWriter pw=new PrintWriter(fos,true);字符串s=“”;File[] files=新文件(路径)。list files();for(File File:files){ pw . println( neg/ File . getname());}生成后删除最后一行带有(neg.txt)的内容,让负样本资源记录文件内容如下:

  处理后,将negtxt移动到上一级文件夹

  得到如图所示的文件夹结构:

  5.使用opencv提供的opencv_createsamples.exe程序生成样本vec文件,并创建一个新的批处理文件:createsamples.bat,其内容如下:

  opencv _ create samples . exe-vec pos . vec-info pos . txt-num 25-w40-h40 pause描述:25是正样本图片的个数40 40是正样本图片的宽度和高度。

  这些参数的详细说明:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user _指南/ug _ traincascade.html

  运行后会生成pos.vec文件。

  6.使用opencv提供的OpenCV _ traincascade.exe程序训练分类器,新建一个xml文件夹,然后新建一个批处理文件:LBP_train.bat有以下内容:

  opencv _ train级联。exe-data XML-vec pos。vec-BG阴性。txt-num pos 25-numeng 666-numStages 10-w 40-h 40-分钟命中率0.999-maxfalse alarm rate 0.2-重量trim rate 0.95-特征类型LBP暂停说明: 25是正样本图片的数量666是负样本图片的数量努姆涅是层级数40 40是训练样本的宽高.具体参数解释请查看文档:http://www。opencv。org。cn/opencvdoc/2。3 .2/html/doc/user _ guide/ug _ train级联。超文本标记语言

  运行后会在可扩展标记语言文件夹生成如下文件:

  其中cascade.xml是我们需要使用的分类器

  四。测试训练好的分类器

  创建于2018年年2月2日实时人脸检测@作者:nuohy 导入cv2#加载中文版自带的人脸分类器# faceCascade=cv2 .级联分类器(‘哈尔级联_正面_ alt 2。XML )#面层叠。load( E:/python/opencv/opencv/sources/data/Haar cascades/Haar cascade _ front face _ alt 2。XML )face cascade=cv2 .级联分类器(‘级联。XML’)面层叠。load( E:/tools/python/eclipse/work/python test/demo/0202/img/train/tongue/XML/cascade。XML )cap=cv2 .视频捕捉(0)flag=0 timef=10而True:flag=1 ret,frame=cap。read()img=frame。copy()gray=cv2。CVT颜色(框架,cv2 .COLOR _ bgr 2 gray)rect=面层叠。检测多尺度(gray,scaleFactor=1.15,minNeighbors=3,minSize=(3,3),flags=cv2 .im read _ gray)for(x,y,w,h) in rect: cv2.rectangle(frame,(x,y),(x w,y h),(0,255,0),2) #识别到物体后进行裁剪保存#jiequ=img[x:(x w),y:(y h)]# cv2。im write( E://tools//python//eclipse//work//python test//demo//0202//img// str(flag) . jpg ,解曲)#另存为jpg #读取到保存图片# if(标志% timeF==0):# cv2。im write( E://tools//python//eclipse//work//python test//demo//0202// str(flag) .jpg ,框架)#另存为jpg cv2.imshow(frame ,frame)if cv2。wait key(1)0x ff==ord( q ):break cap。释放()cv2。destroyallwindows()

  效果图如下所示:

  所有需要用到的文件:http://download . csdn . net/下载/qq_27063119/10238488(需要5积分,没有的至我邮箱nuohy@qq.com)

opencv实现物体识别,opencv识别视频中特定物体