opencv 手写选择题阅卷 (二)字符识别

opencv 手写选择题阅卷 (二)字符识别

选择题基本上只需要识别ABCD和空五个内容,理论上应该识别率比较高的,识别代码参考了网上搜索的代码,因为参考的网址比较多,现在也弄不清是参考何处的代码了,在这里就不一一感谢了.

基本步骤:

一,识别函数接受一般64X64的灰度图像;

二,二值化并反色为黑底白字;

三,找出字符的最小包围矩形,并大小归一化为32X32;

四,计算图像的HOG特征;

五,用SVM分类器对HOG特征进行识别,从而确定当前图像属于ABCD还是空白;

整个识别代码还是比较简单的.这得得益于opencv 对分类器的封装,除了图像预处理代码,实际识别代码只有几行;

部分代码

CvSVM svm;
int svm_inited = 0;

int svm_init(char * data_filename)
{
    svm.load(data_filename);//"HOG_SVM_DATA.xml"
    svm_inited = 1;
    return 0;
}


//
int svm_recognition(IplImage* image)
{
    if (svm_inited != 1){
        return -1; 
    }
    //预处理
    IplImage* test_img = cvCreateImage(cvSize(32, 32), 8, 1);
    preproc_img(image, test_img);//处理为黑底白字,并大小归一化

#ifdef _WIN32
    cvShowImage("Image", test_img);
    cvWaitKey(0);
#endif

    //特征提取
    HOGDescriptor *hog = new HOGDescriptor(cvSize(32, 32), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);
    vector<float> descriptors;//存放结果
    hog->compute(test_img, descriptors, Size(1, 1), Size(0, 0)); //Hog特征计算
    cvReleaseImage(&test_img);//释放不需要的图像,释放内存

    //生成要检测的特征数据矩阵
    CvMat * mat_samples = cvCreateMat(1, descriptors.size(), CV_32FC1);
    int n = 0;
    for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
    {
        cvmSet(mat_samples, 0, n, *iter);
        n++;
    }

    //识别
    int ret = svm.predict(mat_samples);//检测结果

    cvReleaseMat(&mat_samples);
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值