『壹』 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;
}