OpenCV学习之路——车牌识别之车牌定位

去年七月份因为学校项目需要开始接触图像处理,但那时候只是到网上找车牌识别代码,然后加入到自己的项目中,不清楚细节原理。

现在自己重新一步步实现车牌识别。

高斯模糊:

1 Mat Gaussian(Mat &img) {
2     Mat out;
3     GaussianBlur(img, out, Size(3, 3),
4         0, 0, BORDER_DEFAULT);
5     return out;
6
7 }

灰度化:

1 Mat Grayscale(Mat &img) {
2     Mat out;
3     cvtColor(img, out, CV_RGB2GRAY);
4
5     return out;
6 }

Sobel算子(X方向):

 1 Mat Sobel(Mat &img) {
 2     Mat out;
 3     Mat grad_x, grad_y;
 4     Mat abs_grad_x, abs_grad_y;
 5
 6     //X方向
 7     //Sobel(img, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
 8     //convertScaleAbs(grad_x, abs_grad_x);
 9     Sobel(img, img, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
10     convertScaleAbs(img, out);
11
12     //Y方向
13     //Sobel(img, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
14     //convertScaleAbs(grad_y, abs_grad_y);
15     //convertScaleAbs(img, out);
16
17     //合并
18     //addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, out);
19
20     return out;
21 }

二值化:

1 Mat TwoValued(Mat &img) {
2     Mat out;
3     threshold(img, out, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);
4     //threshold(img, out, 100, 255, CV_THRESH_BINARY);
5
6     return out;
7 }

闭操作:

1 Mat Close(Mat &img) {
2     Mat out;
3     //Mat element(5, 5, CV_8U, cv::Scalar(1));
4     Mat element = getStructuringElement(MORPH_RECT, Size(17, 5));
5     morphologyEx(img, out, cv::MORPH_CLOSE, element);
6
7     return out;
8 }

取轮廓:

  1 void Contour(Mat &img, Mat &out) {
  2     RNG rng(12345);
  3
  4     vector< Mat > contours(1000);
  5     vector<Vec4i> hierarchy(1000);
  6     findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
  7
  8
  9     vector< Mat >::iterator itc = contours.begin();
 10     vector<RotatedRect> rects;
 11     int t = 0;
 12     while (itc != contours.end()) {
 13         //Create bounding rect of object
 14         RotatedRect mr = minAreaRect(Mat(*itc));
 15         //large the rect for more
 16         if (!verifySizes(mr)) {
 17             itc = contours.erase(itc);
 18         }
 19         else {
 20             ++itc;
 21             rects.push_back(mr);
 22         }
 23    }
 24
 25     cv::Mat result;
 26     img.copyTo(result);
 27     for (int i = 0; i< contours.size(); i++)
 28     {
 29         drawContours(result, contours, i, Scalar(0, 0, 255), 2, 8, vector<Vec4i>(), 0, Point());
 30         //drawContours(result, contours, i, Scalar(255), 2);
 31     }
 32
 33     //imshow("MASK11", result);
 34
 35     for (int i = 0; i < rects.size(); i++) {
 36         circle(result, rects[i].center, 3, Scalar(0, 255, 0), -1);
 37
 38         float minSize = (rects[i].size.width < rects[i].size.height) ? rects[i].size.width : rects[i].size.height;
 39         //minSize = minSize - minSize*0.5;
 40
 41         srand(time(NULL));
 42         Mat mask;
 43         mask.create(out.rows + 2, out.cols + 2, CV_8UC1);
 44         mask = Scalar::all(0);
 45         int loDiff = 30;
 46         int upDiff = 30;
 47         int connectivity = 4;
 48         int newMaskVal = 255;
 49         int NumSeeds = 10;
 50         Rect ccomp;
 51         int flags = connectivity + (newMaskVal << 8) + CV_FLOODFILL_FIXED_RANGE + CV_FLOODFILL_MASK_ONLY;
 52
 53         for (int j = 0; j < NumSeeds; j++) {
 54             Point seed;
 55             seed.x = rects[i].center.x + rand() % (int)minSize - (minSize / 2);
 56             seed.y = rects[i].center.y + rand() % (int)minSize - (minSize / 2);
 57             circle(result, seed, 1, Scalar(0, 255, 255), -1);
 58             int area = floodFill(out, mask, seed, Scalar(255, 0, 0), &ccomp, Scalar(loDiff, loDiff, loDiff), Scalar(upDiff, upDiff, upDiff), flags);
 59         }
 60
 61         //imshow("MASK", mask);
 62
 63         vector<Point> pointsInterest;
 64         Mat_<uchar>::iterator itMask = mask.begin<uchar>();
 65         Mat_<uchar>::iterator end = mask.end<uchar>();
 66         for (; itMask != end; ++itMask)
 67             if (*itMask == 255)
 68                 pointsInterest.push_back(itMask.pos());
 69
 70         RotatedRect minRect = minAreaRect(pointsInterest);
 71
 72         if (verifySizes(minRect)) {
 73             // rotated rectangle drawing
 74             Point2f rect_points[4]; minRect.points(rect_points);
 75             for (int j = 0; j < 4; j++)
 76                 line(result, rect_points[j], rect_points[(j + 1) % 4], Scalar(0, 0, 255), 1, 8);
 77
 78             //Get rotation matrix
 79             float r = (float)minRect.size.width / (float)minRect.size.height;
 80             float angle = minRect.angle;
 81             if (r < 1)
 82                 angle = 90 + angle;
 83             Mat rotmat = getRotationMatrix2D(minRect.center, angle, 1);
 84
 85             //Create and rotate image
 86             Mat img_rotated;
 87             warpAffine(out, img_rotated, rotmat, out.size(), CV_INTER_CUBIC);//实现旋转
 88
 89             //Crop image
 90             Size rect_size = minRect.size;
 91             if (r < 1)
 92                 swap(rect_size.width, rect_size.height);
 93             Mat img_crop;
 94             getRectSubPix(img_rotated, rect_size, minRect.center, img_crop);
 95
 96             Mat resultResized;
 97             resultResized.create(33, 144, CV_8UC3);
 98             resize(img_crop, resultResized, resultResized.size(), 0, 0, INTER_CUBIC);;
 99
100             ////Equalize croped image
101             Mat grayResult;
102             cvtColor(resultResized, grayResult, CV_BGR2GRAY);// CV_RGB2GRAY
103             blur(grayResult, grayResult, Size(3, 3));
104             grayResult = histeq(grayResult);
105
106             if (1) {
107                 stringstream ss(stringstream::in | stringstream::out);
108                 ss << "haha" << "_" << i << ".jpg";
109                 imwrite(ss.str(), grayResult);
110             }
111
112         }
113     }
114 }

主函数:

 1 int main() {
 2     Mat img;
 3     Mat out;
 4     //Mat result;
 5
 6     //载入图片
 7     img = imread("test1.jpg");//, CV_LOAD_IMAGE_GRAYSCALE);
 8     img.copyTo(out);
 9     //imshow ("原始图", img);
10
11     img = Gaussian(img);
12     //imshow ("高斯模糊", img);
13
14     img = Grayscale(img);
15     //imshow("灰度化", img);
16
17     img = Sobel(img);
18     //imshow("Sobel_X", img);
19
20     img = TwoValued(img);
21     //imshow("二值化", img);
22
23     img = Close(img);
24     //imshow("闭操作", img);
25
26     //
27     Contour(img, out);
28
29     waitKey(0);
30     cvDestroyAllWindows();
31 }

学习自——http://www.cnblogs.com/subconscious/p/3979988.html

时间: 2024-10-12 21:45:03

OpenCV学习之路——车牌识别之车牌定位的相关文章

车牌识别 api接口车牌识别 SDK车牌识别OCR

整牌识别率高达99.7%,尤其汉字识别遥遥领先同类产品:2. 识别速度快,极致优化的车牌定位和识别算法;3. 支持牌照全,包括蓝牌.黄牌.挂车号牌.新军牌.警牌.新武警车牌.教练车牌.大使馆车牌.农用车牌.个性化车牌.港澳出入境车牌.澳台车牌.民航车牌.领馆车牌.新能源车牌等4. 车牌宽度要求低,车牌宽度≥60个像素,都不影响识别:5. 完美支持安卓系统,ios系统,支持手机ARM平台和PDA的X86架构:6.支持视频识别和拍照识别两种识别模式 移动端车牌识别技术参数 车牌识别 api接口车牌识

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但

车牌识别中车牌信息以及如何做车牌识别的思路整理

一.现在的国内民用车牌都是92式车牌. 其车牌的一些参数指标如下: A:总长度为440mm: B:高度为140mm: C:其中单字符的宽为45mm: D:整个车牌区域字符长度为409mm(这里在后面计算的时候方便都认为是410mm): E:字符的高度为90mm: F:第二和第三个字符之间的距离为34mm: G:其他的每两个字符之间的距离为12mm: H:其中如果出现字符"1"的话,字符“1”的宽度为13.5mm:与其他字符的相差22.5mm:两个“1”之间的距离为38.5mm: 下图为

OpenCV实践之路——人脸识别之一数据收集和预处理

本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/51386949 微博:http://weibo.com/xingchenbing  前段时间对人脸检测和人脸标记进行了一些尝试:人脸检测(C++/Python)和用Dlib库进行人脸检测和人脸标记.但是检测和识别是不同的,检测解决的问题是图片中有没有人脸:而识别解决的问题是,如果一张图片中有人脸,这是谁的脸.人脸检测可以利用op

移动端车牌识别|前端车牌识别|车牌识别前端识别

移动端前端车牌识别OCR技术是为促进人工智能化建设研发而来的SDK应用.此应用基于Android.ios平台,手机.PDA.安卓系统带200万像素以上的摄像头均适用,该移动端前端车牌识别技术sdk.Android平台提供Jar包,IOS平台提供.a静态库,从拍照识别车牌为基础,一步步研发出并且是首创出视频流OCR识别,像要像扫二维码那样去识别车牌.此OCR软件对车牌颜色.车牌号进行识别. 目前很多地方都会用到移动端前端车牌识别OCR技术,停车场出入口.路边停车.汽车保养维修.尤其是移动警务等,无

车牌识别01__车牌抠图(CNN深度学习—opencv实现方法)

一.安装依赖 1.mac安装brem /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2.mac安装opencvbrew install opencv3.安装opencv-pythonpip3.6 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python参考以下地址h

opencv学习之路(41)、人脸识别

一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespace std; void take_photo() { VideoCapture cap(0); //打开摄像头 if (!cap.isOpened()) return; //加载级联检测器 CascadeClassifier cascade; cascade.load("F:/opencv3.2/R

opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

一.简介 二.外接矩形的查找绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 void main() 4 { 5 //外接矩形的查找绘制 6 Mat srcImg =imread("E://12.jpg"); 7 imshow("src",srcImg); 8 Mat dstImg = srcImg.clone(); //原图备份 9 cvtColor(srcImg, srcIm

opencv学习之路(21)、模板匹配及应用

一.模板匹配概念 二.单模板匹配 1 #include "opencv2/opencv.hpp" 2 #include <iostream> 3 using namespace std; 4 using namespace cv; 5 6 void main() 7 { 8 Mat temp=imread("E://mu.jpg"); 9 Mat src=imread("E://lena.jpg"); 10 Mat dst=src.c