‘壹’ 11.openCV车牌号识别
openCV 车牌号识别(车牌分类 汉字识别模型 数字字母识别模型)
机器学习:
SVM分类工具算法 使用正样本和负样本训练
图片去噪: 二值化和灰度化
车牌定位过程:
机器学习:
提取特征数据(常用LBP/HAAR/HOG)
SVM训练必须是CV_32F1(表示数据为32位浮点型 单通道)
创建SVM开始训练
HSV/HSB颜色空间
openCV中 H值:100~140 S和V值:95~255 表示蓝色范围
字符分割与识别
文字轮廓检测问题 先找出第2个字母(通过7等分位置定位)
ANN人工神经网络
‘贰’ 车牌字符识别算法原理是怎样的
原理就是通过摄像机拍摄道路上行驶的车辆图像进行车牌号码的识别,过程涉及:车辆检测—图像采集—预处理—车牌定位—字符分割—字符识别—结果输出。
辆检测:可采用埋地线圈检测、红外检测、雷达检测技术、视频检测等多种方式感知车辆的经过,并触发图像采集抓拍。
图像采集:通过高清摄像抓拍主机对通行车辆进行实时、不间断记录、采集。
预处理:噪声过滤、自动白平衡、自动曝光以及伽马校正、边缘增强、对比度调整等。
车牌定位:在经过图像预处理之后的灰度图像上进行行列扫描,确定车牌区域。
字符分割:在图像中定位出车牌区域后,通过灰度化、二值化等处理,精确定位字符区域,然后根据字符尺寸特征进行字符分割。
字符识别:对分割后的字符进行缩放、特征提取,与字符数据库模板中的标准字符表达形式进行匹配判别。
结果输出:将车牌识别的结果以文本格式输出。
‘叁’ 在微信小程序上也能接入车牌识别吗有推荐的车牌识别API接口吗
比野唯如云脉车牌识别API接口,支持IOS、安卓、WINDOWS及微信小程序等平台应用,在云脉OCR开发者仿慧上颂大培便有车牌识别API,注册并登录就可自助调用...
‘肆’ android位图两个点的Color.red(int)+Color.blue+Color.green相等表示什么意思
Color.red(dst[x0]) + Color.green(dst[x0]) + Color.blue(dst[x0]) == Color.red(dst[x1]) + Color.green(dst[x1]) + Color.blue(dst[x1]) 相等就表示颜色相同呗
450是蓝色 0x00c3ff
可以了解下rgb 颜色
‘伍’ 汽车车牌自动识别的原理是什么
汽车牌照自动识别技术是一项利用出入口处的火眼臻睛车牌识别摄像机摄取的车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。大致可以分为以下三大项x0dx0a•牌照定位,定位图片中的牌照位置;x0dx0a•牌照字符分割,把牌照中的字符分割出来;x0dx0a•牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。
‘陆’ android 如何验证车牌号码的。
js正则表达式验证车牌号//创建正则表达式var re=/^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$/;if(window.document.getElementById("id").value.search(re)==-1){ alert("输入的车牌号格式不正确"); return false;}下面是对上面正则表达式的简单分析^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$^[\u4e00-\u9fa5]{1}代表以汉字开头并且只有一个,这个汉字是车辆所在省的简称[A-Z]{1}代表A-Z的大写英文字母且只有一个,代表该车所在地的地市一级代码[A-Z_0-9]{5}代表后面五个数字是字母和数字的组合。^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{3}$如果是这种格式的话,英文字母大小写都可以。但是最好在后台进行转换
‘柒’ 有没有微信小程序调用百度ai车辆识别接口的程序源码,很简单的就可以
class BaiDuAiBaseController extends BaseController
{
private $appid;
private $appKey;
private $secretKey;
public function __construct(){
$this->appid= config('api..appid');
$this->appKey = config('api..apikey');
$this->secretKey = config('api..secretkey');
}
//网络ai接口--文字识别--车牌号识别
public function getCarNumber($_imgurl,$_img=''){
$_token = $this->getToken();
$_url = 'https://aip.bce.com/rest/2.0/ocr/v1/license_plate?access_token='.$_token;
if($_img){
$_data = [
'image'=>$_img//图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式
];
}else{
$_data = [
'url'=>request()->domain().'/'.$_imgurl
];
}
$_res = json_decode(httpGet($_url,$_data),true);
//TODO 此处只返回false没有终止,是因为程序执行流程需要,后期可能要改
if(isset($_res['error_msg'])) return false;
return $_res['words_result']['number'];
}
//获取token
private function getToken(){
if(cache('_token')){
$_access_token = cache('_token');
}else{
$_url = 'https://aip.bce.com/oauth/2.0/token?grant_type=client_credentials&client_id='.$this->appKey.'&client_secret='.$this->secretKey;
$res = json_decode(httpGet($_url),true);
if(isset($res['error']))TApiException($res['error_description']);//终止程序并抛出异常
$_access_token = $res['access_token'];
$_expires_in = $res['expires_in'];
cache('_token',$_access_token,($_expires_in-1000));//我喜欢少存1000秒,没有为什么,问就是癖好
}
return $_access_token;
}
}
这是ThinkPhp5.1后端封装的网络AI接口类,getToken()获取凭证,getCarNumber()请求$_url 返回识别结果,这个是车牌号码识别,车型识别等其他接口大部分都一样,就换个请求地址$_url就行
//接口:
public function getImgCarNum(){
$_number = (new BaiDuAiBaseController())->getCarNumber(false,request()->param('img'));
return self::myShow('申请成功',['carNum'=>$_number]);
}
小程序端正常request请求上面的接口就行,下面是微信小程序拍照识别功能
//拍照
goImgSearch(){
uni.chooseImage({
count:1,
sizeType: ['compressed'],//original 原图,compressed 压缩图
sourceType: ['album','camera'],//camera 相机 album相册
success:(r)=>{
console.log(r)
//执行识别车牌号码
this.img = r.tempFilePaths[0]
this.urlTobase64(r.tempFilePaths[0])
}
})
},
//识别车牌号码
urlTobase64(url){
uni.showLoading({
title:'拼命识别车牌中..'
})
//#ifdef MP-WEIXIN
uni.getFileSystemManager().readFile({
filePath: url, //选择图片时返回的路径
encoding: "base64",//这个是很重要的
success: res => { //成功的回调
//返回base64格式
let base64= 'data:image/jpeg;base64,' + res.data
//发送请求,识别车牌号码
this.$H.post('/getImgCarNum',{
img:base64 //图片数据
},{
token:true //必须登录
}).then((res)=>{
console.log(res.carNum)
if(!res.carNum){
uni.hideLoading()
return uni.showModal({
title:'识别失败',
content:'没能识别到车牌号码,请拍张清晰的图片再试哦,谢谢',
showCancel:false
})
}
uni.showToast({
title:'识别车牌成功',
icon:'none'
})
this.searchUser = res.carNum
this.userCarNum = res.carNum
uni.hideLoading()
}).catch((e)=>{
uni.hideLoading()
return uni.showModal({
title:'识别失败',
content:'没能识别到车牌号码,请拍张清晰的图片再试哦,谢谢',
showCancel:false
})
})
},
fail:(e)=>{
console.log(e)
}
})
//#endif
},
‘捌’ 求c或者c++的神经网络车牌识别代码,参考一下
#pragma hdrstop
#include <stdio.h>
#include <iostream.h>
const A=30.0;
const B=10.0;
const MAX=500; //最大训练次数
const COEF=0.0035; //网络的学习效率
const BCOEF=0.001;//网络的阀值调整效率
const ERROR=0.002 ; // 网络训练中的允许误差
const ACCURACY=0.0005;//网络要求精度
double sample[41][4]={{0,0,0,0},{5,1,4,19.020},{5,3,3,14.150},
{5,5,2,14.360},{5,3,3,14.150},{5,3,2,15.390},
{5,3,2,15.390},{5,5,1,19.680},{5,1,2,21.060},
{5,3,3,14.150},{5,5,4,12.680},{5,5,2,14.360},
{5,1,3,19.610},{5,3,4,13.650},{5,5,5,12.430},
{5,1,4,19.020},{5,1,4,19.020},{5,3,5,13.390},
{5,5,4,12.680},{5,1,3,19.610},{5,3,2,15.390},
{1,3,1,11.110},{1,5,2,6.521},{1,1,3,10.190},
{1,3,4,6.043},{1,5,5,5.242},{1,5,3,5.724},
{1,1,4,9.766},{1,3,5,5.870},{1,5,4,5.406},
{1,1,3,10.190},{1,1,5,9.545},{1,3,4,6.043},
{1,5,3,5.724},{1,1,2,11.250},{1,3,1,11.110},
{1,3,3,6.380},{1,5,2,6.521},{1,1,1,16.000},
{1,3,2,7.219},{1,5,3,5.724}};
double w[4][10][10],wc[4][10][10],b[4][10],bc[4][10];
double o[4][10],netin[4][10],d[4][10],differ;//单个样本的误差
double is; //全体样本均方差
int count,a;
void netout(int m, int n);//衡灶计算网络隐含层咐腊扮和输出层的输出
void calculd(int m,int n); //计算网络的反向传播误差
void calcalwc(int m,int n);//计算网络权值的调整量
void calcaulbc(int m,int n); //计算网络阀值的调整量
void changew(int m,int n); //调整网络权值
void changeb(int m,int n);//调整网络阀值
void clearwc(int m,int n);//清除网络权值变化量wc
void clearbc(int m,int n);//清除网络阀值变化量bc
void initialw(void);//初始化NN网络权值W
void initialb(void); //初始化NN网络阀值
void calculdiffer(void);//计算NN网络单个样本误差
void calculis(void);//计算NN网络全体样本误差
void trainNN(void);//训练NN网络
/*计算NN网络局销隐含层和输出层的输出 */
void netout(int m,int n)
{
int i,j,k;
//隐含层各节点的的输出
for (j=1,i=2;j<=m;j++) //m为隐含层节点个数
{
netin[i][j]=0.0;
for(k=1;k<=3;k++)//隐含层的每个节点均有三个输入变量
netin[i][j]=netin[i][j]+o[i-1][k]*w[i][k][j];
netin[i][j]=netin[i][j]-b[i][j];
o[i][j]=A/(1+exp(-netin[i][j]/B));
}
//输出层各节点的输出
for (j=1,i=3;j<=n;j++)
{
netin[i][j]=0.0;
for (k=1;k<=m;k++)
netin[i][j]=netin[i][j]+o[i-1][k]*w[i][k][j];
netin[i][j]=netin[i][j]-b[i][j];
o[i][j]=A/(1+exp(-netin[i][j]/B)) ;
}
}
/*计算NN网络的反向传播误差*/
void calculd(int m,int n)
{
int i,j,k;
double t;
a=count-1;
d[3][1]=(o[3][1]-sample[a][3])*(A/B)*exp(-netin[3][1]/B)/pow(1+exp(-netin[3][1]/B),2);
//隐含层的误差
for (j=1,i=2;j<=m;j++)
{
t=0.00;
for (k=1;k<=n;k++)
t=t+w[i+1][j][k]*d[i+1][k];
d[i][j]=t*(A/B)*exp(-netin[i][j]/B)/pow(1+exp(-netin[i][j]/B),2);
}
}
/*计算网络权值W的调整量*/
void calculwc(int m,int n)
{
int i,j,k;
// 输出层(第三层)与隐含层(第二层)之间的连接权值的调整
for (i=1,k=3;i<=m;i++)
{
for (j=1;j<=n;j++)
{
wc[k][i][j]=-COEF*d[k][j]*o[k-1][i]+0.5*wc[k][i][j];
}
// printf("\n");
}
//隐含层与输入层之间的连接权值的调整
for (i=1,k=2;i<=m;i++)
{
for (j=1;j<=m;j++)
{
wc[k][i][j]=-COEF*d[k][j]*o[k-1][i]+0.5*wc[k][i][j];
}
// printf("\n");
}
}
/*计算网络阀值的调整量*/
void calculbc(int m,int n)
{
int j;
for (j=1;j<=m;j++)
{
bc[2][j]=BCOEF*d[2][j];
}
for (j=1;j<=n;j++)
{
bc[3][j]=BCOEF*d[3][j];
}
}
/*调整网络权值*/
void changw(int m,int n)
{
int i,j;
for (i=1;i<=3;i++)
for (j=1;j<=m;j++)
{
w[2][i][j]=0.9*w[2][i][j]+wc[2][i][j];
//为了保证系统有较好的鲁棒性,计算权值时乘惯性系数0.9
printf("w[2][%d][%d]=%f\n",i,j,w[2][i][j]);
}
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
{
w[3][i][j]=0.9*w[3][i][j]+wc[3][i][j];
printf("w[3][%d][%d]=%f\n",i,j,w[3][i][j]);
}
}
/*调整网络阀值*/
void changb(int m,int n)
{
int j;
for (j=1;j<=m;j++)
b[2][j]=b[2][j]+bc[2][j];
for (j=1;j<=n;j++)
b[3][j]=b[3][j]+bc[3][j];
}
/*清除网络权值变化量wc*/
void clearwc(void)
{
for (int i=0;i<4;i++)
for (int j=0;j<10;j++)
for (int k=0;k<10;k++)
wc[i][j][k]=0.00;
}
/*清除网络阀值变化量*/
void clearbc(void)
{
for (int i=0;i<4;i++)
for (int j=0;j<10;j++)
bc[i][j]=0.00;
}
/*初始化网络权值W*/
void initialw(void)
{
int i,j,k,x;
double weight;
for (i=0;i<4;i++)
for (j=0;j<10;j++)
for (k=0;k<10;k++)
{
randomize();
x=100+random(400);
weight=(double)x/5000.00;
w[i][j][k]=weight;
}
}
/*初始化网络阀值*/
void initialb(void)
{
int i,j,x;
double fa;
for (i=0;i<4;i++)
for (j=0;j<10;j++)
{
randomize();
for (int k=0;k<12;k++)
{
x=100+random(400);
}
fa=(double)x/50000.00;
b[i][j]=fa;
}
}
/*计算网络单个样本误差*/
void calculdiffer(void)
{
a=count-1;
differ=0.5*(o[3][1]-sample[a][3])*(o[3][1]-sample[a][3]);
}
void calculis(void)
{
int i;
is=0.0;
for (i=0;i<=19;i++)
{
o[1][1]=sample[i][0];
o[1][2]=sample[i][1];
o[1][3]=sample[i][2];
netout(8,1);
is=is+(o[3][1]-sample[i][3])*(o[3][1]-sample[i][3]);
}
is=is/20;
}
/*训练网络*/
void trainNN(void)
{
long int time;
int i,x[4];
initialw();
initialb();
for (time=1;time<=MAX;time++)
{
count=0;
while(count<=40)
{
o[1][1]=sample[count][0];
o[1][2]=sample[count][1];
o[1][3]=sample[count][2];
count=count+1;
clearwc();
clearbc();
netout(8,1);
calculdiffer();
while(differ>ERROR)
{
calculd(8,1);
calculwc(8,1);
calculbc(8,1);
changw(8,1);
changb(8,1);
netout(8,1);
calculdiffer();
}
}
printf("This is %d times training NN...\n",time);
calculis();
printf("is==%f\n",is);
if (is<ACCURACY) break;
}
}
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
double result;
int m,test[4];
char ch='y';
cout<<"Please wait for the train of NN:"<<endl;
trainNN();
cout<<"Now,this molar network can work for you."<<endl;
while(ch=='y' || ch=='Y')
{
cout<<"Please input data to be tested."<<endl;
for (m=1;m<=3;m++)
cin>>test[m];
ch=getchar();
o[1][1]=test[1];
o[1][2]=test[2];
o[1][3]=test[3];
netout(8,1);
result=o[3][1];
printf("Final result is %f.\n",result);
printf("Still test?[Yes] or [No]\n");
ch=getchar();
}
return 0;
}