首页 > 编程知识 正文

opencv图像特征提取与识别,opencv自带分类器

时间:2023-05-06 00:52:00 阅读:151471 作者:133

因为网上有很多脸部识别教程,所以有脸部识别分类器,所以不需要自己训练,识别度也很高。 但是,最近想在草莓派和OpenCV的环境下进行某些物体的识别,所以要训练特定的分类器。 过程并不难,比较繁琐,跟上就OK了。 以下是用苹果识别的例子。

Linux环境下Opencv分类器训练(基于草莓派和Opencv的物体识别)一、环境配置二、样本采集与处理1、正样本采集2、负样本采集3、正负样本描述文件生成三、训练分类器四、生成的xml文件

如果以前安装过OpenCV,系统将跳过以下几个步骤,从而节省大量时间。

sudoaptinstallibopencv-dev python-opencvsudoaptinstallbuild-essentialsudoaptinstallcmakegitlibgtk 2.0-dev pkg-configligligligttk install python-dev python-numpylibtbb2lib TB B- dev libjpeg-dev libpng-dev libtiff-dev libtiff-dev

将cdmkdir opencv_workspace和opencv源代码下载到当前目录。

CD opencv _ workspacegitclone 3359 github.com/its EEZ/opencv.git是在此环境中配置的。

二、采集和处理样品所需的图像数据分为正样本和负样本。 加样是苹果的照片。 (加样本的数量因情况而异,对于人脸等复杂图像,加样本的数量应该较多,但对于简单的样本识别,加样本数个就足够了。 加样越多越好,但收集起来很辛苦。 ) ) ) )。

1、收集正样本并在opencv_workspace文件夹下建立文件夹pos,将正样本放在pos下

将正面的示例图像转换为灰度,并将其剪切为适当的大小,以便于后续处理。 1 .创建py文件,并将其放入以下代码中执行:

import c v2 foriinrange (1,6 ) :# )照片img=cv2.imread('pos/'str ).jpg )、cv2.IMREAD_GRAYSCALE ) ) 效果如下

2、收集负样本对于负样本,不包含正样本图像即可,期望识别场景的图像。 负样本下载链接:https://pan.Baidu.com/s/1 tgyauhuggktrzuwbfonuwq提取代码: j5q2,下载后,如图所示,2000张以上已经进行了灰度处理。

请将负示例文件夹neg放在opencv_workspace文件夹下。

3、正负样本描述文件生成正样本描述文件,生成2.py文件,并复制以下代码

importosdefcreate _ pos _ n _ neg (: for file _ typein [ ' pos ' ] : #在此修改pos或neg将生成正负示例的描述文件。 pos是修改的示例描述文件info.txtforimginos.list dir (file _ type ) :if ) file _ type=' neg ' (3360 line=file _ type ) “iin”即“a”ASF : f.write (line ) elif (file _ type==“pos”) : line=file _ type (/“img”1050 (n ) )

生成负示例描述文件,创建3.py文件,并复制以下代码

importosdefcreate _ pos _ n _ neg (: for file _ typein [ ' neg ' ] : #此处修改pos或neg将生成正负示例描述文件。 neg是正的示例描述文件BG.txtforimginos.list dir (file _ type ) :if ) file _ type=' neg ' (: line=file _ type )

'n' with open('bg.txt', 'a') as f: f.write(line) elif (file_type == 'pos'): line = file_type + '/' + img + ' 1 0 0 50 50n' with open('info.txt', 'a') as f: f.write(line)if __name__ == '__main__': create_pos_n_neg() print('正样本描述文件bg.txt已生成')

三、训练分类器

生成positives.vec文件。在当前目录打开控制台程序,输入

opencv_createsamples -info info.txt -num 50 -w 50 -h 50 -vec positives.vec

其中,-info字段填写正样本描述文件;-num制定正样本的数目;-w和-h分别指定正样本的宽和高(-w和-h越大,训练耗时越大);-vec用于保存制作的正样本。

mkdir data #用于存储Cascade分类器数据

训练分类器

opencv_traincascade -data data -vec positives.vec -bg bg.txt -numPos 4 -numNeg 10 -numStages 16 -w 50 -h 50

字段说明如下:
-data data:训练后data目录下会存储训练过程中生成的文件
-vec positives.vec:Pos.vec是通过opencv_createsamples生成的vec文件
-bg bg.txt:bg.txt是负样本文件的数据
-numPos :正样本的数目,这个数值一定要比准备正样本时的数目少,不然会报can not get new positive sample.
-numNeg :负样本数目,数值可以比负样本大
-numStages :训练分类器的级数
-w 50:必须与opencv_createsample中使用的-w值一致
-h 50:必须与opencv_createsample中使用的-h值一致
注:-w和-h的大小对训练时间的影响非常大

注意:树莓派内存较小,numPos和numNeg的数值太大会被系统终止训练,因此适当取numPos和numNeg的数值,错误如下:

训练成功则如下:

进入data文件夹下,就可以看到生成训练出来的xml文件cascade.xml。

四、使用生成的xml文件进行识别

将需要识别的照片(命名为test.jpg)放到在opencv_createsamples文件夹下,并在opencv_createsamples文件夹下创建4.py文件,拷贝以下代码进去

import cv2watch_cascade = cv2.CascadeClassifier('/home/pi/opencv_createsamples/data/cascade.xml')#分类器路径img = cv2.imread('test.jpg')#需要识别的照片,放到opencv_createsamples文件夹下gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)watches = watch_cascade.detectMultiScale(gray)for (x,y,w,h) in watches: cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)#建立方框,(0,255,0)表示绿色 roi_gray = gray[y:y+h,x:x+w] roi_color = img[y:y+h,x:x+w]cv2.imshow('识别窗口',img)k = cv2.waitKey(0)

运行即可,如果识别的图片太大,运行下面程序调整一下

import cv2img = cv2.imread('test.jpg')#读入照片img1 = cv2.resize(img,(300,300))#调整大小cv2.imwrite('test.jpg',img1)#保存图片print('调整成功!')

识别效果如下:

由于树莓派内存太小,训练的分类器精度还是有待提高。
有问题的下方留言,谢谢!
参考:
链接: https://www.freesion.com/article/79671247590/.
链接: https://blog.csdn.net/qq_16309049/article/details/73039567.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。