这节博客我记录了下利用adaboost训练LBP 特征得过程,opencv3
至于原理这里就不再进行详细介绍了,直接说明如何进行训练。在opencv的安装目录中的E:\opencv-3.1.0\opencv\build\x64\vc14\bin
或者/usr/local/bin
文件夹下有两个可执行文件opencv_createsamples.exe和opencv_traincascade.exe。将这两个文件拷贝到训练文件夹下,并将正、负样本的文件夹也拷贝到这个文件夹下。这样,我们就有了训练数据集得正样本和负样本,另外我得负样本是随即截取的没有车位得图像,正样本是车位得直角,如下所示:
1 将数据样本名称写入txt
使用这个指令生成的路径是绝对路径,其生成后需要把绝对路径给替换掉即可。使用的指令为:
dir /b/s /positive > positives.dat
小博喜欢用python脚本
import os
pathname="/home/lenovo/Desktop/adaboost/positive/"
imgLst=os.listdir(pathname)
for img in imgLst:
#print
img_File=os.path.join(pathname,img)
with open("pos.txt","a") as fw:
strwrite=img_File+" 1 0 0 20 20"+'\n'
fw.write(strwrite)
负样本也一样
dir /b/s/ negtive >neg.dat
由于我得图像大小是20x20大小,接下来对证样本得txt文件使用替换工具进行格式替换
2 生成 .vec文件
在将生成的pos.txt,neg.txt里面按住shift并点击右键,在当前文件夹中打开cmd,运行:
opencv_createsamples -img pos.txt -vec pos.vec -num 200 -w 20 -h 20
会文件夹下会生成一个pos.vec文件。
3 训练
首先在当前文件夹中新建一个mode文件夹,保存训练模型,然后在CMD中继续输入如下命令:
opencv_traincascade -data mode -vec pos.vec -bg neg.txt -numPos 200 -numNeg 377 -numStages 15 -featureType HOG -w 20 -h 20 -minHitRate 0.9999 -maxFalseAlarmRate 0.4
4 测试
我在这只是替换了demo里得人脸检测xml,名字并没做任何改变,见谅,但不影响结果。
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include
#include
using namespace std;
using namespace cv;
/* Function Headers */
void detectAndDisplay(Mat frame);
/* Global variables */
String face_cascade_name = "cascade.xml";
CascadeClassifier face_cascade;
String window_name = "Capture - Face detection";
/* @function main */
int main(void)
{
VideoCapture capture;
Mat frame;
//-- 1. Load the cascades
if (!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading cascade\n"); return -1; };
capture.open(0);
if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }
while (capture.read(frame))
{
if (frame.empty())
{
printf(" --(!) No captured frame -- Break!");
break;
}
//-- 3. Apply the classifier to the frame
detectAndDisplay(frame);
int c = waitKey(10);
if ((char)c == 27) { break; } // escape
}
return 0;
}
/* @function detectAndDisplay */
void detectAndDisplay(Mat frame)
{
std::vector<Rect> faces;
Mat frame_gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
//-- Detect faces
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faces.size(); i++)
{
Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
Mat faceROI = frame_gray(faces[i]);
}
//-- Show what you got
imshow(window_name, frame);
}