环境:opencv-4.0,python,c++
方法:opencv_createsamples,opencv_traincascade,haar特征或者lbp特征+cascade分类器
流程:
- 收集样本,处理样本
- 训练分类器
- 目标检测
收集样本,处理样本
收集正样本
关于正样本的收集,一张或多张都可以,首先对样本进行处理,我收集了50个正样本。
处理正样本
处理样本,灰度化,归一化,大小为(50, 50)
path = "/home/yk/project/pyCharm/train/true/"
for i in range(1, 51):
print(path+str(i)+'.jpg')
img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
img5050 = cv2.resize(img, (50, 50))
cv2.imshow("img", img5050)
cv2.waitKey(20)
cv2.imwrite('/home/yk/project/pyCharm/train/pos/'+str(i)+'.jpg', img5050)
处理后效果
收集负样本
关于负样本,只要不含有正样本图片即可,最好是识别场景的图片。
我找到一个负样本下载链接。https://pythonprogramming.net/static/images/opencv/negative-background-images.zip
下载后如图
生成描述文件
正负样本描述文件生成。
import os
def create_pos_n_neg():
for file_type in ['neg']:
for img in os.listdir(file_type):
if (file_type == 'neg'):
line = file_type + '/' + img + '\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()
- 正样本描述文件
内容
- 负样本描述文件
内容
合成正样本vec
首先将opencv的两个自带工具复制到文件夹中,opencv_createsamples用于处理生成样本,opencv_traincascade用于训练分类器。
- 如果用单个样本生成vec执行命令
mkdir info
opencv_createsamples -img pos/1.jpg -bg bg.txt -info info/info.lst -pngoutput info -maxxangle 0.5 -maxyangle 0.5 -maxzangle 0.5 -num 1950
运行后显示Done,表示成功。
打开文件夹info
在最下面还有info.lst
输入命令
opencv_createsamples -info info/info.lst -num 1950 -w 50 -h 50 -vec pos.vec
完成。
- 如果用多个样本生成vec
使用工具createsample.pl合成正样本的vec。
代码
#!/usr/bin/perl
use File::Basename;
use strict;
###############################################