1.我的运行环境
(1)Win7 64位
(2)VS2015
(3)Opencv3.4.4
2.准备数据
(1)正样本
- 要多
- 正样本不要求大小相同,只要求长与宽的比值相同
- 背景尽量少
(2)负样本
- 要多
- 大小没有要求
- 不能包含正样本
3.生成样本描述文件
(1)正样本描述文件
尽你所能生成以下格式的正样本描述文件:
路径 样本中目标数目 目标起始坐标(一般是图像起始点) 目标结束坐标(一般是图像最后一个点)
(2)负样本描述文件
负样本路径
4.生成vec文件
(1) 打开DOS界面进入opencv安装目录下该位置D:\opencv-3.4.4\opencv\build\x64\vc14\bin
输入opencv_createsample会出现该可执行文件的参数表
(2)输入如下命令生成vec文件
5.样本训练
(1)输入opencv_traincascade会出现该可执行文件的参数表
(2)输入如下命令开始训练
6.所有准备工作都完成了
此时,你的文件结构应该是这样的:
7.测试
//特征文件
String fileName_LBP = "img/cascade.xml";
CascadeClassifier cucumber_classifier;
int cascade_c() {
//分类器
cucumber_classifier.load(fileName_LBP);
if (cucumber_classifier.empty()) {
cout << "no cucumber feature data!"<<endl;
int a = 0; cin >> a;
return -1;
}
//获取待检测图像
Mat src = imread("img/test/2.jpg");
if (src.empty()) {
cout << "no image!" << endl;
int a = 0; cin >> a;
return -1;
}
imshow("test", src);
//处理待检测图像
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
//检测
vector<Rect> cucumbers;
cucumber_classifier.detectMultiScale(src, cucumbers, 1.1, 3, 0, Size(20, 20));
//显示检测结果
for (size_t t=0; t < cucumbers.size(); t++) {
rectangle(src, cucumbers[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
}
namedWindow("result", CV_WINDOW_AUTOSIZE);
imshow("result", src);
waitKey(0);
return 0;
}
8.完!