目录ios
1、从网络上下载或者本身找到的图片中裁剪挑选出合适的图片。网络
2、在negdata和posdata文件夹准备好以后,使用命令提示符(win + r),输入cmd,把位置切换到posdata文件夹的位置。测试
3、找到本身下载的OpenCV文件夹,打开opencv,打开build,打开x64,打开vc14,打开bin文件夹。ui
4、打开cmd,在该文件目录下输入“ opencv_createsamples.exe -vec pos.vec -info pos.txt -num 32 -w 100 -h 40 ” 。spa
5、在主文件夹下建立一个txt文档,命名为“traincascade”。3d
6、 以后能够运行VS,新建一个VC++项目。输入一下代码以后进行测试。xml
图片的大小和格式都要相同,准备好两个文件夹,分别命名为posdata(正样本)和negdata(负样本),全部样本的尺寸必须一致,若是不一致的或者尺寸较大的,能够先将全部样本统一缩放到100*40。posdata中的图片为车辆样本。给分类器展现的是正确的样本。blog
negdata中的图片为一些背景样本,里面不包含车辆,是用来告诉分类器哪些是错误的样本。虽然负样本就是样本中不存在正样本的内容,但最好是根据不一样的项目选择不一样的负样本,好比一个项目是作机场的人脸检测,那么就最好从现场拍摄一些图片数据回来,从中采集负样本。 图片
而后在里面输入“ dir /b/s/p/w *.jpg > pos.txt ”,将会在posdata文件夹中产生一个pos.txt的文档。打开pos.txt,选择编辑-替换,在查找中搜索jpg,替换为jpg 1 0 0 100 40,以后保存,将pos.txt复制到上一级目录中。文档
以后对negdata文件夹进行相同的操做,在cmd中输入的语句为“ dir /b/s/p/w *.jpg > neg.txt ”。
选择opencv_createsamples.exe和opencv_traincascade.exe两项,将其复制到须要的文件夹中,与negdata、posdata并列。
pos.txt 代表这是正样本;
num 32 表明正样本照片数量;
w 100 h40表示图片分辨率(宽和高)
以后在该文件夹中会出现pos.vec
以后重复该步骤,cmd输入的语句换为“ opencv_createsamples.exe -vec neg.vec -info neg.txt -num 100 -w 100 -h 40 ”,产生neg.vec。
在该txt中输入“
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 32 -numNeg 100 -numStages 20 -w 100 -h 40 -mode ALL
pause
”
numPos 32 表明正样本照片数量 numNeg100 表示负样本照片数量 numStage 20表示检测次数 pause为暂停
对“traincascade.txt”进行重命名,将后缀名改成bat。
以后双击“traincascade.bat”。会产生以下效果
训练分类器时占用CPU空间多,电脑运行将会变卡,处理时间较长。处理完成以后将会在文件夹下生成一个cascade.xml。
代码为:
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
String filename = "F:/车辆样本2/cascade.xml"; //以前cascade.xml放置的位置
CascadeClassifier car_classifier;
int main(int argc, char**argv)
{
if (!car_classifier.load(filename))
{
printf("could not laod car feature data..\n");
return -1;
}
Mat src = imread("D:/图片/15.jpg"); //须要检测的图片
if (src.empty())
{
printf("could not laod image...\n");
return -1;
}
imshow("inupt image", src);
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
vector<Rect>cars;
car_classifier.detectMultiScale(gray, cars, 1.1, 3, 0, Size(50, 50));
for (size_t t = 0; t < cars.size(); t++)
{
rectangle(src, cars[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
}
imshow("detect cars", src);
waitKey(0);
return 0;
}
以后点击运行,由于设置的正负样本过少的缘由,效果不是很明显。出现效果以下: