基于opencv的图像识别,opencv图像特征提取与匹配
因为网上有很多人脸识别教程,有人脸识别分类器,所以不需要自己训练,识别度高。但是最近想在草莓派和OpenCV的环境下识别一些物体,需要训练一个特定的分类器。这个过程并不难,但相当繁琐。跟上就好。下面是一个用苹果鉴定的例子。
Linux下Opencv分类器的训练(基于草莓派和Opencv的物体识别)1。环境配置2。样品收集和处理。阳性样本采集2。阴性样本收集3。生成正负样本描述文件3。训练分类器4。生成的xml文件
如果之前已经安装了OpenCV,系统会跳过后面的步骤,这样可以节省很多时间。
sudoaptinstalliopencv-dev python-opencvsudoaptinstallbuild-essentialsudoptinstallcmakegitlibgtk 2.0-dev pkg-configligligligttk安装python-dev pyt hon-numpylitbbb 2 lib TB B-dev libjpeg-dev libpng-dev libtiff-dev libtiff-dev
将cdmkdir opencv_workspace和opencv源代码下载到当前目录。
opencv _ workspacegitclone 3359 github.com/its EEZ/opencv . git在此环境中配置。
第二,将采集和处理样本所需的图像数据分为正样本和负样本。样本是一个苹果的图片。(要添加的样本数量因情况而异。对于人脸等复杂图像,加入的样本数量应该更多,但对于简单的样本识别,加入几个样本就足够了。样本越多越好,但是很难收集。) ) ) )。
1.收集阳性样本并在opencv_workspace文件夹下建立一个文件夹pos,并将阳性样本放在pos下。
前样本图像被转换成灰度,并被切割成适当的尺寸以供后续处理。1.创建py文件,并将其放入以下代码中执行:
为iinrange (1,6):#)photo img=cv2 . im read( pos/ str)。jpg)、cv2。IMREAD _ gray)具有以下效果。
2.收集阴性样本。对于阴性样本,排除阳性样本图像就足够了。它有望识别场景的图像。阴性样本下载链接:https://pan.Baidu.com/s/1 TGYAUHUGGKTRZUWBFOUWQ提取代码:j5q2。下载后如图,2000多张图片已经灰显。
请将负样文件夹neg放在opencv_workspace文件夹下。
3.正反样本描述文件生成正样本描述文件,生成2.py文件,复制以下代码
ImportosDefCreate _ pos _ N _ neg(:for file _ type in[ POS ]:#在这里修改POS或NEG会生成一个正反例的描述文件。是修改后的示例描述文件info . txtforimginos . listdir(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 _ type in[ NEG ]:#在此修改POS或NEG将生成正负样本配置文件。Neg是正例描述文件BG . txtforimginos . listdir(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 50 n with open( info . txt ,A )as f:f . write(line)if _ _ name _= _ main _ _ :create _ pos _ n _ neg()print(已生成正样描述文件bg.txt )
第三,训练分类器生成positives.vec文件。打开当前目录下的控制台程序,并输入
opencv _ create samples-info info . txt-num 50-w50-h50-vec positions . vec其中-info字段填写阳性样本描述文件;-num设置阳性样本的数量;-w和-h分别指定正样本的宽度和高度(w和-h越大,训练越耗时);-vec用于保存制成的阳性样本。
Mkdir data #用于存储级联分类器数据以训练分类器。
opencv _ train cascade-data data-vec positions . vec-bgbg . txt-numpos 4-num neg 10-numstages 16-w50-h50字段描述如下:
-data data:训练结束后,训练过程中生成的文件将存储在data目录中。
-vecpositions.vec: pos.vec是opencv_createsamples生成的vec文件。
-bgbgbg.txt: bg.txt是阴性样本文件的数据。
-numPos:阳性样本的数量。该值必须小于制备阳性样品时的数值,否则将被报告为无法获得新的阳性样品。
-numNeg:负样本数,可以大于负样本数。
-numStages:训练分类器的级数。
-w 50:必须与opencv_createsample中使用的-w值一致
-h 50:必须与opencv_createsample中使用的-h值一致
注:-w和-h的大小对训练时间影响很大。
注意:树莓Pi的内存很小,如果numPos和numNeg的数值过高,训练会被系统终止。因此,适当选择numPos和numNeg的数值,误差如下:
培训的成功之处如下:
进入data文件夹,可以看到生成的训练好的xml文件cascade.xml
四。使用生成的xml文件进行标识。将待识别的照片(命名为test.jpg)放入opencv_createsamples文件夹中,在opencv_createsamples文件夹中创建一个4.py文件。将以下代码复制到其中
导入v2watch _ cascade=cv2.cascade分类器(/home/pi/opencv _ createsamples/data/cascade . XML )#分类器路径img=cv2.imread(test.jpg)#待识别的照片,在opencv _ create samples文件夹中,gray=cv2.cvtcolor (img,cv2 . color _ bgr 2 gray)watches=watch _ cascade . detect watches中(X,y,w,H)的多尺度(gray)为:cv2.rectangle (img,(X,y),(x w,y)如果识别的图像太大,运行以下程序进行调整。
导入2mg=cv2.imread (test.jpg) #读入照片img1=cv2.resize (img,(300,300)) #调整大小cv2.imwrite(test.jpg ,img1)#保存图片打印(调整成功!)识别效果如下:
由于树莓派的内存太小,训练出来的分类器的准确率还有待提高。
有问题在下面留言,谢谢!
参考:
链接:https://www.freesion.com/article/79671247590/.
链接:https://blog.csdn.net/qq_16309049/article/details/73039567.