#include "opencv2/opencv.hpp"
#define TRAIN_MODEL 0
void train(const std::string& posi_dir, const std::string& nega_dir, const std::string& save_pathname,
cv::HOGDescriptor* hog_descriptor);
#if TRAIN_MODEL
int main(int argc, char** argv)
{
//定义正样本路径
const std::string positive_dir("./positive");
//定义负样本路径
const std::string negative_dir("./negative");
//目标检测模型保存路径和名称
const std::string save_pathname("./car_plane_detector.yaml");
//定义检测器的宽度和高度,必须是8的倍数,宽度和高度的比例大致为3:1
const int detector_width = 192;
const int detector_heigt = 64;
cv::Size detector_size(detector_width, detector_heigt);
//定义HOG特征提取器
cv::HOGDescriptor hog_descriptor;
//设置HOG特征提取器的尺寸
hog_descriptor.winSize = detector_size;
//SVM模型训练
train(positive_dir, negative_dir, save_pathname, &hog_descriptor);
return 0;
}
#else
int main(int argc, char** argv)
{
////搜索测试图像
//const std::string test_dir("./test");
//std::vector< cv::String > files;
//cv::glob(test_dir + "/*.*", files);
//std::vector<cv::Mat> list_image;
//for (unsigned int i = 0; i < files.size(); i++)
//{
// cv::Mat image = cv::imread(files[i], cv::IMREAD_COLOR);
// cv::resize(image, image, cv::Size(1920, 1080));
// list_image.push_back(image);
//}
//目标检测模型保存路径和名称
const std::string save_pathname("./car_plane_detector.yaml");
//测试图像路径
const std::string test_dir("./test");
//导入目标检测模型
cv::HOGDescriptor hog_descriptor;
hog_descriptor.load(save_pathname);
//搜索测试图像
std::vector< cv::String > files;
cv::glob(test_dir + "/*.*", files);
for (unsigned int i = 0; i < files.size(); i++)
{
//读取测试图像
cv::Mat image = cv::imread(files[i]);
//检测结果Box
std::vector< cv::Rect > detections;
hog_descriptor.detectMultiScale(image, detections);
for (size_t j = 0; j < detections.size(); j++)
{
rectangle(image, detections[j], cv::Scalar(0, 255, 0), 2);
printf("%d %d\n", detections[j].width, detections[j].height);
}
cv::imshow("检测结果", image);
cv::waitKey();
}
return 0;
}
#endif
std::vector<cv::Mat> collectFeatureSet(const std::string& image_dir, cv::HOGDescriptor* hog_descriptor, const bool& is_positive)
{
//定义输出
std::vector<cv::Mat> feature_buffer;
//搜索目录下的所有图像文件
std::vector<cv::String> image_file_list;
cv::glob(image_dir + "/*.jpg", image_file_list);
//定义随机变量
cv::RNG rng = cv::theRNG();
//读取图像并提取HOG特征
for (unsigned int i = 0; i < image_file_list.size(); i++)
{
cv::Mat image = cv::imread(image_file_list[i], cv::IMREAD_GRAYSCALE);
if (is_positive)
{
//正样本缩放统一尺寸
cv::resize(image, image, hog_descriptor->winSize);
//提取HOG特征
std::vector<float> descriptors;
hog_descriptor->compute(image, descriptors);
//缓存特征
feature_buffer.push_back(cv::Mat(descriptors).clone());
}
else
{
//正负样本比例1:3
for (unsigned int j = 0; j < 3; j++)
{
//负样本随机裁剪
int crop_x = (image.cols - hog_descriptor->winSize.width - 1) * (float)rng;
int crop_y = (image.rows - hog_descriptor->winSize.height - 1) * (float)rng;
image = image(cv::Rect(crop_x, crop_y,
hog_descriptor->winSize.width,
hog_descriptor->winSize.height)).clone();
//提取HOG特征
std::vector<float> descriptors;
hog_descriptor->compute(image, descriptors);
//缓存特征
feature_buffer.push_back(cv::Mat(descriptors).clone());
}
}
}
return feature_buffer;
}
void convertToML(const std::vector< cv::Mat >& train_samples, cv::Mat& train_data)
{
const int rows = (int)train_samples.size();
const int cols = (int)std::max(train_samples[0].cols, train_samples[0].rows);
cv::Mat tmp(1, cols, CV_32FC1);
train_data = cv::Mat(rows, cols, CV_32FC1);
for (size_t i = 0; i < train_samples.size(); ++i)
{
CV_Assert(train_samples[i].cols == 1 || train_samples[i].rows == 1);
if (train_samples[i].cols == 1)
{
transpose(train_samples[i], tmp);
tmp.copyTo(train_data.row((int)i));
}
else if (train_samples[i].rows == 1)
{
train_samples[i].copyTo(train_data.row((int)i));
}
}
}
std::vector< float > getSvmDetector(const cv::Ptr< cv::ml::SVM >& svm)
{
cv::Mat sv = svm->getSupportVectors();
const int sv_total = sv.rows;
cv::Mat alpha, svidx;
double rho = svm->getDecisionFunction(0, alpha, svidx);
CV_Assert(alpha.total() == 1 && svidx.total() == 1 && sv_total == 1);
CV_Assert((alpha.type() == CV_64F && alpha.at<double>(0) == 1.) ||
(alpha.type() == CV_32F && alpha.at<float>(0) == 1.f));
CV_Assert(sv.type() == CV_32F);
std::vector< float > hog_detector(sv.cols + 1);
memcpy(&hog_detector[0], sv.ptr(), sv.cols * sizeof(hog_detector[0]));
hog_detector[sv.cols] = (float)-rho;
return hog_detector;
}
void train(const std::string& posi_dir, const std::string& nega_dir, const std::string& save_pathname,
cv::HOGDescriptor* hog_descriptor)
{
//创建一个SVM分类器
cv::Ptr< cv::ml::SVM > svm = cv::ml::SVM::create();
svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS, 1000, 1e-3));
//使用线性SVM
svm->setKernel(cv::ml::SVM::LINEAR);
svm->setType(cv::ml::SVM::C_SVC);
//定义标签数组
std::vector< int > labels;
//导入正样本,并进行特征提取
std::cout << "--->载入正样本..." << std::endl;
std::vector<cv::Mat> feature_set = collectFeatureSet(posi_dir, hog_descriptor, true);
labels.assign(feature_set.size(), +1);
std::cout << "正样本数量:" << feature_set.size() << std::endl;
//导入负样本,并进行特征提取
std::cout << "--->载入负样本..." << std::endl;
std::vector<cv::Mat> nega_feature_buffer = collectFeatureSet(nega_dir, hog_descriptor, false);
labels.insert(labels.end(), nega_feature_buffer.size(), -1);
feature_set.insert(feature_set.end(), nega_feature_buffer.begin(), nega_feature_buffer.end());
std::cout << "负样本数量:" << nega_feature_buffer.size() << std::endl;
cv::Mat train_data;
convertToML(feature_set, train_data);
cv::Ptr<cv::ml::TrainData> svm_train_auto_data = cv::ml::TrainData::create(train_data, cv::ml::SampleTypes::ROW_SAMPLE, labels);
std::cout << "--->开启训练SVM..." << std::endl;
svm->trainAuto(svm_train_auto_data);
//保存目标检测模型
hog_descriptor->setSVMDetector(getSvmDetector(svm));
hog_descriptor->save(save_pathname);
std::cout << "--->保存检测模型:" << save_pathname <<std::endl;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
SVM+HOG车牌检测含数据集 (2000个子文件)
main.cpp 7KB
4135.jpg 176KB
279.jpg 175KB
3941.jpg 170KB
1630.jpg 168KB
3570.jpg 168KB
2903.jpg 165KB
2069.jpg 165KB
809.jpg 165KB
464.jpg 165KB
4630.jpg 159KB
1864.jpg 156KB
2947.jpg 154KB
4801.jpg 150KB
3792.jpg 137KB
2592.jpg 135KB
4166.jpg 134KB
4474.jpg 133KB
4251.jpg 133KB
4068.jpg 132KB
3198.jpg 130KB
443.jpg 129KB
269.jpg 129KB
1743.jpg 128KB
3505.jpg 127KB
3429.jpg 126KB
1361.jpg 126KB
3125.jpg 126KB
1244.jpg 126KB
4509.jpg 124KB
3322.jpg 124KB
4284.jpg 123KB
3184.jpg 123KB
4109.jpg 122KB
2201.jpg 122KB
3367.jpg 122KB
2394.jpg 121KB
350.jpg 121KB
17.jpg 121KB
4215.jpg 121KB
4752.jpg 120KB
4266.jpg 120KB
883.jpg 120KB
4516.jpg 120KB
3420.jpg 119KB
1876.jpg 118KB
761.jpg 118KB
2446.jpg 118KB
2770.jpg 117KB
4774.jpg 117KB
35.jpg 117KB
3033.jpg 116KB
2591.jpg 116KB
554.jpg 116KB
889.jpg 116KB
1322.jpg 116KB
1506.jpg 116KB
3501.jpg 116KB
3023.jpg 115KB
2034.jpg 115KB
128.jpg 115KB
2002.jpg 115KB
1177.jpg 115KB
458.jpg 115KB
4898.jpg 114KB
2238.jpg 114KB
2129.jpg 114KB
2298.jpg 114KB
3209.jpg 113KB
2322.jpg 113KB
1236.jpg 113KB
1675.jpg 113KB
227.jpg 113KB
3327.jpg 113KB
1562.jpg 113KB
2133.jpg 113KB
4459.jpg 112KB
2011.jpg 112KB
621.jpg 112KB
4454.jpg 111KB
2058.jpg 111KB
655.jpg 111KB
3258.jpg 111KB
4947.jpg 111KB
804.jpg 111KB
3901.jpg 111KB
4989.jpg 110KB
4014.jpg 110KB
4241.jpg 110KB
3374.jpg 110KB
1109.jpg 110KB
4347.jpg 110KB
636.jpg 109KB
3256.jpg 109KB
1122.jpg 109KB
1668.jpg 108KB
2822.jpg 108KB
3920.jpg 108KB
3499.jpg 108KB
2516.jpg 107KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
深图智能
- 粉丝: 80
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Expanding Performance Boundaries of Open-Source Multimodal Models with Model, Data, and Test-Time Sc
- 实验 Linux常用命令.docx
- 智科2201-223260121-武明杰.docx
- 基于LSTM网络模型的新闻文本分类算法matlab仿真,区分真新闻和假新闻,包括程序,参考文献,中文注释,仿真操作步骤视频
- 禅道Windows安装包
- DevSideCar.exe是github的加速软件,支持npm加速,github加速等
- Day-02 指令修饰符(v-model)、v-bind进阶、计算属性(computed)、computed和methods方法的区别、watch监听器
- fuxiziliao.exe
- 瑞吉外卖项目学习笔记(一)资料
- 请问是大萨达防擦打完阿达 阿达
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功