使用Opencv+SVM+Hog进行行人识别的代码

2023-11-13

OpenCV

//��ʾͼ���ļ�  
#include <iostream>    
#include <fstream>    
#include <string>    
#include <vector> 
#include <opencv2/opencv.hpp>  
#include<opencv2/ml.hpp>
using namespace std;
using namespace cv;

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
void train_data(const char* data_path,const char* save_path);
void svm_test(const char* svn_data_path, const char* test_data_path);

int main()
{
    train_data("Resource/train_data.txt","svm_data.xml");
    return 1;
    vector<string> img_path;
    vector<int> img_label;

    const char* air_label = "airplanes";
    const char* train_dir_path = "Resource/train_images";
    char data_path[128] = {0};
    sprintf(data_path, "%s/%s.txt", train_dir_path, air_label);
    ifstream svm_data(data_path);
    if (svm_data.fail())return -1;
    string fileName;
    while (getline(svm_data, fileName))
    {

        char full_path[128] = { 0 };
        sprintf(full_path, "%s/%s/%s", train_dir_path, air_label, fileName.c_str());
        printf("%s\n", full_path);
        img_path.push_back(string(full_path));
    }
    svm_data.close();
    Mat data_mat, res_mat;
    int nImgNum = img_path.size();
    res_mat = Mat::zeros(nImgNum, 1, CV_32FC1);
    Mat src;
    Mat trainImg = Mat::zeros(64, 64, CV_8UC3);//��Ҫ������ͼƬ  

    for (string::size_type i = 0; i != img_path.size(); i++)
    {
        src = imread(img_path[i].c_str(), 1);
        resize(src, trainImg, Size(64, 64), 0, 0, INTER_CUBIC);

        HOGDescriptor hog = HOGDescriptor(cvSize(64, 64), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);  //������˼���ο�����1,2       
        vector<float>descriptors;//�������  
        hog.compute(trainImg, descriptors, Size(1, 1), Size(0, 0)); //���ü��㺯����ʼ����    
        if (i == 0)
        {
            data_mat = Mat::zeros(nImgNum, descriptors.size(), CV_32FC1); //��������ͼƬ��С���з���ռ�
        }
        int n = 0;
        for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
        {
            data_mat.at<float>(i, n) = *iter;
            n++;
        }
        res_mat.at<float>(i, 0) = i%2;

    }

    CvSVM svm;//�½�һ��SVM      
    CvSVMParams param;//�����Dz���  
    CvTermCriteria criteria;
    criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
    param = CvSVMParams(CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria);
    /*
    SVM���ࣺCvSVM::C_SVC
    Kernel�����ࣺCvSVM::RBF
    degree��10.0���˴β�ʹ�ã�
    gamma��8.0
    coef0��1.0���˴β�ʹ�ã�
    C��10.0
    nu��0.5���˴β�ʹ�ã�
    p��0.1���˴β�ʹ�ã�
    Ȼ���ѵ���������滯������������CvMat�͵������
    */
    //����������(5)SVMѧϰ�������������           
    svm.train(data_mat, res_mat, Mat(), Mat(), param);//ѵ����      
                                                    //�������ѵ�����ݺ�ȷ����ѧϰ����,����SVMѧϰ�����       
    svm.save("SVM_DATA.xml");

    return 1;

    //const char *pstrImageName = "Resource/train_images/airplanes/image_0001.jpg";
    //const char *pstrWindowsTitle = "OpenCV";

    ���ļ��ж�ȡͼ��  
    //IplImage *pImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);

    ��������  
    //cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);

    ��ָ����������ʾͼ��  
    //cvShowImage(pstrWindowsTitle, pImage);

    �ȴ������¼�  
    //cvWaitKey();

    //cvDestroyWindow(pstrWindowsTitle);
    //cvReleaseImage(&pImage);
    return 0;
}
void train_data(const char* data_path, const char* save_path)
{
    vector<string> img_path;
    vector<int> img_label;
    int index = 0;
    ifstream svm_data(data_path);
    if (svm_data.fail())return;
    string line;
    while (getline(svm_data, line))
    {
        if (index % 2 == 0)
        {
            img_label.push_back(atoi(line.c_str()));
        }
        else
        {
            img_path.push_back(line);
        }

        index++;
    }
    svm_data.close();
    Mat data_mat, res_mat;
    int nImgNum = img_label.size();
    res_mat = Mat::zeros(nImgNum, 1, CV_32FC1);
    Mat src;
    Mat trainImg = Mat::zeros(64, 64, CV_8UC3);//��Ҫ������ͼƬ  

    for (string::size_type i = 0; i != nImgNum; i++)
    {
        src = imread(img_path[i].c_str(), 1);
        resize(src, trainImg, Size(64, 64), 0, 0, INTER_CUBIC);

        HOGDescriptor hog = HOGDescriptor(cvSize(64, 64), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);  //������˼���ο�����1,2       
        vector<float>descriptors;//�������  
        hog.compute(trainImg, descriptors, Size(1, 1), Size(0, 0)); //���ü��㺯����ʼ����    
        if (i == 0)
        {
            data_mat = Mat::zeros(nImgNum, descriptors.size(), CV_32FC1); //��������ͼƬ��С���з���ռ�
        }
        int n = 0;
        for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
        {
            data_mat.at<float>(i, n) = *iter;
            n++;
        }
        res_mat.at<float>(i, 0) = img_label[i];

    }

    CvSVM svm;//�½�һ��SVM      
    CvSVMParams param;//�����Dz���  
    CvTermCriteria criteria;
    criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
    param = CvSVMParams(CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria);
    /*
    SVM���ࣺCvSVM::C_SVC
    Kernel�����ࣺCvSVM::RBF
    degree��10.0���˴β�ʹ�ã�
    gamma��8.0
    coef0��1.0���˴β�ʹ�ã�
    C��10.0
    nu��0.5���˴β�ʹ�ã�
    p��0.1���˴β�ʹ�ã�
    Ȼ���ѵ���������滯������������CvMat�͵������
    */
    //����������(5)SVMѧϰ�������������           
    svm.train(data_mat, res_mat, Mat(), Mat(), param);//ѵ����      
                                                      //�������ѵ�����ݺ�ȷ����ѧϰ����,����SVMѧϰ�����       
    svm.save(save_path);

}
void svm_test(const char* svm_data_path, const char* test_data_path)
{
    CvSVM svm;
    svm.load(svm_data_path);
    vector<string> img_test_path;
    ifstream img_path_input(test_data_path);
    if (img_path_input.fail())return;
    string line;
    while (getline(img_path_input,line))
    {
        img_test_path.push_back(line);
    }
    int nImgNum = img_test_path.size();

    for (string::size_type i = 0; i != nImgNum; i++)
    {
        Mat src = imread(img_test_path[i].c_str(), 1);
        Mat trainImg = Mat::zeros(64, 64, CV_8UC3);
        resize(src, trainImg, Size(64, 64), 0, 0, INTER_CUBIC);
        HOGDescriptor hog = HOGDescriptor(cvSize(64, 64), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);  //������˼���ο�����1,2       
        vector<float>descriptors;//�������  
        hog.compute(trainImg, descriptors, Size(1, 1), Size(0, 0)); //���ü��㺯����ʼ����
        Mat svm_mat = Mat::zeros(nImgNum, descriptors.size(), CV_32FC1);
        int n = 0;
        for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
        {
            svm_mat.at<float>(i, n) = *iter;
            n++;
        }
        int ret = svm.predict(svm_mat);
        printf("predict:%d | path:%s\n", ret, img_test_path[i].c_str());
    }
}

