本教程基于以下环境 macOS 10.12.6,OpenCV 3.3.0,python 3.6。由于网上基于masOS系统的教程太少,想出一篇相关教程造福大家~本文旨在学习如何在opencv中基于haar-like特征训练自己的分类器,并且用该分类器用于模式识别。

1. 安装OpenCV和OpenCV源代码

OpenCV至少要保证下载好2.4.5以上的版本,同时源码要对应好自己所安装的版本。

brew tap homebrew/science
brew install --with-tbb opencv

2. 在github上clone一个工程,里面有相关训练脚本和训练样本文件夹等等,后面会用到,在terminal输入

git clone https://github.com/mrnugget/opencv-haar-classifier-training

3. 把正例训练集放入./positive_images,并且将正例的照片名称存入positives.txt里

本训练的正例只有43张,非常少,若想训练完全需要样本量很大,有见过600-2000张不等的。再输入以下命令把名称存入positives.txt,效果图下

find ./positive_images -iname "*.jpg" > positives.txt

4. 同理,把反例训练集放入./negative_images,并且将正例的照片名称存入negative.txt里

find ./negative_images -iname "*.jpg" > negatives.txt

5. 通过bin/createsamples.pl脚本和opencv_createsamples工具创建正例样本集,再将其放入./samples 文件夹里

perl bin/createsamples.pl positives.txt negatives.txt samples 43 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 0.5 -maxyangle 0.5 maxzangle 0.5 -maxidev 40 -w 40 -h 40"

6. 把在/samples 文件夹里的样本集合成到samples.vec文件中

python ./tools/mergevec.py -v samples/ -o samples.vec

7. 使用opencv_traincascade工具进行训练,并把结果保存到./classifier

opencv_traincascade -data classifier -vec samples.vec -bg negatives.txt -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 43 -numNeg 43 -w 40 -h 40 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024

然后开始阶段性训练,每一层训练都会打印到控制台,其中,如果每一层只能训练出1-2个特征点,那说明训练集有问题,不够大或特征不明显。需要等待的时候比较久,取决于样本大小和样本集大小。

8. 在classifier文件夹里找到cascade.xml文件,就是训练好的分类器了~

9. 本文用python做了实时检测训练的物体,也可以使用Node.js + Opencv 去识别,方法很多。博主可惜由于训练集不足的原因效果不是很好,不过代码附下,如果有训练成功或有疑问朋友,欢迎交流~

import cv2

face_cascade = cv2.CascadeClassifier('cascade.xml')
cap = cv2.VideoCapture(0) while 1:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray) for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w] cv2.imshow('img',img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break cap.release()
cv2.destroyAllWindows()

Useful Material:

1. http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html

2. http://note.sonots.com/SciSoftware/haartraining.html#w0a08ab4

【macOS】 在OpenCV下训练Haar特征分类器的更多相关文章

  1. OpenCV中基于Haar特征和级联分类器的人脸检测

    使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,再优秀的机器学习分类算法都是零. 今年3 ...

  2. OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读

    上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开). 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了.不过效果并不是特别理想,由于我是在自己的 ...

  3. Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

    在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...

  4. 使用OpenCV训练Haar like+Adaboost分类器的常见问题

    <FAQ:OpenCV Haartraining>——使用OpenCV训练Haar like+Adaboost分类器的常见问题 最近使用OpenCV训练Haar like+Adaboost ...

  5. 关于haar特征的理解及使用(java实现)

    Haar特征原理综述Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征.它分为三类:边缘特征.线性特征.中心特征和对角线特征.如下所示: Haar-like矩形特征拓展  Lienha ...

  6. 【原】训练自己haar-like特征分类器并识别物体(2)

    在上一篇文章中,我介绍了<训练自己的haar-like特征分类器并识别物体>的前两个步骤: 1.准备训练样本图片,包括正例及反例样本 2.生成样本描述文件 3.训练样本 4.目标识别 == ...

  7. 如何利用OpenCV自带的级联分类器训练程序训练分类器

    介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...

  8. opencv 训练自己的分类器汇总

    原地址:http://www.cnblogs.com/zengqs/archive/2009/02/12/1389208.html OpenCV训练分类器 OpenCV训练分类器 一.简介 目标检测方 ...

  9. 【计算机视觉】如何使用opencv自带工具训练人脸检测分类器

    前言 使用opencv自带的分类器效果并不是很好,由此想要训练自己的分类器,正好opencv有自带的工具进行训练.本文就对此进行展开. 步骤 1.查找工具文件: 2.准备样本数据: 3.训练分类器: ...

随机推荐

  1. 2018-2019-2 20165215《网络对抗技术》Exp4 恶意代码分析

    目录 实践目标 实践内容 基础问题回答 实验步骤 使用schtasks指令监控系统 使用sysmon工具监控系统 使用VirusTotal分析恶意软件 使用PEiD进行外壳检测 使用PE explor ...

  2. html中div标签怎么用?

    div现在一般网页的布局都是使用的div+css来布局,div的话,就是通过. <div> <div><p></p></div> </ ...

  3. ABP入门系列之1——ABP总体介绍

    ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点, ...

  4. JS实现div的抖动:缓动式抖动

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  5. 运用java反射机制获取实体方法报错,java.lang.NoSuchMethodException: int.<init>(java.lang.String)

    错误的原因是我的Student实体,成员变量数据类型,使用了int基本数据类型,改成Integer包装类型即可.

  6. Cannot redeclare C() (previously declared in .

    在引入支付宝入口文件AopSdk.php的时候报错:Cannot redeclare C() (previously declared in D:\phpStudy\WWW\thinkphp\help ...

  7. k8s集群安装

    准备三台虚拟机,一台做master,两台做master节点,关闭selinux. 一.安装docker,两node节点上进行 1. 2.安装docker依赖包:yum install -y yum-u ...

  8. mpvue小程序开发tips(1)

    wx.setStorageSync('vipId',vipId)-----存储   wx.getStorageSync('vipId')-------读取   wx.navigateTo({ url: ...

  9. xshell终端向远程服务器上传文件方法

    centos-7下在本地终端里向远程服务器上传文件,在命令行中执行的软件. 安装命令如下: 在终端里输入如下命令: 会弹出如下窗口 选择你要上传的文件即可上传成功.

  10. linux下自动获取并安装软件包 apt-get 的命令介绍

    apt-cache search package    搜索包 apt-cache show package    获取包的相关信息,如说明.大小.版本等 sudo apt-get install p ...