基于opencv的图像识别,opencv图像特征提取与匹配

  基于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.

基于opencv的图像识别,opencv图像特征提取与匹配