文章来源:https://www.ebaina.com/articles/140000004380

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Opencv+SVM+Hog进行行人识别的代码 的相关文章

  • 华为OD机试真题-矩阵元素的边界值-2023年OD统一考试(B卷)

    题目描述 给定一个N M矩阵 请先找出M个该矩阵中每列元素的最大值 然后输出这M个值中的最小值 补充说明 N和M的取值范围均为 0 100 示例1 输入 1 2 3 4 输出 3 说明 第一列元素为 1和3 最大值为3 第二列元素为 2和4
  • python奥特曼代码_【Python】奥特曼VS小怪兽、大战300回合

    上一节 lt gt 上一节我们学了类的基本使用 为了巩固学习 今天继续使用 类 来编程 好好学习 天天打卡 今天我们要研究的是 奥特曼打小怪兽 游戏策划 不要觉得没有用 题目 写出一个 奥特曼 和 小怪兽 类 基本属性有名字 生命值和魔法值
  • 服务的分类

    从技术实现角度和业务角度切入 来梳理服务的类别与层次 1 服务的基本类别 工具 实体和任务 工具服务 标准Api的封装 如JMS JDBC 公共功能区域的提炼 如消息传递 HTTP服务 安全性 非功能性需求的抽取 如拓展性 可用性 以及常见
  • Android Property System

    属性系统是android的一个重要特性 它作为一个服务运行 管理系统配置和状态 所有这些配置和状态都是属性 每个属性是一个键值对 key value pair 其类型都是字符串 从功能上看 属性与windows系统的注册表非常相似 许多an
  • 浅谈深拷贝和浅拷贝的区别

    举例 假设B复制了A 当修改A时 看B是否会发生变化 如果B也跟着变了 说明这是浅拷贝 如果B没变 那就是深拷贝 阐述一下栈堆 基本数据类型与引用数据类型 因为这些概念能更好的让你理解深拷贝与浅拷贝 一 预备知识 两种不同数据类型的值 基本

