机器学习算法总是离不开训练样本的,通常情况下,你找到的图片并非仅仅含有正样本的,而应该是同时含有正样本和负样本的图片;例如,你打算利用机器学习的算法来进行人脸检测,需要找到人脸的正样本(人脸图片)和负样本(非人脸图片),这个时候,正样本和负样本往往不是那么容易找到的(当然,人脸的训练样本目前在网上能找到很多公开的训练样本库,但如果你要找车辆的训练样本呢?表情的训练样本呢?猫的训练样本?飞机的训练样本?。。。);这个时候,就需要拍摄或者下载很多包含正样本(如,人脸)的图片;当然,这个图片当中,某些区域是人脸(正样本),其它区域是非人脸(负样本);显然,用画图工具之类的软件把一张一张的图片中的正样本区域人工扣去下来,作为正样本, 剩下的区域,作为负样本,这是一个可行的办法;你可以这么做,但作为程序员,似乎写个程序,遍历文件夹中所有的图片,依次显示图片,由用户通过鼠标点击几下得到正样本区域和负样本区域,这样要更高效一些吧。前者是纯人工的办法,后者是半人工的办法;当你扣取了足够的正负样本,训练得到分类器之后,利用机器(计算机)就能自动的把图片中的正样本区域(人脸)给扣取出来,这就是全自动的办法了;机器学习的目的,就是让机器来代替人工高效的完成重复性的工作嘛;当然了,在没有得到训练样本之前,你还是得利用纯人工或者半人工的方法来解决训练样本的问题;笔者给出一个半人工的程序,方便朋友们以后在样本制作过程中使用;
参考代码:
#include "stdafx.h"
#include "windows.h"
#include <vector>
#include <string>
#include "opencv.hpp"
#include "iostream"
#include "fstream"
using namespace std;
typedef std::vector<std::string> file_lists;
static int str_compare(const void *arg1, const void *arg2)
{
return strcmp((*(std::string*)arg1).c_str(), (*(std::string*)a