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)