随机推荐

  • 静态/动态博客Blog框架简介

    简言之 Blog就是以网络作为载体 简易迅速便捷地发布自己的心得 及时有效轻松地与他人进行交流 再集丰富多彩的个性化展示于一体的综合性平台 博客搭建的方式 总体来说 Blog搭建的方式可以分为静态博客和动态博客 顾名思义 静态博客 博文内容
  • css强制一行显示超出的部分显示点点点

    要达到的效果 1 首先盒子应该有固定的宽度 width 200px 2 设置 溢出隐藏 overflow hidden 3 设置文本强制在一行显示 white space nowrap 4 设置文本溢出显示省略号 text overflow
  • js判断多个数组之间是否存在交集

    代码如下 定义一个二维数组 数组中包含N个数组 const arrays 1 2 3 4 5 6 2 7 8 9 10 2 把数组传入进来 function checkIntersection arrays for let i 0 i lt
  • 【小程序】那些年小程序碰过的坑——Scroll-view跳转问题

    序 写到scroll view 就不得不涉及到其中的各个Object属性 但是这个控件本身又很奇特 属性内部经常自相矛盾 着实让人头疼不已 好记性不如烂笔头 记录下来警示自己 也帮助他人 何乐而不为呢 正文 要想Scrolliew进行跳转
  • mat1 and mat2 shapes cannot be multiplied (128x432 and 576x64)的解决

    仅作为记录 大佬请跳过 今天博主在跑大佬博主的pytorch cnn分类mnist数据集的程序 大佬博主文章 第四个网络 出现问题 经过尝试 发现是在定义网络中的问题 将x x view 128 1 改为x x view 1 64 3 3
  • error: struct type mismatch between shaders for uniform (named light)

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 错误原因 二 排查错误 1 使用glslangValidator exe工具 2 顶点着色器着色器1 vert1Shader vert 顶点着色器着色器2 vert2S
  • 【GD32F427开发板试用】 CAN总线收发测试

    本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动 更多开发板试用活动请关注极术社区网站 作者 meijing 这篇测试下CAN通信的收发测试 代码使用库例程中修改 硬件部分 测试用到了CAN0 串口0和定时器1 1 gt
  • 【读书笔记】Linux高性能服务器编程(第二篇 第五章)

    第五章 Linux网络编程基础API 5 1 socket地址API 5 1 1 主机字节序和网络字节序 字节序分为 1 大端字节序 一个整数的高位字节 23 31 bit 存储在内存的低地址处 低位字节 0 7 bit 存储在内存的高地址
  • okhttp Retrofit统一处理返回请求 okhttp Retrofit统一处理返回数据

    okhttp Retrofit统一处理返回请求 okhttp Retrofit统一处理返回数据 Gson gson new GsonBuilder serializeNulls create 1 配置创建okhttp客户端 OkHttpCl
  • 《Python核心编程》读书笔记

    第一章 Python对象 1 1 Python对象 Python使用对象模型来存储数据 所有的Python对象都有三个特性 身份 类型和值 身份可以使用内建函数id 得到 类型可以使用内建函数type 查看 1 2 标准类型 数字 整形 I
  • WGS84的理解

    转载 https support virtual surveyor com en support solutions articles 1000261351 what is wgs84 text When 20you 20determine
  • Xilinx AXI VIP使用教程

    Xilinx提供了用于验证AXI相关设计的AXI VIP AXI Verification IP 它可以对自己设计的AXI接口模块进行全方位的验证 如使用VIP的Master Passthrough Slave三种模式对自己写的AXI接口进
  • 宝塔面板登录失败

    这是七月初出现的宝塔面板登录问题 如下 登录界面一直在转圈圈 只是最近两周在写项目和刷算法题 无暇顾及这个问题 现在给出解决方法 2023 07 24午 首先保证网络环境良好 手机热点很不靠谱的 最好是直连路由器 家里的或者学校宿舍的 其实
  • 面板数据实证过程-基于政府补贴对企业研发投入的影响分析

    一 数据来源 国泰安CSMAR 二 数据对象 同花顺BKDC26股票 新能源板块 内所有上市公司 剔除ST及数据缺失的公司 三 年份选取 2016 2019年 四 变量列举 变量表 被解释变量 RDratio 企业研发投入程度 主解释变量
  • 如何调用高德地图api

    首先注册成为高德地图开发者 创建应用后申请key 1 引入高德地图API 2 创建地图容器 div div width 300px height 180px 指定大小样式 3 创建默认地图 方式一 var map new AMap Map
  • 饥荒专用服务器全图显示代码,饥荒地图怎么看 饥荒地图全开代码

    最近很多玩家表示在玩 饥荒 的时候 经常会有遇到各种各样的问题 比如新建一个世界然后辛辛苦苦跑完整张地图 结果发现世界里没猪王 整个地图居然没有六眼飞虫雕像 猪王雕像地洞各种靠的近 结果发现全图没海象 小编今天为各位玩家带来了一些解决问题的
  • mysql的全量备份和增量备份

    文章目录 全量备份 1 创建mysqldump脚本 1 1 找一个目录 这里选择放到 data mysqlbackup下 创建shell脚本 1 2 添加内容 1 3给脚本赋予执行权限 2 crontab 2 1查看cron状态 2 1创建
  • GTX1660TI 算力

    7 5
  • 前端面试题 vue专项,共计58道

    vue篇 1 什么是MVVM 2 Vue声明周期 3 为什么vue中data必须是一个函数 4 vue router有几种导航钩子 5 Vue的v show和v if区别 6 vue loader是什么 使用它的用途有哪些 7 计算属性和w
  • 使用Opencv+SVM+Hog进行行人识别的代码

    OpenCV include