范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

爆肝手码!基于OpenCV的车牌识别(Sobel颜色定位),绝对干货

  车牌识别大体上需要经历过Sobel定位、颜色定位、SVM对定位来的候选车牌进行评测,给出评分,最后通过提取HOG特征按照训练模型进入ANN识别。
  这一章节介绍 定位相关的逻辑代码,其中定位用到 Sobel定位(边缘检测定位), 颜色定位:对应代码里的CarSobelPlateLocation,CarColorPlateLocation;两者定位后得到一些候选的图片,把这些图片送去SVM进行评测,SVM基于HOG提取边缘信息特征,HOG类同之前处理纹理特征的LBP,项目代码在Clion上开发的。源码地址前往 车牌定位(https://github.com/yinxiucheng/OpencvCarRecgnize)。Sobel定位
  CarSobelPlateLocation,通过以下的一些步骤进行降噪: 高斯模糊 灰度化 边缘化 二值化 闭操作 高斯模糊//预处理 :去噪 让车牌区域更加突出     Mat blur;     //1、高斯模糊(平滑) (1、为了后续操作 2、降噪 )     GaussianBlur(src, blur, Size(5, 5), 0);     //imshow("高斯模糊",blur);灰度化 Mat gray;     //2、灰度化 去掉颜色 因为它对于我们这里没用  降噪     cvtColor(blur, gray, COLOR_BGR2GRAY);     imshow("灰度", gray);边缘化 Mat sobel_16;     //3、 边缘检测 让车牌更加突出  在调用时需要以16位来保存数据 在后续操作 以及显示的时候需要转回8位     Sobel(gray, sobel_16, CV_16S, 1, 0);     //转为8位     Mat sobel;     convertScaleAbs(sobel_16, sobel);     imshow("Sobel", sobel);二值化//4. 二值化 黑白     Mat shold;     //大律法   最大类间算法     threshold(sobel, shold, 0, 255, THRESH_OTSU + THRESH_BINARY);     imshow("二值", shold);闭操作//5、闭操作     // 将相邻的白色区域扩大 连接成一个整体     Mat close;     Mat element = getStructuringElement(MORPH_RECT, Size(17, 3));     morphologyEx(shold, close, MORPH_CLOSE, element);     imshow("闭操作", close);
  以上的操作是在处理降噪,第六步初步赛选。
  第六步:最大面积、最小面积.宽高逼。 //6、查找轮廓     //获得初步筛选车牌轮廓================================================================     //轮廓检测     vector< vector> contours;     //查找轮廓 提取最外层的轮廓  将结果变成点序列放入 集合     findContours(close, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);      //遍历     vector vec_sobel_roi;     for(vector point:contours){         RotatedRect rotatedRect= minAreaRect(point);         //rectangle(src, rotatedRect.boundingRect(), Scalar(255, 0, 255));         //进行初步的筛选 把完全不符合的轮廓给排除掉 ( 比如:1x1,5x1000 )         if (verifySizes(rotatedRect)) {             vec_sobel_roi.push_back(rotatedRect);         }     }
  初步赛选:宽高比 float aspec,把不符合的删除掉(1 * 1的, 5* 1000的等候选矩形) int CarPlateLocation::verifySizes(RotatedRect rotated_rect) {     //容错率     float error = 0.75f;      //训练时候模型的宽高 136 * 32     //获得宽高比     float aspect = float(136) / float(32);      //最小 最大面积 不符合的丢弃     //给个大概就行 随时调整     //尽量给大一些没关系, 这还是初步筛选。     int min = 20 * aspect * 20;     int max = 180 * aspect * 180;      //比例浮动 error认为也满足     //最小宽、高比     float rmin = aspect - aspect * error;     //最大的宽高比     float rmax = aspect + aspect * error;     //矩形的面积     float area = rotated_rect.size.height * rotated_rect.size.width;     //矩形的比例     float r = (float) rotated_rect.size.width / (float) rotated_rect.size.height;     if ((area < min || area > max) || (r < rmin || r > rmax))         return 0;     return 1; }
  把斜的图片转正:仿射变换 //1、矫正前 2、矫正后 3、矩形的大小 4、矩形中心点坐标  5、角度 void CarPlateLocation::rotation(Mat src, Mat &dst, Size rect_size,                                 Point2f center, double angle) {      //获得旋转矩阵     Mat rot_mat = getRotationMatrix2D(center, angle, 1);      //运用仿射变换     Mat mat_rotated;     //矫正后 大小会不一样,但是对角线肯定能容纳     int max = sqrt(pow(src.rows, 2) + pow(src.cols, 2));     //仿射变换     warpAffine(src, mat_rotated, rot_mat, Size(max, max),                CV_INTER_CUBIC);     imshow("旋转前", src);     imshow("旋转", mat_rotated);     //截取 尽量把车牌多余的区域截取掉     getRectSubPix(mat_rotated, Size(rect_size.width, rect_size.height), center, dst);     imshow("截取", dst);     mat_rotated.release();     rot_mat.release();颜色定位HSV颜色模型
  色调(H), 饱和度(S), 明度(V);
  BGR 转成 HSV cvtColor(src,hsv,COLOR_BGR2HSV);色调H
  用角度度量,取值范围为0 360 ,从红色开始按逆时针方向计算,红色为0 ,绿色为120 ,蓝色为240 。它们的补色是:黄色为60 ,青色为180 ,品红为300 ;饱和度S
  饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0% 100%,值越大,颜色越饱和。明度V
  明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)
  在OpenCV中hsv 数据为8UC则取值分别为 0-180 0-255 0-255 ,即蓝色应该是120
  按照上面的表格找到蓝色区域 (100 ~ 124), 然后将HSV中的H、S转为 0, V变为255。其它区域的HSV赋值为0。 //3通道     int chanles = hsv.channels();     //高     int h = hsv.rows;     //宽数据长度     int w = hsv.cols * 3;      //判断数据是否为一行存储的     //内存足够的话 mat的数据是一块连续的内存进行存储     if (hsv.isContinuous()) {         w *= h;         h = 1;     }      for (size_t i = 0; i < h; ++i) {         //第i 行的数据 hsv的数据 uchar = java byte         uchar *p = hsv.ptr(i);          for (size_t j = 0; j < w; j += 3) {             int h = int(p[j]);             int s = int(p[j + 1]);             int v = int(p[j + 2]);              bool blue = false;             //蓝色             if (h >= 100 && h <= 124 && s >= 43 && s <= 255 && v >= 46 && v <= 255) {                 blue = true;             }              if (blue){                 p[j] = 0;                 p[j + 1]=0;                 p[j + 2]=255;             }else {                 //hsv 模型 h:0 红色 亮度和饱和度都是0 ,也就变成了黑色                 p[j] = 0;                 p[j + 1] = 0;                 p[j + 2] = 0;             }         }     }
  得到下面的图:
  接下来抽取亮度: //把亮度数据抽出来     //把h、s、v分离出来     vector hsv_split;     split(hsv, hsv_split);
  然后跟sobel一样通过二值化、大律法等操作     // 整个图片+经过初步赛选的车牌 + 得到的候选车牌     tortuosity(src, vec_sobel_roi, dst);      for (Mat s: dst) {         imshow("候选", s);         waitKey();     }
  筛选出来一个集合:
  把两个结合结合起来,然后通过SVM进行评测, 因为不像人脸检测是没有现成的模型。 vector< Mat > sobel_plates; //sobel定位 plateLocation->location(src, sobel_plates);  //颜色定位 vector< Mat > color_plates; plateColorLocation->location(src, color_plates);  vector plates; //把sobel_plates的内容 全部加入plates向量 plates.insert(plates.end(),sobel_plates.begin(), sobel_plates.end()); plates.insert(plates.end(), color_plates.begin(), color_plates.end());SVM简单来说,SVM就是用于区分不同的类型(车牌、非车牌)。SVM的训练数据既有特征又有标签,通过训练,让机器可以自己找到特征和标签之间的联系,在面对只有特征没有标签的数据时,可以判断出标签。属于机器学习中的监督学习。线性可分、线性不可分,不可分的时候用核函数来区分:
  核函数: 用于将不同类型进行提维
  人脸检测用的LBP提取特征,这里采取HOG来提取特征。
  SVM load模型, 模型是同样是xml文件 svm = SVM::load(svm_model); CarPlateRecgnize p("/Users/xiuchengyin/Documents/Tina-NDK/OpencvCarRecgnize/resource/HOG_SVM_DATA2.xml");HOG特征
  局部归一化的梯度方向直方图,是一种对图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征。 参数1(检测窗口)的宽- 参数2(块大小)的宽 结果与参数3(块滑动增量)的余数要为0 高也一样
  参数4是胞元大小,参数5是梯度方向
  HOGDescriptor hog(Size(128, 64), Size(16, 16), Size(8, 8), Size(8, 8), 3);
  初始化HOG变量  //参数1的宽-参数2的宽 结果与参数3的余数为0  高也一样     svmHog = new HOGDescriptor(Size(128,64),Size(16,16),Size(8,8),Size(8,8),3);
  检测窗口被分为:((128-16)/8+1)*((64-16)/8+1)=105个块(Block);
  一个Block有4个胞元(Cell);
  一个Cell的Hog描述子向量的长度是9;
  统计梯度直方图特征,就是将梯度方向(0-360)划分为x个区间,将图像化为16x16的若干个窗口,每个窗口又划分为x个block,每个block再化为4个cell(8x8)。对每一个cell,算出每一像素点的梯度方向,按梯度方向增加对应bin的值,最终综合N个cell的梯度直方图组成特征。
  简单来说,车牌的边缘与内部文字组成的一组信息(在边缘和角点的梯度值是很大的,边缘和角点包含了很多物体的形状信息),HOG就是抽取这些信息组成一个直方图。HOG : 梯度方向弱化光照的影响,适合捕获轮廓。
  LBP : 中心像素的LBP值反映了该像素周围区域的纹理信息。
  SVM 依据HOG提取的特征将所给的候选图片进行评分,选取最优的: string CarPlateRecgnize::plateRecgnize(Mat src) {     vector< Mat > sobel_plates;     //sobel定位     sobelPlateLocation->location(src, sobel_plates);     //颜色定位     vector< Mat > color_plates;     colorPlateLocation->location(src, color_plates);     vector< Mat > plates;     //把sobel_plates的内容 全部加入plates向量     plates.insert(plates.end(),sobel_plates.begin(), sobel_plates.end());     plates.insert(plates.end(), color_plates.begin(), color_plates.end());      int index = -1;     float minScore = FLT_MAX; //float的最大值     //使用 svm 进行 评测     for (int i = 0;i< plates.size();++i)     {         Mat plate = plates[i];         //先灰度化,再二值化,灰度化只剩下一个通道         Mat gray;         cvtColor(plate, gray,COLOR_BGR2GRAY);         //二值化 必须是以单通道进行         Mat shold;         threshold(gray, shold, 0, 255, THRESH_OTSU + THRESH_BINARY);         //提取特征         Mat features;         getHogFeatures(svmHog, shold, features);         //features 进行转化,把数据保存成一行         Mat samples = features.reshape(1,1);         //转化数据存储格式         samples.convertTo(samples, CV_32FC1 );          //原始模式         // svm: 直接告诉你这个数据是属于什么类型.         // RAW_OUTPUT:让svm 给出一个评分 //        char name[100]; //        sprintf(name, "候选车牌%d", i); //        imshow(name, plate);          float score = svm->predict(samples, noArray(), StatModel::Flags::RAW_OUTPUT);         printf("评分:%f ",score);         if (score < minScore) {             minScore = score;             index = i;         }         gray.release();         shold.release();         features.release();         samples.release();     }      Mat dst;     if (index >= 0) {         dst = plates[index].clone();     } //    imshow("车牌", dst); //    waitKey(); //    释放     for (Mat p : plates) {         p.release();     }     return string("123"); }
  svm评分如下: /Users/xiuchengyin/Documents/Tina-NDK/OpencvCarRecgnize/cmake-build-debug/OpencvCarRecgnize 评分:-1.224322 评分:1.255759 评分:1.831937 评分:-0.070820 评分:1.525869 评分:1.117042
  测试最终取出来的就是我们的车牌选图了。
  参考:github.com/liuruoze/Ea…
  www.cnblogs.com/subconsciou… 来源:掘金
  https://juejin.cn/post/6844903714470232078

对不起这一次我帮不了你在生活当中,我们经常看到有一种老好人的身份出现在各位朋友身边。甚至为了帮助身边朋友,还一度会寻求别人的帮助。又怕个人的意见会不会太主观了以至于会误导他们。站在自己的角度,分析这件事2023该来的,都在路上头号有新人每晚一卷书永不放弃,总有希望在前面等待。岁月不居,时节如流。眨眼间,又是一年光阴。回首过去的一年,我们有过痛苦,有过成长,有过喜悦,有过迷茫但不论如何,2022这艘巨轮,华南首家拉夫劳伦之家亮相深圳万象城,BottegaVeneta春节广告抒思家之情是日美好事物记者罗以文编辑楼婍沁华南首家拉夫劳伦之家亮相深圳万象城拉夫劳伦之家(TheWorldofRalphLauren)于深圳万象城亮相,这也是继北京上海成都之后,拉夫劳伦在中国的第四家亦35岁宋茜穿深V露肩裙大秀身材,丰腴饱满,没想到这么有料前几年的娱乐圈,韩流盛行,不仅有韩国艺人,还有一大批国内的年轻人,为了心中的梦想,前往异国他乡成为练习生,这的确是追求梦想的快捷方式,大部分练习生在回国以后,还是有不错的发展的。虽步入40如何留住少女颜?提醒常饮4茶,养颜护肤美出新高度爱美之心人皆有之,从古至今,女性对于美的追求从未停下过脚步。随着年纪的增大,女性在精力上,还是体力上,能感觉到明显下降。最重要的是,肉眼可见的皮肤状态,更是出现了衰老痕迹。相信不少以为是生长痛,孩子被查出骨肉瘤,惋惜!4个症状明明容易分辨妈妈,我痛!最近,壮壮总对妈妈嚷嚷着腿疼,其到了晚上,疼的更厉害。壮壮妈妈上网查了查,可能是这个年龄段孩子都要经历的长个子的生长痛,也没有在意,就拿网上教的方法敷热毛巾缓解下。刚开中国足球中性名之我见中性名称对中国足球有利有弊,有利的一面就是对中国足球的未来是有好处的,对一个俱乐部的稳定性是有好处的,对一个地区的球迷是有好处的,可以有效的打击投机倒把式的投资人,对投资人按足球规穆雷揽责老鹰主帅身处险境,奥本山宫后续出炉,美媒爆5换1交易北京时间12月31日,NBA常规赛正在如火如荼进行中,各支球队都在为季后赛席位而厮杀,经过一个月的进程,各支球队可谓几家欢喜几家愁,既有年轻球队逆流而上,也有豪门球队跌下神坛,竞技1人0分!1人1分!广东队11连胜之夜两大主力却让杜锋高兴不起来!1人0分!1人1分!广东队11连胜之夜两大主力锋线却让杜锋高兴不起来!10284,广东队仅仅用了一节多的比赛就锁定了这场京粤大战的胜利,在收获一场酣畅淋漓的大胜的同时广东队的连胜场过年给父母最好的礼物,全天候动态健康监测,DidoF50S开箱评测临近年底,给父母带什么样的礼物更好呢?我的建议是给父母一份健康守护就是最好的礼物,尤其是在现在的大环境和父母的年龄日益增长的情况下,健康才是最重要的,所以我给父母的礼物是DidoF官宣签约仅1天后,275万合同就黄了?知名品牌突发公告取消与郎朗夫妇代言合作每经记者曾剑每经编辑陈俊杰,孙志成A股上市公司浪莎股份(SH600137,股价15。51元,市值15。08亿元)1月4日晚间披露,公司所属浙江浪莎内衣有限公司(以下简称浙江浪莎)取
2换2!汤普森交易方案曝光,前往猛龙做老大,库里迎来升级版搭档目前,202122赛季NBA常规赛激战正酣,联赛各队都在为拿到更上一层楼的战绩努力着,力争帮助球队拿到季后赛的主场优势,以登上总决赛的舞台。赛事变得愈加精彩白热化,吸引了数以万计球业余!45秒3次翻车,两队球员哄笑,裁判全程黑脸,姚明或严查CBA最近这几年,国内的篮球联赛发展的非常不错,在姚明接手了篮协主席以后,CBA联赛出台了不少的政策,也起到了很好的刺激效果,联赛的精彩程度有了一定的上升。尤其是相比于中超联赛,CBA的浙江男篮遭遇重大打击,三大主力受伤,或被广东男篮取代四强席位在和广厦男篮的德比大战中,浙江队以95107不敌对手,遭遇了一场失利。输掉这场比赛后,浙江队在四强的竞争中也处于了劣势。而更让球队雪上加霜的是,球队目前的伤病非常严重,除了大外援拉今日CBA今晚2场比赛,马布里率队迎战广东,央视直播焦点战3月9日(周三),常规赛第32轮的最后2场比赛,将在今晚展开较量。其中一场焦点战备受关注,马布里将率领北控男篮,迎战卫冕冠军广东队。由于马布里与广东队过往的江湖恩怨,这场比赛也格外十二种拌面最好吃的做法喜欢吃面食的小伙伴们有福了,今天分享12种拌面的具体做法,喜欢的赶紧学起来吧!豆角肉沫炸酱面食材猪肉,豆角,面条,葱姜蒜,辣椒,黄豆酱,生抽,老抽,蚝油,十三香做法锅中热油,放入肉日常生活中的健康方式柴米油盐酱醋茶的日常生活,要怎么做才是最健康的生活方式?1喝水水是生命之源每天不低于1。5升当您感到口渴的时候,说明身体至少已经流失了1的水分,水是新陈代谢过程中不可缺少的,长时间吃素比吃肉更健康吗?你是不是也经常听人说,饮食油腻容易三高?又有多少人因为这句话就彻底跟肉类决裂了,投入到了吃素食的行列中去?经常大鱼大肉,辛辣油腻确实不利于身体健康,但经常吃素就一定健康吗?1。经常凉拌紫甘蓝,焯水还是用盐腌,大厨教你正确做法,清脆爽口不发黑凉拌紫甘蓝,焯水还是用盐腌制,大厨教你正确做法,清脆爽口不发黑紫甘蓝又称红甘蓝赤甘蓝,俗称紫包菜,属低热量高纤维食物,富含叶酸和花青素,被世界卫生组织(WHO)推荐为排名第三可食用面粉别再做包子蒸馒头了,教你个秘制做法,不蒸不炸,出锅就扫光豆沙小面包,外酥里软,营养香甜一种比较美味的食材,今天咱们就用豆沙来给大家分享一道特别好吃的美食豆沙小面包,这样的小面包吃起来外酥里软,营养美味,而且做法相对来说是比较简单的,很容浪漫情人节晚餐,9道食谱,主食小吃饮品全都有,健康味美不浪费又是一年情人节,今年的情人节跟最爱的人一起自制浪漫甜蜜晚餐吧,爱她(他)就先征服她(他)的胃,因为味蕾的记忆是伴随一身的,如此有仪式感的度过特别的一天,会是你们一生难忘的经历。适合让你流口水的豆腐做法今天和大家分享一道我最爱吃的孜然脆皮豆腐!刷上香浓的酱汁简直绝了感豆腐我用的老豆腐,新手比较容易操作,嫩豆腐做也很好吃噢!1老豆腐1块,鸡蛋2个,葱花,蒜末,白芝麻,辣椒粉,孜然粒