opencv训练自己的分类器,可替换各种目标识别

本文介绍了如何使用OpenCV的opencv_createsamples和opencv_traincascade工具,结合haar或lbp特征,训练自己的目标检测分类器。从收集正负样本、处理样本、生成描述文件到训练分类器的详细步骤都进行了说明,并提供了相关参数的解释。
摘要由CSDN通过智能技术生成

环境:opencv-4.0,python,c++
方法:opencv_createsamples,opencv_traincascade,haar特征或者lbp特征+cascade分类器
流程:

  1. 收集样本,处理样本
  2. 训练分类器
  3. 目标检测

收集样本,处理样本

收集正样本

关于正样本的收集,一张或多张都可以,首先对样本进行处理,我收集了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()
  1. 正样本描述文件
    在这里插入图片描述
    内容
    在这里插入图片描述
  2. 负样本描述文件
    在这里插入图片描述
    内容
    在这里插入图片描述

合成正样本vec

首先将opencv的两个自带工具复制到文件夹中,opencv_createsamples用于处理生成样本,opencv_traincascade用于训练分类器。
在这里插入图片描述

  1. 如果用单个样本生成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

在这里插入图片描述
完成。

  1. 如果用多个样本生成vec

使用工具createsample.pl合成正样本的vec。
在这里插入图片描述
代码

#!/usr/bin/perl
use File::Basename;
use strict;
###############################################
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值