您的位置:首页 > 理论基础 > 计算机网络

opencv 车牌字符分割 ANN网络识别字符

2017-10-05 22:59 471 查看
  最近在复习OPENCV的知识,学习caffe的深度神经网络,正好想起以前做过的车牌识别项目,可以拿出来研究下

  

  以前的环境是VS2013和OpenCV2.4.9,感觉OpenCV2.4.9是个经典版本啊!不过要使用caffe模型的话,还是要最新的OpenCV3.3更合适!

  一、车牌图片库

  以前也是网上下的,如果找不到的小伙伴可以从我这儿下: 链接:http://pan.baidu.com/s/1hrQF92G 密码:43jl

  里面有数字 “0-9”,字母“A-Z”的训练图片各50张。

  

  测试车牌图片当时是从他人得到已经定位到车牌的图片,类似如下:

void predictann(Mat testroi)
{
//测试神经网络
CvANN_MLP bp;
bp.load("E:\\vswork\\CarNumRecog\\bpcharModel.xml");
const int image_cols = 8;
const int image_rows = 16;

cout << "测试:" << endl;
//Mat test_image = imread("E:\\vswork\\charSamples\\3.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat test_temp;
resize(testroi, test_temp, Size(image_cols, image_rows), (0, 0), (0, 0), CV_INTER_AREA);//使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现
threshold(test_temp, test_temp, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
Mat_<float>sampleMat(1, image_rows*image_cols);
for (int i = 0; i<image_rows*image_cols; ++i)
{
sampleMat.at<float>(0, i) = (float)test_temp.at<uchar>(i / 8, i % 8);
}

Mat responseMat;
bp.predict(sampleMat, responseMat);
Point maxLoc;
double maxVal = 0;
minMaxLoc(responseMat, NULL, &maxVal, NULL, &maxLoc);
char temp[256];

if (maxLoc.x <= 9)//0-9
{
sprintf(temp, "%d", maxLoc.x);
//printf("%d\n", i);
}
else//A-Z
{
sprintf(temp, "%c", maxLoc.x + 55);
//printf("%c\n", i+55);
}

cout << "识别结果:" << temp << "    相似度:" << maxVal * 100 << "%" << endl;
imshow("test_image", testroi);
waitKey(0);

return;
}


predictann
  predictann函数就是调用ann10函数生成的网络模型文件,进行预测分类的功能。

  上述车牌的单字符识别效果如下:

  

  

  


  可以看到有的相似度很高,有的却很低,也有一些识别错误的,我不再显示。。。

  相比之前使用的caffe mnist识别率真的是差距有点大,以后有机会将mnist的模型来识别车牌字符试试~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: