opencv基于svm的车牌字符识别1

opencv基于svm的车牌识别1

小任务做完记录一下思路
可以把车牌识别分为两个步骤
1.对于目标图片的预处理。
2.用svm向量机训练车牌字符素材得到xml文件再识别。

对于步骤1:
先在百度上搜一张图片在这里插入图片描述
先把车牌区域分离出来,我就用以bgr通道inrange实现二值化,这样感觉是最简单的。`

inrange的参数不好找就先用滑动条

static int maxB=80;
static int maxG=80;
static int maxR=80;
static int minB=40;
static int minG=40;
static int minR=40;
static Mat blur1Image;
#define WINDOW_NAME "control"

void FindTarget(Mat &srcImage)
{
   
    namedWindow(WINDOW_NAME,CV_WINDOW_AUTOSIZE);
    blur(srcImage,blur1Image,Size(5,5));
    createTrackbar("minB", WINDOW_NAME, &minB, 255,on_Trackbar );
    createTrackbar("maxB", WINDOW_NAME, &maxB, 255,on_Trackbar);
    createTrackbar("minG", WINDOW_NAME, &minG, 255,on_Trackbar);
    createTrackbar("maxG", WINDOW_NAME, &maxG, 255,on_Trackbar);
    createTrackbar("minR", WINDOW_NAME, &minR, 255,on_Trackbar);
    createTrackbar("maxR", WINDOW_NAME, &maxR, 255,on_Trackbar);
    on_Trackbar(minB,0);
}

void on_Trackbar(int ,void *)
{
   
    Mat imgThresholded;
    vector<Mat> imgBGRs;


    split(blur1Image,imgBGRs);

    merge(imgBGRs,blur1Image);
    inRange(blur1Image,Scalar(minB,minG,minR),Scalar(maxB,maxG,maxR),imgThresholded);
    imshow("thresholded",imgThresholded);
}

找到了inrange合适的参数后,通过二值化再找轮廓,轮廓进行筛选,用boundrect得到最小轮廓矩形,作为ROI保存下来。

    Mat blurImage;
    blur(target,blurImage,Size(5,5));
    Mat imgThresholded;
    vector<Mat> imgBGRs;

    split(blurImage,imgBGRs);

    merge(imgBGRs,blurImage);
    inRange(blurImage,Scalar(0,133,0),Scalar(255,255,91),imgThresholded);
    imshow("thresholded",imgThresholded);


    vector<vector<Point>> contours;                                                 //找轮廓
    vector<Vec4i> hierarchy;
    findContours(imgThresholded,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point(0,0));
    cout<<"the size of contours is:"<<contours.size()<<endl;
    RNG rng(12345);
    Mat drawing=Mat::zeros(imgThresholded.size(),CV_8UC3);
    vector<vector<Point>>::iterator itc=contours.begin();
    vector<Vec4i>::iterator itc_hierarchy=hierarchy.begin();
    vector<Rect> boundrect(contours.size());

    for(;itc!=contours.end();)
    {
   
        float contour_area=abs(contourArea(*itc));
        if(contour_area<100)
        {
   
            itc=contours.erase(itc);
            itc_hierarchy=hierarchy.erase(itc_hierarchy);

        }
        else
        {
   
            itc++;
            itc_hierarchy++;

        }
    }
    for(int i=0;i<contours.size();i++)                  //记录矩形框
    {
   
        Rect rect=boundingRect(contours[i]);
        boundrect[i]=rect;
    }
    Mat ROI;
    for(size_t i=0;i<contours.size();i++)
    {
   

        Scalar color=Scalar(rng.uniform(32,235),rng.uniform(23,232),rng.uniform(21,255));
        cout<<boundrect[i].tl()<<' '<<boundrect[i].br()<<endl;
        drawContours(drawing,contours, static_cast<int>(i),color,2,8,hierarchy,0,Point(0,0)
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值