学习OpenCV——HOG+SVM

#include "cv.h"
#include "highgui.h"
#include "stdafx.h"
#include <ml.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    vector<string> img_path;
    vector<int> img_catg;
    int nLine = 0;
    string buf;
    ifstream svm_data( "E:/SVM_DATA.txt" );
    unsigned long n;

    while( svm_data )
    {
        if( getline( svm_data, buf ) )
        {
            nLine ++;
            if( nLine % 2 == 0 )
            {
                 img_catg.push_back( atoi( buf.c_str() ) );//atoi将字符串转换成整型,标志(0,1)
            }
            else
            {
                img_path.push_back( buf );//图像路径
            }
        }
    }
    svm_data.close();//关闭文件

    CvMat *data_mat, *res_mat;
    int nImgNum = nLine / 2;            //读入样本数量
    ////样本矩阵,nImgNum:横坐标是样本数量, WIDTH * HEIGHT:样本特征向量,即图像大小
    data_mat = cvCreateMat( nImgNum, 1764, CV_32FC1 );
    cvSetZero( data_mat );
    //类型矩阵,存储每个样本的类型标志
    res_mat = cvCreateMat( nImgNum, 1, CV_32FC1 );
    cvSetZero( res_mat );

    IplImage* src;
    IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);//需要分析的图片

    for( string::size_type i = 0; i != img_path.size(); i++ )
    {
            src=cvLoadImage(img_path[i].c_str(),1);
            if( src == NULL )
            {
                cout<<" can not load the image: "<<img_path[i].c_str()<<endl;
                continue;
            }

            cout<<" processing "<<img_path[i].c_str()<<endl;

            cvResize(src,trainImg);   //读取图片
            HOGDescriptor *hog=new 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)); //调用计算函数开始计算
            cout<<"HOG dims: "<<descriptors.size()<<endl;
            //CvMat* SVMtrainMat=cvCreateMat(descriptors.size(),1,CV_32FC1);
            n=0;
            for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
            {
                cvmSet(data_mat,i,n,*iter);
                n++;
            }
                //cout<<SVMtrainMat->rows<<endl;
            cvmSet( res_mat, i, 0, img_catg[i] );
            cout<<" end processing "<<img_path[i].c_str()<<" "<<img_catg[i]<<endl;
    }

    CvSVM svm = CvSVM();
    CvSVMParams param;
    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, NULL, NULL, param );
    //☆☆利用训练数据和确定的学习参数,进行SVM学习☆☆☆☆
    svm.save( "SVM_DATA.xml" );  

    //检测样本
    IplImage *test;
    vector<string> img_tst_path;
    ifstream img_tst( "E:/SVM_TEST.txt" );
    while( img_tst )
    {
        if( getline( img_tst, buf ) )
        {
            img_tst_path.push_back( buf );
        }
    }
    img_tst.close();

    CvMat *test_hog = cvCreateMat( 1, 1764, CV_32FC1 );
    char line[512];
    ofstream predict_txt( "SVM_PREDICT.txt" );
    for( string::size_type j = 0; j != img_tst_path.size(); j++ )
    {
        test = cvLoadImage( img_tst_path[j].c_str(), 1);
        if( test == NULL )
        {
             cout<<" can not load the image: "<<img_tst_path[j].c_str()<<endl;
               continue;
         }

        cvZero(trainImg);
        cvResize(test,trainImg);   //读取图片
        HOGDescriptor *hog=new 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)); //调用计算函数开始计算
        cout<<"HOG dims: "<<descriptors.size()<<endl;
        CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);
        n=0;
        for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
            {
                cvmSet(SVMtrainMat,0,n,*iter);
                n++;
            }

        int ret = svm.predict(SVMtrainMat);
        sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret );
         predict_txt<<line;
    }
    predict_txt.close();

//cvReleaseImage( &src);
//cvReleaseImage( &sampleImg );
//cvReleaseImage( &tst );
//cvReleaseImage( &tst_tmp );
cvReleaseMat( &data_mat );
cvReleaseMat( &res_mat );

return 0;
}

from: http://blog.csdn.net/yangtrees/article/details/7471222

时间: 2024-10-13 19:02:03

学习OpenCV——HOG+SVM的相关文章

利用opencv的hog+svm实现细胞识别分类器

利用opencv的hog+svm实现细胞识别分类器 图像处理中的细胞识别和人脸识别可以这样来类比,图像中的一张张人脸就是一个个细胞. 模式识别的关键在于样本库的选取,识别率也只能在和样本库比较接近的环境下才能保证.主要工作是三部分一是特征提取,二是样本库的训练train,三是目标检测detect. 一.特征提取 特征提取采用的是HOG特征即HOG描述子,该特征在行人检测中效果非常好.而一般人脸识别采用的是haar特征,这在opencv中都有实现,并都给出了相应的分类器,效果都很不错. 首先采集了

opencv的svm学习_1

概述 本篇是对opencv的svm学习笔记,基于对opencv官方svm教程的修改和记录.opencv的svm教程如下: 官网原版:http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html#introductiontosvms 汉语翻译版:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/ml/introductio

HOG + SVM(行人检测, opencv实现)

HOG+SVM流程 1.提取HOG特征 灰度化 + Gamma变换(进行根号求解) 计算梯度map(计算梯度) 图像划分成小的cell,统计每个cell梯度直方图 多个cell组成一个block, 特征归一化 多个block串接,并归一化 2.训练SVM分类器 原文地址:https://www.cnblogs.com/my-love-is-python/p/11110277.html

opencv使用svm

作者 群号 C语言交流中心 240137450  微信 15013593099 OpenCV开发SVM算法是基于LibSVM软件包开发的,LibSVM是台湾大学林智仁(LinChih-Jen)等开发设计的一个简单.易于使用和快速有效的SVM模式识别与回归的软件包.用OpenCV使用SVM算法的大概流程是 1)设置训练样本集 需要两组数据,一组是数据的类别,一组是数据的向量信息. 2)设置SVM参数 利用CvSVMParams类实现类内的成员变量svm_type表示SVM类型: CvSVM::C_

第十八节、基于传统图像处理的目标检测与识别(HOG+SVM附代码)

其实在深度学习分类中我们已经介绍了目标检测和目标识别的概念.为了照顾一些没有学过深度学习的童鞋,这里我重新说明一次:目标检测是用来确定图像上某个区域是否有我们要识别的对象,目标识别是用来判断图片上这个对象是什么.识别通常只处理已经检测到对象的区域,例如,人们总是会使在已有的人脸图像的区域去识别人脸. 传统的目标检测方法与识别不同于深度学习方法,后者主要利用神经网络来实现分类和回归问题.在这里我们主要介绍如何利用OpecnCv来实现传统目标检测和识别,在计算机视觉中有很多目标检测和识别的技术,这里

python实现HOG+SVM对CIFAR-10数据集分类(上)

本博客只用于学习,如果有错误的地方,恳请指正,如需转载请注明出处. 看机器学习也是有一段时间了,这两天终于勇敢地踏出了第一步,实现了HOG+SVM对图片分类,具体代码可以在github上下载,https://github.com/subicWang/HOG-SVM-classifer.大家都说HOG+SVM是在行人检测中很合拍的一对.至于为啥,我也讲不清楚.我猜想这么合拍的一对应用在图片分类上效果应该也不错吧,事实证明确实还行,速度挺快,分类正确率还行.我用的数据集是http://www.cs.

hog&amp;svm

hog&svm的方法已经非常经典,广泛使用在多种行业,并且集成在了硬件中.应该说作为运动检测的一种重要方法,使用的情况还是非常广泛的. (opencv自带的分类器) int main() { Mat src = imread( "1.png"); HOGDescriptor hog; //HOG特征检测器 hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); //设置SVM分类器为默认参数 vector&l

HOG+SVM

#include "cv.h" #include "highgui.h" #include "stdafx.h" #include <ml.h> #include <iostream> #include <fstream> #include <string> #include <vector> using namespace cv; using namespace std; int ma

opencv中SVM的那些事

最近在搞人脸性别识别,用到了opencv中封装的SVM分类器,遇到了一些小问题,解决之后感觉对其理解更深一点了,总结下. 首先,理解下SVM得输入格式.SVM的train()函数主要包含两个输入数据:训练数据矩阵以及对应标签组成的矩阵.其中训练数据为行向量,标签矩阵为列向量.举个例子吧,比如在实验里一共用到300张图片作为训练数据,其中150张为正例样本,150张为负例样本,那么最终得到的训练数据矩阵大小应为150行n列,这里的n代表的就是每一张图片进行特征提取(包括下采样的方法)之后的特征维数