opencv3 adboost LBP HOG车位线检测

这节博客我记录了下利用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文件使用替换工具进行格式替换
opencv3 adboost LBP HOG车位线检测_第1张图片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);
}

你可能感兴趣的:(c++与opencv做图像处理,图像处理)