车牌识别(附源代码)
1.车牌抓拍与识别系统 C# 源代码
![1.车牌抓拍与识别系统 C# 源代码](https://img.taocdn.com/s3/m/6c4ea8da89eb172ded63b787.png)
using System.Text;using System.Drawing.Design;using mon;using ponentModel.Design.Serialization;/* 视频监控*/public class Spjk{// 打开摄像头public DXButton UINavigatorButtonButton7{get{// 选择摄像头if ((this.mUINavigatorButtonButton7 == null)){this.mUINavigatorButtonButton7 = new DXButton(this);#region Search Criteriathis.mUINavigatorButtonButton7.SearchProperties[] = "dataNavigatorSampleButton[10]";this.mUINavigatorButtonButton7.SearchProperties[DXTestControl.PropertyNames.ClassName] = "NavigatorButton";this.mUINavigatorButtonButton7.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}return this.mUINavigatorButtonButton7;}}// 摄像头设置完毕public DXButton UINavigatorButtonButton8{get{if ((this.mUINavigatorButtonButton8 == null)){this.mUINavigatorButtonButton8 = new DXButton(this);#region Search Criteriathis.mUINavigatorButtonButton8.SearchProperties[] = "dataNavigatorSampleButton[11]";//消息发送this.mUINavigatorButtonButton8.SearchProperties[DXTestControl.PropertyNames.ClassName] = "NavigatorButton";this.mUINavigatorButtonButton8.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}return this.mUINavigatorButtonButton8;}}// 设置端口public DXButton UINavigatorButtonButton9{get{// 图片抓拍if ((this.mUINavigatorButtonButton9 == null)){this.mUINavigatorButtonButton9 = new DXButton(this);#region Search Criteriathis.mUINavigatorButtonButton9.SearchProperties[] = "dataNavigatorSampleButton[2]";//图片截取this.mUINavigatorButtonButton9.SearchProperties[DXTestControl.PropertyNames.ClassName] = "NavigatorButton";this.mUINavigatorButtonButton9.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}return this.mUINavigatorButtonButton9;}}// 图片保存public DXButton UINavigatorButtonButton10{get{if ((this.mUINavigatorButtonButton10 == null)){this.mUINavigatorButtonButton10 = new DXButton(this);#region Search Criteriathis.mUINavigatorButtonButton10.SearchProperties[] = "dataNavigatorSampleButton[1]";this.mUINavigatorButtonButton10.SearchProperties[DXTestControl.PropertyNames.ClassName] = "NavigatorButton";this.mUINavigatorButtonButton10.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}return this.mUINavigatorButtonButton10;}}// 图片剪切public DXButton UINavigatorButtonButton11{get{if ((this.mUINavigatorButtonButton11 == null)){this.mUINavigatorButtonButton11 = new DXButton(this);//逻辑读取#region Search Criteriathis.mUINavigatorButtonButton11.SearchProperties[] = "dataNavigatorSampleButton[0]";//设置this.mUINavigatorButtonButton11.SearchProperties[DXTestControl.PropertyNames.ClassName] = "NavigatorButton";this.mUINavigatorButtonButton11.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}return this.mUINavigatorButtonButton11;}}// 图片优化#endregion#region Fieldsprivate DXButton mUINavigatorButtonButton;private DXButton mUINavigatorButtonButton1;private DXButton mUINavigatorButtonButton2;private DXButton mUINavigatorButtonButton3;private DXButton mUINavigatorButtonButton4;private DXButton mUINavigatorButtonButton5;private DXButton mUINavigatorButtonButton6;private DXButton mUINavigatorButtonButton7;private DXButton mUINavigatorButtonButton8;private DXButton mUINavigatorButtonButton9;private DXButton mUINavigatorButtonButton10;private DXButton mUINavigatorButtonButton11;#endregion}//图片格式选择[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]public class UIModuleListBoxCustom : DXTestControl{public UIModuleListBoxCustom(UITestControl searchLimitContainer) :base(searchLimitContainer){#region Search Criteriathis.SearchProperties[] = "ModuleListBox";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "ModuleListBox";this.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}#region Properties//服务端跟踪信息public UIXtraTabControl1TabList43 UIXtraTabControl1TabList{get{if ((this.mUIXtraTabControl1TabList == null)){this.mUIXtraTabControl1TabList = new UIXtraTabControl1TabList43(this); //全局可写属性}return this.mUIXtraTabControl1TabList;}}public UIXtraTabControl2TabList UIXtraTabControl2TabList{get{//文本信息if ((this.mUIXtraTabControl2TabList == null)){this.mUIXtraTabControl2TabList = new UIXtraTabControl2TabList(this);}return this.mUIXtraTabControl2TabList;}}#endregion#region Fieldsprivate UIXtraTabControl1TabList43 mUIXtraTabControl1TabList;private UIXtraTabControl2TabList mUIXtraTabControl2TabList;#endregion}//图像修改[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]public class UIXtraTabControl1TabList43 : DXTestControl{public UIXtraTabControl1TabList43(UITestControl searchLimitContainer) :base(searchLimitContainer){#region Search Criteria//查找this.SearchProperties[] = "xtraTabControl1";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "XtraTabControl";this.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}#region Propertiespublic UIXtraTabPage1Client42 UIXtraTabPage1Client{get{//图标设置if ((this.mUIXtraTabPage1Client == null)){this.mUIXtraTabPage1Client = new UIXtraTabPage1Client42(this);}return this.mUIXtraTabPage1Client;}}public DXTestControl UIXtraTabControlHeaderTabPage{get{//控件选择if ((this.mUIXtraTabControlHeaderTabPage == null)){this.mUIXtraTabControlHeaderTabPage = new DXTestControl(this);#region Search Criteriathis.mUIXtraTabControlHeaderTabPage.SearchProperties[] = "xtraTabControl1PageHeader1";this.mUIXtraTabControlHeaderTabPage.SearchProperties[DXTestControl.PropertyNames.ClassName] = "XtraTabControlHeader";this.mUIXtraTabControlHeaderTabPage.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}return this.mUIXtraTabControlHeaderTabPage;}}public UIXtraTabPage2Client6 UIXtraTabPage2Client{get{if ((this.mUIXtraTabPage2Client == null)){this.mUIXtraTabPage2Client = new UIXtraTabPage2Client6(this);}return this.mUIXtraTabPage2Client;}}#endregion#region Fieldsprivate UIXtraTabPage1Client42 mUIXtraTabPage1Client;private DXTestControl mUIXtraTabControlHeaderTabPage;private UIXtraTabPage2Client6 mUIXtraTabPage2Client;#endregion}[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]public class UIXtraTabPage1Client42 : DXTestControl{public UIXtraTabPage1Client42(UITestControl searchLimitContainer) :base(searchLimitContainer)//服务端日志读取{#region Search Criteriathis.SearchProperties[] = "xtraTabPage1";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "XtraTabPage";this.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}#region Propertiespublic UIListBoxControlSampleList UIListBoxControlSampleList{get{if ((this.mUIListBoxControlSampleList == null)){this.mUIListBoxControlSampleList = new UIListBoxControlSampleList(this);}return this.mUIListBoxControlSampleList;}}#endregion#region Fieldsprivate UIListBoxControlSampleList mUIListBoxControlSampleList;#endregion}[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]public class UIListBoxControlSampleList : DXListBox{public UIListBoxControlSampleList(UITestControl searchLimitContainer) :base(searchLimitContainer){#region Search Criteriathis.SearchProperties[] = "listBoxControlSample";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "ListBoxControl";this.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}#region Propertiespublic DXListBoxItem UIAngolaListItem//选定响应{get{if ((this.mUIAngolaListItem == null)){this.mUIAngolaListItem = new DXListBoxItem(this);#region Search Criteriathis.mUIAngolaListItem.SearchProperties[] = "listBoxControlSampleItem[5]";//算法设置this.mUIAngolaListItem.SearchProperties[DXTestControl.PropertyNames.ClassName] = "ListBoxControlItem";this.mUIAngolaListItem.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}return this.mUIAngolaListItem;}}public DXListBoxItem UIUnitedStatesimageusListItem{get{if ((this.mUIUnitedStatesimageusListItem == null)){this.mUIUnitedStatesimageusListItem = new DXListBoxItem(this);#region Search Criteriathis.mUIUnitedStatesimageusListItem.SearchProperties[] = "listBoxControlSampleItem[0]";this.mUIUnitedStatesimageusListItem.SearchProperties[DXTestControl.PropertyNames.ClassName] = "ListBoxControlItem";this.mUIUnitedStatesimageusListItem.WindowTitles.Add("The XtraEditors Suite Demo (C# code)");#endregion}return this.mUIUnitedStatesimageusListItem;}}}//~~~~~~~/* 监控设置*/using mon;using System.Runtime.Remoting.Messaging;using System.Runtime.Remoting.MetadataServices;using System.Security.Cryptography.X509Certificates;using System.Data.Odbc;public class Jksz{public DXButton UISimpleButton2Button{get{if ((this.mUISimpleButton2Button == null))//矢量控制{this.mUISimpleButton2Button = new DXButton(this);#region Search Criteriathis.mUISimpleButton2Button.SearchProperties[] = "simpleButton2";this.mUISimpleButton2Button.SearchProperties[DXTestControl.PropertyNames.ClassName] = "SimpleButton";this.mUISimpleButton2Button.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}return this.mUISimpleButton2Button;}}#endregion#region Fieldsprivate DXButton mUISimpleButton1Button;private DXButton mUISimpleButton2Button;#endregion}[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]public class UIRibbonControl1Ribbon5 : DXRibbon{public UIRibbonControl1Ribbon5(UITestControl searchLimitContainer) :base(searchLimitContainer){#region Search Criteriathis.SearchProperties[] = "ribbonControl1";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "RibbonControl";this.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}#region Properties// 车主信息查看public DXRibbonPage UIRibbonPage1RibbonPage{get{if ((this.mUIRibbonPage1RibbonPage == null)){this.mUIRibbonPage1RibbonPage = new DXRibbonPage(this);#region Search Criteriathis.mUIRibbonPage1RibbonPage.SearchProperties[] = "RibbonPage1";this.mUIRibbonPage1RibbonPage.SearchProperties[DXTestControl.PropertyNames.ClassName] = "RibbonPage";this.mUIRibbonPage1RibbonPage.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}return this.mUIRibbonPage1RibbonPage;}}//服务端信息日志public DXRibbonPage UIRibbonPage0RibbonPage{get{if ((this.mUIRibbonPage0RibbonPage == null)){this.mUIRibbonPage0RibbonPage = new DXRibbonPage(this);#region Search Criteriathis.mUIRibbonPage0RibbonPage.SearchProperties[] = "RibbonPage0";this.mUIRibbonPage0RibbonPage.SearchProperties[DXTestControl.PropertyNames.ClassName] = "RibbonPage";this.mUIRibbonPage0RibbonPage.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}return this.mUIRibbonPage0RibbonPage;}}// 选择筛选时间#endregion#region Fieldsprivate DXRibbonPage mUIRibbonPage1RibbonPage;private DXRibbonPage mUIRibbonPage0RibbonPage;#endregion}[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]// 违章记录查看public class UICustomHeaderButtonsCustom : DXTestControl{public UICustomHeaderButtonsCustom(UITestControl searchLimitContainer) :base(searchLimitContainer){#region Search Criteriathis.SearchProperties[] = "CustomHeaderButtons";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "CustomHeaderButtons";this.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}#region Propertiespublic UILayoutControl1Custom7 UILayoutControl1Custom{get//关联管理{if ((this.mUILayoutControl1Custom == null)){this.mUILayoutControl1Custom = new UILayoutControl1Custom7(this);}return this.mUILayoutControl1Custom;}//安全设定}#endregion#region Fieldsprivate UILayoutControl1Custom7 mUILayoutControl1Custom;#endregion}[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]public class UILayoutControl1Custom7 : DXTestControl{public UILayoutControl1Custom7(UITestControl searchLimitContainer) :base(searchLimitContainer){#region Search Criteriathis.SearchProperties[] = "layoutControl1";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "LayoutControl";this.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}#region Propertiespublic UIActionDockPanelCustom UIActionDockPanelCustom{get{if ((this.mUIActionDockPanelCustom == null)){this.mUIActionDockPanelCustom = new UIActionDockPanelCustom(this);}return this.mUIActionDockPanelCustom;}}public DXRadioGroup UIRgTemplatesButtonRadioGroup{get{if ((this.mUIRgTemplatesButtonRadioGroup == null)){this.mUIRgTemplatesButtonRadioGroup = new DXRadioGroup(this);#region Search Criteria//捕获异常this.mUIRgTemplatesButtonRadioGroup.SearchProperties[] = "rgTemplatesButton";this.mUIRgTemplatesButtonRadioGroup.SearchProperties[DXTestControl.PropertyNames.ClassName] = "RadioGroup";this.mUIRgTemplatesButtonRadioGroup.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}return this.mUIRgTemplatesButtonRadioGroup;}}#endregion#region Fieldsprivate UIActionDockPanelCustom mUIActionDockPanelCustom;private DXRadioGroup mUIRgTemplatesButtonRadioGroup;#endregion}[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]public class UIActionDockPanelCustom : DXTestControl{public UIActionDockPanelCustom(UITestControl searchLimitContainer) :base(searchLimitContainer){#region Search Criteriathis.SearchProperties[] = "actionDockPanel";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "ActionDockPanel";this.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}#region Propertiespublic UIDockPanel1Client UIDockPanel1Client{get{if ((this.mUIDockPanel1Client == null)){this.mUIDockPanel1Client = new UIDockPanel1Client(this);}return this.mUIDockPanel1Client;}}#endregion#region Fieldsprivate UIDockPanel1Client mUIDockPanel1Client;#endregion}[GeneratedCode("Coded UITest Builder", "10.0.40219.1")]public class UIDockPanel1Client : DXTestControl{//客户端局部变量public UIDockPanel1Client(UITestControl searchLimitContainer) :base(searchLimitContainer){#region Search Criteriathis.SearchProperties[] = "dockPanel1";this.SearchProperties[DXTestControl.PropertyNames.ClassName] = "DockPanel";this.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}#region Propertiespublic DXButton UICustomHeaderButtonButton{get{if ((this.mUICustomHeaderButtonButton == null)){this.mUICustomHeaderButtonButton = new DXButton(this);#region Search Criteriathis.mUICustomHeaderButtonButton.SearchProperties[] = "CustomHeaderButton";this.mUICustomHeaderButtonButton.SearchProperties[DXTestControl.PropertyNames.ClassName] = "DockPanelButton";this.mUICustomHeaderButtonButton.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}return this.mUICustomHeaderButtonButton;}}public UIDockPanel2_ContainerCustom UIDockPanel2_ContainerCustom{get{if ((this.mUIDockPanel2_ContainerCustom == null)){this.mUIDockPanel2_ContainerCustom = new UIDockPanel2_ContainerCustom(this);}return this.mUIDockPanel2_ContainerCustom;}}public DXButton UIPushbuttonButton{//延时控制get{if ((this.mUIPushbuttonButton == null)){this.mUIPushbuttonButton = new DXButton(this);#region Search Criteriathis.mUIPushbuttonButton.SearchProperties[] = "Push button"; //管理方式this.mUIPushbuttonButton.SearchProperties[DXTestControl.PropertyNames.ClassName] = "DockPanelButton";this.mUIPushbuttonButton.WindowTitles.Add("Application UI Layout ControlsDemo (C# code)");#endregion}return this.mUIPushbuttonButton;}}public DXButton UICheckButtonButton{get{if ((this.mUICheckButtonButton == null)){this.mUICheckButtonButton = new DXButton(this);#region Search Criteriathis.mUICheckButtonButton.SearchProperties[] = "Check Button";this.mUICheckButtonButton.SearchProperties[DXTestControl.PropertyNames.ClassName] = "DockPanelButton";this.mUICheckButtonButton.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}return this.mUICheckButtonButton;}}public DXButton UIImageButton{get{if ((this.mUIImageButton == null)){this.mUIImageButton = new DXButton(this);#region Search Criteriathis.mUIImageButton.SearchProperties[] = "Image";this.mUIImageButton.SearchProperties[DXTestControl.PropertyNames.ClassName] = "DockPanelButton";this.mUIImageButton.WindowTitles.Add("Application UI Layout Controls Demo (C# code)");#endregion}return this.mUIImageButton;}//客户端清空Cookie}}///* 监控选项*/using System.Runtime.InteropServices;using System.Data.SqlTypes;using System.Data.OracleClient;public class Jkxx{private void buttonX4_Click(object sender, EventArgs e){switch (comboBoxEx2.SelectedIndex){case 0:if (dateTimeInput3.Text == "" && dateTimeInput4.Text == ""){string sql = "SELECT * FROM [ZCERP].[dbo].[ZH_PAY_SUPPLIER] WHERE OD_PAY_ALL_M ='是'"; Supplier_Load sl = new Supplier_Load (sql);sl.StartPosition = FormStartPosition.CenterScreen;sl.ShowDialog();return;}if (dateTimeInput3.Text != "" && dateTimeInput4.Text == ""){string sql = "SELECT * FROM [ZCERP].[dbo].[ZH_PAY_SUPPLIER] WHERE OD_PAY_ALL_M ='是' AND Input_Date >='" + dateTimeInput3.Value + "'";Supplier_Load sl = new Supplier_Load(sql);sl.StartPosition = FormStartPosition.CenterScreen;sl.ShowDialog();return;}if (dateTimeInput3.Text != "" && dateTimeInput4.Text != ""){string sql = "SELECT * FROM [ZCERP].[dbo].[ZH_PAY_SUPPLIER] WHERE OD_PAY_ALL_M ='是' AND Input_Date >='" + dateTimeInput3.Value + "' AND Input_Date <='" + dateTimeInput4.Value + "'";Supplier_Load sl = new Supplier_Load(sql);sl.StartPosition = FormStartPosition.CenterScreen;sl.ShowDialog();return;}if (dateTimeInput3.Text == "" && dateTimeInput4.Text != ""){string sql = "SELECT * FROM [ZCERP].[dbo].[ZH_PAY_SUPPLIER] WHERE OD_PAY_ALL_M ='是' AND Input_Date <='" + dateTimeInput4.Value + "'";Supplier_Load sl = new Supplier_Load(sql);sl.StartPosition = FormStartPosition.CenterScreen;sl.ShowDialog();return;}//数据库访问break;case 1:if (dateTimeInput3.Text == "" && dateTimeInput4.Text == ""){string sql = "SELECT * FROM [ZCERP].[dbo].[ZH_PAY_SUPPLIER] WHERE OD_PAY_ALL_M ='否'"; Supplier_Load sl = new Supplier_Load(sql);sl.StartPosition = FormStartPosition.CenterScreen;sl.ShowDialog();return;}if (dateTimeInput3.Text != "" && dateTimeInput4.Text == ""){string sql = "SELECT * FROM [ZCERP].[dbo].[ZH_PAY_SUPPLIER] WHERE OD_PAY_ALL_M ='否' AND Input_Date >='" + dateTimeInput3.Value + "'";Supplier_Load sl = new Supplier_Load(sql);sl.StartPosition = FormStartPosition.CenterScreen;sl.ShowDialog();return;}if (dateTimeInput3.Text != "" && dateTimeInput4.Text != ""){string sql = "SELECT * FROM [ZCERP].[dbo].[ZH_PAY_SUPPLIER] WHERE OD_PAY_ALL_M ='否' AND Input_Date >='" + dateTimeInput3.Value + "' AND Input_Date <='" + dateTimeInput4.Value + "'";Supplier_Load sl = new Supplier_Load(sql);sl.StartPosition = FormStartPosition.CenterScreen;sl.ShowDialog();return;}if (dateTimeInput3.Text == "" && dateTimeInput4.Text != ""){string sql = "SELECT * FROM [ZCERP].[dbo].[ZH_PAY_SUPPLIER] WHERE OD_PAY_ALL_M ='否' AND Input_Date <='" + dateTimeInput4.Value + "'";Supplier_Load sl = new Supplier_Load(sql);sl.StartPosition = FormStartPosition.CenterScreen;sl.ShowDialog();return;}break;}}//++++++/* 查看视频*///数据设置using System.Runtime.Remoting.Metadata.W3cXsd2001;using System.Web.UI.WebControls;public class Cksp{public virtual DragPropertyGridRowFromCustomizationFormWithInsertAfterDragActionParams DragPropertyGridRowFromCustomizationFormWithInsertAfterDragActionParams{get//客户端选定{if((this.mDragPropertyGridRowFromCustomizationFormWithInsertAfterDragActionParams == null)){this.mDragPropertyGridRowFromCustomizationFormWithInsertAfterDragActionParams = new DragPropertyGridRowFromCustomizationFormWithInsertAfterDragActionParams();}returnthis.mDragPropertyGridRowFromCustomizationFormWithInsertAfterDragActionParams;}}public virtual CheckDraggingPropertyGridRowFromCustomizationFormWithInsertAfterDragActionExpectedValues CheckDraggingPropertyGridRowFromCustomizationFormWithInsertAfterDragActionExpectedValues {get{if((this.mCheckDraggingPropertyGridRowFromCustomizationFormWithInsertAfterDragActionExpectedValues == null)){this.mCheckDraggingPropertyGridRowFromCustomizationFormWithInsertAfterDragActionExpectedVal ues = new CheckDraggingPropertyGridRowFromCustomizationFormWithInsertAfterDragActionExpectedValues();}returnthis.mCheckDraggingPropertyGridRowFromCustomizationFormWithInsertAfterDragActionExpectedValues;}}public virtual DragPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionParams DragPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionParams {get{if((this.mDragPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionParams == null)){this.mDragPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionPara ms = new DragPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionParams();}returnthis.mDragPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionParams;}}public virtual CheckDraggingPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionExpect edValues CheckDraggingPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionExpect edValues{get{if((this.mCheckDraggingPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActio nExpectedValues == null)){this.mCheckDraggingPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragA ctionExpectedValues = new CheckDraggingPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionExpect edValues();}//删除序列returnthis.mCheckDraggingPropertyGridRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionExpectedValues;}}public virtual DragPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionParams DragPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionParams{get{if((this.mDragPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionParams == null)) {this.mDragPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionParams = new DragPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionParams();}returnthis.mDragPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionParams;}}public virtual CheckDraggingPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionExpectedValu es CheckDraggingPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionExpectedValu es{get{if((this.mCheckDraggingPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionExpec tedValues == null)){this.mCheckDraggingPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionEx pectedValues = new CheckDraggingPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionExpectedValu es();}returnthis.mCheckDraggingPropertyGridCategoryRowsFromCustomizationFormWithMoveChildDragActionExpecte dValues;}}public virtualDragPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionParams DragPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionParams {get{if((this.mDragPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragAction Params == null)){this.mDragPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragAc tionParams = new DragPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionParams( );}returnthis.mDragPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActionP arams;}}public virtual CheckDraggingPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActi onExpectedValues CheckDraggingPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActi onExpectedValues{//删除信息项get{if((this.mCheckDraggingPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChild DragActionExpectedValues == null)){this.mCheckDraggingPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveC hildDragActionExpectedValues = new CheckDraggingPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDragActi onExpectedValues();}returnthis.mCheckDraggingPropertyGridCategoryRowsFromCustomizationFormToCollapsedRowWithMoveChildDr agActionExpectedValues;//登录信息}。
车牌识别系统源代码
![车牌识别系统源代码](https://img.taocdn.com/s3/m/8e486323453610661ed9f47d.png)
num=0;
for j=1:b
if goal(i,j)==1
num=num+1;
end
end
if num<(b*0.1)
line_down=i;
break;
end
x(k)=uint8(x(k));
if x(k)>0 %当所选区域不为空时进行输出
11=11+1;% 用来记录输出的字符数
s(11)=char(x(k));
end
temp(32,32)=0;
imshow(temp);
end
now=now+2;
goalboundary=boundary;
s=min(goalboundary,[],1);
e=max(goalboundary,[],1);
goal=imcrop(Image,[s(2) s(1) e(2)- s(2) e(1)-s(1)]);
end
text(boundray(1,2)-35,boundray(1,1)+13,metric_string,'Color','g','FontSize',14,'FontWeight','bold');%显示匹配度字串
B6=imerode(B5,se);
[B,L]=bwboundaries(B6,4);%对边界图进行小区域联通,是车牌区域连通为一个方块
imshow(label2rgb(L,@jet,[.5 .5 .5]))%对连通区域进行标记
hold on
for k=1:length(B)
实验报告用MATLAB实现车牌识别系统
![实验报告用MATLAB实现车牌识别系统](https://img.taocdn.com/s3/m/dadda4f3d5bbfd0a7956734e.png)
图像处理大作业实验报告--用MATLAB实现车牌识别系统作者东南大学电子系李浩翔06006435指导老师张雄实验日期2010-1-10索引:实验目的实验原理实验步骤1.预处理2.边缘识别3.小区块联通4.车牌区域的识别并截取5.字符截取6.字符识别实验思路分析本程序的局限性附录附录1 程序源代码1.主程序2.子函数(code)附录2 测试图像处理过程汇总1.测试图像12.测试图像2附录3 参考文献及参考程序实验目的(返回索引)使用MATLAB对包含车牌的图片进行处理,利用算法识别出车牌所在的区域,并辨认其数字及字母,最后在屏幕上输出所识别出的车牌号。
实验原理(返回索引)1.将拍摄下的彩色图像转换为灰度图,之后用中值滤波对灰度图像进行预处理,从而减少干扰信息。
2.使用sobel算子识别出图像的边缘,并转化为二值化图像。
并对二值化之后的图像进行卷积,加强边缘的轮廓。
3.用膨胀-再腐蚀的方法分别作用于图像的横轴与纵轴,将小块的联通区域连接起来,使车牌的形状更加清晰,为下一步的识别做好准备。
4.利用车牌长宽比的特性对各个联通区域进行判断,识别出车牌所在区域,并截取。
5.对截取出的车牌区域进行进一步的处理,分割出各个字符。
6.对分割出的字符进行特征判断,从而识别出具体的车牌号。
实验步骤(返回索引)1.预处理(返回索引)A. 将拍摄下的彩色图像转换为灰度图,便于进行接下来的算法处理。
图1 拍摄下的图片B.对灰度图进行中值滤波,减少干扰点对二值化运算结果的影响。
图3 进行中值滤波后的灰度图C.将中值滤波后的灰度图用设定门限灰度的方法(取门限值为0.2)转化为二值化图像,在后继的车牌区域截取运算中作为源图像使用。
图4 使用设定灰度门限的方法获得的二值化图像2.边缘识别(返回索引)A.利用sobel算子识别出图3中的边缘区域,并将其转换为二值化图像。
在转换后的二值化图像中,边缘区域被作为白点标出,而非边缘区域被黑色区域覆盖。
中国车牌号的识别大全(完整版)
![中国车牌号的识别大全(完整版)](https://img.taocdn.com/s3/m/5a5a3e270722192e4536f64b.png)
中国车牌号的识别大全(包括军车和政府高官用车)北京市(京)京A、京C、京E、京F、北京市(城区),京G 北京市(远郊区), 京B 出租车,京O警察天津市(津)津A、津B、津C、天津市 ,津E 出租车上海市(沪)沪A、沪B、沪D 上海市区,沪C 远郊区重庆市(渝)渝A 重庆市区(江南),渝B 重庆市区(江北),渝C 永川区,渝F 万州区,渝G 涪陵区,渝H 黔江区河北省(冀)冀A 石家庄,冀B 唐山,冀C 秦皇岛,冀D 邯郸,冀E邢台,冀F 保定,冀G 张家口,冀H 承德,冀J 沧州,冀R 廊坊,冀T 衡水河南省(豫)豫A 郑州,豫B 开封,豫C 洛阳,豫D 平顶山,豫E 安阳,豫F 鹤壁,豫G 新乡,豫H 焦作,豫J 濮阳,豫K 许昌,豫L 漯河,豫M 三门峡,豫N 商丘,豫P 周口,豫Q 驻马店,豫R 南阳,豫S 信阳,豫U 济源云南省(云)云A 昆明,云B 东川,云C 昭通,云D 曲靖, 云E 楚雄彝族,云F 玉溪,云G 红河哈尼族,云H 文山壮族苗,云J 思茅,云L 大理白族,云K 西双版纳,云M 保山,云N 德宏傣族,云P 丽江,云Q 怒江傈族,云R 迪庆藏族,云S 临沧辽宁省(辽)辽A 沈阳,辽B 大连,辽C 鞍山,辽D 抚顺,辽E 本溪,辽F 丹东,辽G 锦州,辽H 营口,辽J 阜新,辽K 辽阳,辽L 盘锦,辽M 铁岭,辽N 朝阳,辽P 葫芦岛,辽V 省直机关黑龙江省(黑)黑A 哈尔滨 ,黑B 齐齐哈尔,黑C 牡丹江,黑D 佳木斯,黑E 大庆,黑F 伊春,黑G 鸡西,黑H 鹤岗,黑J 双鸭山,黑K 七台河,黑L 松花江行署,黑M 绥化,黑N 黑河,黑P 大兴安岭湖南省(湘)湘A 长沙,湘B 株洲,湘C 湘潭,湘D 衡阳,湘E 邵阳,湘F 岳阳,湘G 大庸,湘H 益阳,湘J 常德,湘K 娄底,湘L 郴州,湘M 零陵,湘N怀化,湘P 湘西州安徽省(皖)皖A 合肥,皖B 芜湖,皖C 蚌埠,皖D 淮南,皖E 马鞍山,皖F 淮北,皖G 铜陵,皖H 安庆,皖J 黄山,皖K 阜阳,皖L 宿州,皖M 滁州,皖N 六安,皖P 宣城,皖Q 巢湖,皖R 池州山东省(鲁)鲁A 济南,鲁B 青岛,鲁C 淄博,鲁D 枣庄,鲁E 东营,鲁F 烟台,鲁G 潍坊,鲁H 济宁,鲁J 泰安,鲁K 威海,鲁L 日照,鲁M 莱芜,鲁N 德州,鲁P 聊城,鲁Q 临沂,鲁R 菏泽,鲁U 青岛开发区新疆维吾尔(新)新A 乌鲁木齐,新B 昌吉回族,新C 石河子,新D 奎屯,新E 博尔塔拉,新F 伊犁哈萨,新G 塔城,新H 阿勒泰,新J 克拉玛依,新K 吐鲁番, 新L 哈密,新M 巴音郭,新N 阿克苏,新P 克孜勒苏柯,新Q 喀什,新R 和田江苏省(苏)苏A 南京,苏B 无锡,苏C 徐州,苏D 常州,苏E 苏州,苏F 南通,苏G 连云港,苏H 淮阴,苏J 盐城,苏K 扬州,苏L 镇江,苏M 泰州,苏N 宿迁浙江省(浙)浙A 杭州,浙B 宁波,浙C 温州,浙D 绍兴,浙E 湖州,浙F 嘉兴,浙G 金华,浙H 衢州,浙J 台州,浙K 丽水,浙L 舟山江西省(赣)赣A 南昌,赣B 赣州,赣C 宜春,赣D 吉安,赣E 上饶,赣F 抚州,赣G 九江,赣H 景德镇,赣J 萍乡,赣K 新余,赣L 鹰潭湖北省(鄂)鄂A 武汉,鄂B 黄石,鄂C 十堰,鄂D 沙市,鄂E 宜昌,鄂F 襄樊,鄂G 鄂州,鄂H 荆门,鄂J 黄岗,鄂K 孝感,鄂L 咸宁,鄂M 荆州,鄂N 郧阳,鄂P 宜昌,鄂Q 鄂西州 广西壮族(桂)桂A 南宁,桂B 柳州,桂C 桂林,桂D 梧州,桂E 北海,桂F 南宁,桂G 柳州,桂H 桂林,桂J 贺州(属梧州),桂K 玉林,桂M 河池,桂L 百色,桂N 钦州,桂P 防城甘肃省(甘)甘A 兰州,甘B 嘉峪关,甘C 金昌,甘D 白银,甘E 天水,甘F 酒泉,甘G 张掖,甘H 武威,甘J 定西,甘K 陇南,甘L 平凉,甘M 庆阳 ,甘N 临夏回族,甘P 甘南藏族山西省(晋)晋A 太原,晋B 大同,晋C 阳泉,晋D 长治,晋E 晋城,晋F 朔州,晋H 忻州,晋J 吕梁,晋K 晋中,晋L 临汾,晋M 运城内蒙古(蒙)蒙A 呼和浩特,蒙B 包头,蒙C 乌海,蒙D 赤峰,蒙E呼伦贝尔盟,蒙F 兴安盟,蒙G 锡林郭勒盟,蒙H 乌兰察布盟,蒙J 伊克昭盟,蒙K 巴彦淖尔盟,蒙L 阿拉善盟陕西省(陕)陕A 西安,陕B 铜川,陕C 宝鸡,陕D 威阳,陕E 渭南,陕F 汉中,陕G 安康,陕H 商洛,陕J 延安,陕K 榆林,陕U 省直机关吉林省(吉)吉A 长春,吉B 吉林,吉C 四平,吉D 辽源,吉E 通化,吉F 白山,吉G 白城,吉H 延边朝鲜族福建省(闽)闽A 福州,闽B 莆田,闽C 泉州,闽D 厦门,闽E 漳州,闽F 龙岩,闽G 三明,闽H 南平,闽J 宁德,闽K 省直机关贵州省(贵)贵A 贵阳,贵B 六盘水,贵C 遵义,贵D 铜仁,贵E 黔西南州,贵F 毕节,贵G 安顺,贵H 黔东南州,贵J 黔南州 广东省(粤)粤A 广州,粤B 深圳,粤C 珠海,粤D 汕头,粤E 佛山,粤F 韶关,粤G 湛江,粤H 肇庆,粤J 江门,粤K 茂名,粤L 惠州,粤M 梅州,粤N 汕尾,粤P 河源,粤Q 阳江,粤R 清远,粤S 东莞,粤T 中山,粤U 潮州,粤V 揭阳,粤W 云浮,粤X 顺德,粤Y 南海,粤Z港澳进入内地车辆 青海省(青)青A 西宁,青B 海东,青C 海北,青D 黄南,青E 海南州,青F 果洛州,青G 玉树州,青H 海西州,西藏(藏)藏A 拉萨,藏B 昌都,藏C 山南,藏D 日喀则,藏E 那曲,藏F 阿里,藏G 林芝四川省(川)川A 成都,川B 绵阳,川C 自贡,川D 攀枝花,川E 泸州,川F 德阳,川H 广元,川J 遂宁,川K 内江,川L 乐山,川Q 宜宾,川R 南充,川S 达县,川T 雅安,川U 阿坝藏族,川V 甘孜藏族,川W 凉山彝族,川Z 眉山。
基于 OpenCV 和 Python 车牌识别系统的设计与实现代码大全
![基于 OpenCV 和 Python 车牌识别系统的设计与实现代码大全](https://img.taocdn.com/s3/m/95b10fe609a1284ac850ad02de80d4d8d15a01d9.png)
题目基于OpenCV和Python车牌识别系统的设计与实现1.1 题目的主要研究内容(1)工作的主要描述利用python中自带的opencv库中的模式识别算法制作一个简易的模式识别系统,使用自己搜集到的数据集对模型进行训练,最终完成特征提取、分类等工作,并且在最后的推理过程中,实现了车牌识别的工作。
(2)系统流程图1.2 题目研究的工作基础或实验条件项目的编程环境为python,编译器使用pycharm2021.3 x64,设计一个车牌识别系统,有GUI界面。
选择一张有车牌的图片后,完成车牌定位、倾斜校正、字符分割,最后通过k-NN 算法对车牌的字母和数字进行识别,将识别结果在GUI界面中显示出来1.3 数据集描述车牌定位就是在图片中识别出哪个位置有车牌,是字符分割和字母数字识别的前提,是车牌识别系统的关键和难点。
:例如,训练数据的目录结构树如下所示:1.4 特征提取过程描述1.对原始图像进行高斯模糊,减少噪点。
2.提取图像边缘。
首先将彩色图像转为灰度图gray,利用大核对灰度图进行开操作得到图像open,相当于对灰度图进行涂抹操作,将灰度图gray和开操作后的图像open按1:-1的比例融合得到图像add,以上操作可以将大面积灰度值相似的地方置黑,可以减少车灯、背景、地面、挡风玻璃等细节。
接着使用canny 算法对融合图像add提取边缘,得到图像canny。
3.使用横向长条作为核对边缘图像进行一次闭操作,得到图像close,相当于对边缘横向涂抹,因为一般视角车牌是宽大于高的矩形。
再对图像close进行一次开操作,得到图像open2,消除较细的线条和不大的竖向线条,从而将车牌位置的连通区域独立出来。
4.查找连通区域,通过最小外接矩形的宽高比2~5.5筛选合适的连通区域。
5.将最小外接矩形图像旋转矫正,上下左右向外扩展一点范围,避免连通区域没能覆盖车牌造成影响。
6.将连通区域原图转为HSV图像,确定图像的主要颜色,若不为蓝、黄、绿,则排除。
车牌识别代码
![车牌识别代码](https://img.taocdn.com/s3/m/724df50552d380eb62946d3a.png)
车牌识别代码[fn,pn,fi]=uigetfile;%读入文件I=imread([pn fn]);figure,imshow(I);%显示原始图像title;Im1=rgb2gray(I);figure(2),subplot(1,2,1),imshow(Im1);title('灰度图');tic %计时开始[height,width]=size(Im1);%预处理I_edge=zeros(height,width);% 创建height*width的矩阵for i=1:width-1 % 对每一列开始遍历I_edge(:,i)=abs(I(:,i+1)-I(:,i));% 每列的值赋为原图像中左右两列相减的绝对值(即梯度) end% 归一化处理(0~255)I_edge=(255/(max(max(I_edge))-min(min(I_edge))))*(I_edge-min(min(I_edge)));figureimshow(I_edge);title('归一化处理')[I_edge,y1]=select(I_edge,height,width); %%%%%%调用select函数figureimshow(I_edge);title('选择')BW2 = I_edge;%%%%%%%%%%%%%%%%%一些形态学处理SE=strel('rectangle',[10,10]);IM2=imerode(BW2,SE);%腐蚀figureimshow(IM2);title('腐蚀');IM2=bwareaopen(IM2,20);%开运算,消除细小物体figureimshow(IM2);title('开运算');IM3=imdilate(IM2,SE);%膨胀figureimshow(IM2);title('膨胀'); %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%投影以粗略估计车牌位置p_h=projection(double(IM3),'h'); %调用projection函数if(p_h(1)>0)p_h=[0,p_h];endp_v=projection(double(IM3),'v'); %调用projection函数if(p_v(1)>0)p_v=[0,p_v];end%%%%%%p_h=double((p_h>5));p_h=find(((p_h(1:end-1)-p_h(2:end))~=0));len_h=length(p_h)/2;%%%%%p_v=double((p_v>5));p_v=find(((p_v(1:end-1)-p_v(2:end))~=0));len_v=length(p_v)/2;%%%%%%%%%%%%%%%%%%%%%%%%%%%%粗略计算车牌候选区k=1;for i=1:len_hfor j=1:len_vs=IM3(p_h(2*i-1):p_h(2*i),p_v(2*j-1):p_v(2*j));if(mean(mean(s))>0.1)p{k}=[p_h(2*i-1),p_h(2*i)+1,p_v(2*j-1),p_v(2*j)+1];k=k+1;endendendk=k-1;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%进一步缩小车牌候选区for i=1:kedge_IM3=double(edge(double(IM3(p{i}(1):p{i}(2),p{i}(3):p{i}(4))),'canny'));[x,y]=find(edge_IM3==1);p{i}=[p{i}(1)+min(x),p{i}(2)-(p{i}(2)-p{i}(1)+1-max(x)),...p{i}(3)+min(y),p{i}(4)-(p{i}(4)-p{i}(3)+1-max(y))];p_center{i}=[fix((p{i}(1)+p{i}(2))/2),fix((p{i}(3)+p{i}(4))/2)];p_ratio(i)=(p{i}(4)-p{i}(3))/(p{i}(2)-p{i}(1));end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%对上面参数和变量的说明:p为一胞元,用于存放每个图像块的左上和右下两个点的坐标;%存放格式为:p{k}=[x1,x2,y1,y2];x1,x2分别为行坐标,y1,y2为列坐标%p_center为一胞元,用于存放每个图像块的中心坐标,p_center{k}=[x,y];x,y分别为行,列坐标%p_ratio为一矩阵,用来存放图像块的长宽比例%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%合并临近区域%%%%%%%%如果有多个区域则执行合并if k>1n=0;ncount=zeros(1,k);for i=1:k-1%%%需要调整if条件中的比例%%%需要调整%检查是否满足合并条件if(abs(p{i}(1)+p{i}(2)-p{i+1}(1)-p{i+1}(2))<=height/30&&abs(p{i+1}(3)-p{i}(4))<=width/15) p{i+1}(1)=min(p{i}(1),p{i+1}(1));p{i+1}(2)=max(p{i}(2),p{i+1}(2));p{i+1}(3)=min(p{i}(3),p{i+1}(3));p{i+1}(4)=max(p{i}(4),p{i+1}(4)); %向后合并n=n+1;ncount(n)=i+1;endend%如果有合并,求出合并后最终区域if(n>0)d_ncount=ncount(2:n+1)-ncount(1:n);%避免重复记录临近的多个区域。
基于Python实现的车牌识别项目
![基于Python实现的车牌识别项目](https://img.taocdn.com/s3/m/ee948439905f804d2b160b4e767f5acfa1c78339.png)
基于Python实现的车牌识别项⽬车牌识别在⾼速公路中有着⼴泛的应⽤,⽐如我们常见的电⼦收费(ETC)系统和交通违章车辆的检测,除此之外像⼩区或地下车库门禁也会⽤到,基本上凡是需要对车辆进⾏⾝份检测的地⽅都会⽤到。
简介车牌识别系统(Vehicle License Plate Recognition)是计算机视频图像识别技术在车辆牌照识别中的⼀种应⽤,通常⼀个车牌识别系统主要包括以下这四个部分:车辆图像获取车牌定位车牌字符分割车牌字符识别我们再来看⼀下百科中对车牌识别技术的描述:车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,通过车牌提取、图像预处理、特征提取、车牌字符识别等技术,识别车辆牌号、颜⾊等信息,⽬前最新的技术⽔平为字母和数字的识别率可达到 99.7%,汉字的识别率可达到99%。
实现⽅式我们这⾥不做太复杂的车辆动态识别,只演⽰从图像中识别车牌信息,车牌识别功能的实现⽅式⼤致分为两种,⼀种是⾃⼰编写代码实现,另⼀种是借助第三⽅ API 接⼝实现。
⾃⼰实现如果我们想要通过 Python ⾃⼰⼿动编码实现车牌识别功能,可以借助⼀些 Python 库,⽐如:OpenCV、TensorFlow 等,这种⽅式因为每⼀个功能点都需要我们⾃⼰编码实现,所有会相对复杂⼀些,另⼀⽅⾯如果我们想要保证识别的准确性,可能需要做⼤量的实验,也就是说会花费更多的时间。
第三⽅接⼝现在已经有⼀些第三⽅平台实现好了车牌识别的功能,并且他们对外提供了 API 接⼝,我们只需要调⽤他们提供的接⼝即可,这种⽅式实现就相对简单了⼀些,并且通常接⼝提供⽅对外提供的接⼝功能的准确性也是基本可以保证的,原因很简单,如果接⼝功能太差的话,⼀是⾃⼰打脸,还有就是基本不会有什么⼈使⽤,也就失去了接⼝对外提供的价值了,另外第三⽅接⼝可能会收取⼀定费⽤,因此,如果现实中我们具体实现的话要综合考虑。
具体实现SDK 安装百度云 SDK 对多种语⾔提供了⽀持,⽐如:Python、Java、C++、IOS、Android 等,这⾥我们安装 Python 版的 SDK,安装很简单,使⽤pip install baidu-aip命令即可。
车牌识别代码OpenCV
![车牌识别代码OpenCV](https://img.taocdn.com/s3/m/efc8ade20875f46527d3240c844769eae009a33d.png)
车牌识别代码OpenCV#include<opencv2\opencv.hpp>#include<iostream> using namespace cv; using namespace std; int areas;//该函数⽤来验证是否是我们想要的区域,车牌定位原理其实就是在图⽚上寻找矩形,我们可以⽤长宽⽐例以及⾯积来验证是否是我们想要的矩形,宽⾼⽐为520/110=4.7272 (车牌的长除以宽),区域⾯积最⼩为15个像素,最⼤为125个像素bool VerifySize(RotatedRect candidate) { float error = 0.4; //40%的误差范围float aspect = 4.7272;//宽⾼⽐例int min = 25 * aspect * 25; //最⼩像素为15int max = 125 * aspect * 125;//最⼤像素为125float rmin = aspect - aspect*error;//最⼩误差float rmax = aspect + aspect*error;//最⼤误差int area = candidate.size.height*candidate.size.width;//求⾯积float r = (float)candidate.size.width / (float)candidate.size.height;//长宽⽐if (r < 1)r = 1 / r;if (area<min || area>max || r<rmin || r>rmax)return false;elsereturn true; } int main(int argc, char** argv) {Mat src;src = imread("D:\\Car1.jpg");//读取含车牌的图⽚if (!src.data) {cout << "Could not open Car.jph.." << endl;return -1;}Mat img_gray;cvtColor(src, img_gray, CV_BGR2GRAY);//灰度转换Mat img_blur;blur(img_gray, img_blur, Size(5, 5));//⽤来降噪Mat img_sobel;Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3);//Sobel滤波,对x进⾏求导,就是强调y⽅向,对y进⾏求导,就是强调x⽅向,在此我们对x求导,查找图⽚中的竖直边Mat img_threshold;threshold(img_sobel, img_threshold, 0, 255, THRESH_BINARY | THRESH_OTSU);Mat element = getStructuringElement(MORPH_RECT, Size(21, 5));//这个Size很重要!!不同的图⽚适应不同的Size,待会在下⾯放图,⼤家就知道区别了morphologyEx(img_threshold, img_threshold,MORPH_CLOSE,element);//闭操作,就是先膨胀后腐蚀,⽬的就是将图⽚联通起来,取决于element的Size。
车牌识别开源项目汇总
![车牌识别开源项目汇总](https://img.taocdn.com/s3/m/3b8ea6f9b9f67c1cfad6195f312b3169a451ea26.png)
车牌识别开源项⽬汇总⼀.EasyPR相关讲解开源库介绍 EasyPR是⼀个中⽂的开源车牌识别系统,其⽬标是成为⼀个简单、⾼效、准确的车牌识别引擎。
相⽐于其他的车牌识别系统,EasyPR有如下特点:它基于openCV这个开源库。
这意味着你可以获取全部源代码,并且移植到java等平台。
它能够识别中⽂。
例如车牌为苏EUK722的图⽚,它可以准确地输出std:string类型的"苏EUK722"的结果。
它的识别率较⾼。
图⽚清晰情况下,车牌检测与字符识别可以达到80%以上的精度。
车牌检测(Plate Detection):对⼀个包含车牌的图像进⾏分析,最终截取出只包含车牌的⼀个图块。
这个步骤的主要⽬的是降低了在车牌识别过程中的计算量。
如果直接对原始的图像进⾏车牌识别,会⾮常的慢,因此需要检测的过程。
在本系统中,我们使⽤SVM(⽀持向量机)这个机器学习算法去判别截取的图块是否是真的“车牌”。
字符识别(Chars Recognition):有的书上也叫Plate Recognition,我为了与整个系统的名称做区分,所以改为此名字。
这个步骤的主要⽬的就是从上⼀个车牌检测步骤中获取到的车牌图像,进⾏光学字符识别(OCR)这个过程。
其中⽤到的机器学习算法是著名的⼈⼯神经⽹络(ANN)中的多层感知机(MLP)模型。
最近⼀段时间⾮常⽕的“深度学习”其实就是多隐层的⼈⼯神经⽹络,与其有⾮常紧密的联系。
通过了解光学字符识别(OCR)这个过程,也可以知晓深度学习所基于的⼈⼯神经⽹路技术的⼀些内容。
完整的EasyPR流程具体说来,EasyPR中PlateDetect与CharsRecognize各包括三个模块。
PlateDetect包括的是车牌定位,SVM训练,车牌判断三个过程,见下图。
PlateDetect过程我们获得了许多可能是车牌的图块,将这些图块进⾏⼿⼯分类,聚集⼀定数量后,放⼊SVM模型中训练,得到SVM的⼀个判断模型,在实际的车牌过程中,我们再把所有可能是车牌的图块输⼊SVM判断模型,通过SVM模型⾃动的选择出实际上真正是车牌的图块。
车牌识别系统源代码
![车牌识别系统源代码](https://img.taocdn.com/s3/m/ab800eabdbef5ef7ba0d4a7302768e9951e76efa.png)
车牌识别系统源代码k=input(‘Enter the file name:,''s’);%输入车牌照片pic=imread(k);imshow(pic);pic_gray=rgb2gray(pic);pic_gray=medfilt2(pic_gray,[3,3]);%对灰度图像进行中值滤波Image=im2bw(pic_gray,0.2);BW=edge(pic_gray,‘sobel’);%找出图像的边缘[imx,imy]=size(BW);%计算图像大小msk=[0 0 0 0 0;0 1 1 1 0;0 1 1 1 0;0 1 1 1 0;0 0 0 0 0;];B0=conv2(double(BW),double(msk));%对边缘区域进行加强se=ones(2,80);B1=imdilate(B0,se);%figure;%imshow(B1);B2=imerode(B1,se);se=ones(20,2);B3=imdilate(B2,se);B4=imerode(B3,se);se=ones(50,2);B5=imdilate(B4,se);B6=imerode(B5,se);[B,L]=bwboundaries(B6,4);%对边界图进行小区域联通,是车牌区域连通为一个方块imshow(label2rgb(L,@jet,[.5 .5 .5]))%对连通区域进行标记hold onfor k=1:length(B)boundary=B{k};plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)endfor k=1:length(B) %循环遍历每个连通域的边界boundary=B{k}; %获取一条边界上的所有点delta_sq=diff(boundary).^2;perimeter=sum(sqrt(sum(delta_sq,2))); %计算边界周长area=stats(k).Area;%获取边界所围面积metric=27*area/perimeter^2;%计算匹配度metric_string=sprintf('%2.2f',metric);%要显示的匹配度字串endif metric>=0.85&&metric<=1.15&&area>1000 %截取出匹配度接近1且面积大于1000像素的连通域centroid=stats(k).Centroid;plot(centroid(1),centroid(2),'ko');%提取该连通域所对应在二值图像中的矩形区域goalboundary=boundary;s=min(goalboundary,[],1);e=max(goalboundary,[],1);goal=imcrop(Image,[s(2) s(1) e(2)- s(2) e(1)-s(1)]);endtext(boundray(1,2)-35,boundray(1,1)+13,metric_string,'Color','g','FontSize',14,'Font Weight','bold');%显示匹配度字串endgoal=~goal; %对截取图像进行反色处理figure;imshow(goal);[a,b]=size(goal);for i=a/2:-1:1 %从图像水平轴开始向上扫描,当白点数少于每行点总数的1/10时,停止扫描,并将该行定义为车牌字符区域的上限num=0;for j=1:bif goal(i,j)==1num=num+1;endendif num<(b*0.1)line_up=i;break;endendfor i=a/2:a %从图像水平中轴开始向下扫描,当白点数少于每行点总数的1/10时,停止扫描,并将该行定义为车牌字符区域的下限num=0;for j=1:bif goal(i,j)==1num=num+1;endendif num<(b*0.1)line_down=i;break;endendgoal=goal(line_up:line_down,1:b);%根据之前定义的上下限截取车牌字符区域figure;imshow(goal);%显示车牌字符区域[a,b]=size(goal);row=zeros(18);now=1;flag=0;for j=1:b %对截取出的字符区域进行列竖扫描,并且取每列总点数的十分之一作为阀值点,当每列的白点数从阀值以上掉落到阀值以下或从阀值以下上升到阀值以上时,记录该列的横坐标num=0;for i=1:aif goal(i,j)==1num=num+1;endendif flag==0if num<(a*0.1)row(now)=j;now=now+1;flag=1;endelseif num>(a*0.1)row(now)=j;now=now+1;flag=0;endendendif row(3)-row(2)>10%判断扫描出的第二块区域(扫描到的第二列与第三列之间)是否包含有效字符,如包含,则将扫描到的第二列定义为字符分割的起始列;否则,则定义第一列为起始列now=2;elsenow=1;endfigure;11=0;12=0;for k=1:8m=row(now);m=row(now+1);temp=goal(1:a,m:n);point=0;%扫描每个字符图片的白点数for i=1:afor j=1:n-mif temo(i,j)==1point= point+1;endendendif point>0.4*a*(n-m)&&n>m %当扫描到的白点数小于总点数的5分之二是放弃输出(有可能是车牌上的点状分割符)12=12+1;% 用来记录识别出的字符数subplot(1,7,12);x(k)=code(temp);%调用子程序进行字符扫描,并返回字符的ASCII码x(k)=uint8(x(k));if x(k)>0 %当所选区域不为空时进行输出11=11+1;% 用来记录输出的字符数s(11)=char(x(k));endtemp(32,32)=0;imshow(temp);endnow=now+2;endy=char(s);%将得到的ASCII码重新转换为字符并在屏幕上输出fprintf('该车辆的车牌号为:')disp(y);fprintf('输出的字符数为: %4d\\',11)fprintf('识别出的字符数为: %4d\\',12)。
车牌识别系统基于开发系统代码大全
![车牌识别系统基于开发系统代码大全](https://img.taocdn.com/s3/m/b3cdffc5d5bbfd0a79567314.png)
// 图像字符识别毕业设计View.cpp : CMyView 类的实现//#include "stdafx.h"#include "图像字符识别毕业设计.h"#include "图像字符识别毕业设计Doc.h"#include "图像字符识别毕业设计View.h"#include ".\图像字符识别毕业设计view.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// CMyViewIMPLEMENT_DYNCREATE(CMyView, CView)BEGIN_MESSAGE_MAP(CMyView, CView)// 标准打印命令ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) ON_COMMAND(ID_FILE_OPEN, OnFileOpen)ON_COMMAND(ID_IMAGE_PARAMENT, OnImageParament)ON_COMMAND(ID_FIND_CARNUMBER, OnFindCarnumber)ON_COMMAND(ID_COLOR_CRAY, OnColorCray)ON_COMMAND(ID_MEDIAN5, OnMedian5)ON_COMMAND(ID_LOG_BORDDETEC, OnLogBorddetec)ON_COMMAND(ID_OTSU_THRESHOLD, OnOtsuThreshold)ON_COMMAND(ID_CATCH_NUMBERONCE, OnCatchNumberonce) ON_COMMAND(ID_Lap_Borddetec, OnLapBorddetec)ON_COMMAND(ID_CATCH_BNUMBER, OnCatchBnumber)ON_COMMAND(ID_GET_CARNUMBER, OnGetCarnumber)ON_COMMAND(ID_GET_HCARNUMBER, OnGetHcarnumber)ON_COMMAND(ID_NUMBER_CUT, OnNumberCut)ON_COMMAND(ID_ADD_ALL, OnAddAll)ON_COMMAND(ID_NUMBER_STUDY, OnNumberStudy)ON_COMMAND(ID_FIRSTNUMBER_RECOGNISE, OnFirstnumberRecognise) ON_COMMAND(ID_SECONDNUMBER_RECOGNISE, OnSecondnumberRecognise) ON_COMMAND(ID_THIRDNUMBER_RECOGNISE, OnThirdnumberRecognise) ON_COMMAND(ID_FOURTHNUMBER_RECOGNISE, OnFourthnumberRecognise) ON_COMMAND(ID_FIFTHNUMBER_RECOGNISE, OnFifthnumberRecognise) ON_COMMAND(ID_SISTHNUMBER_RECOGNISE, OnSisthnumberRecognise) ON_COMMAND(ID_SEVENTHNUMBER_RECOGNISE, OnSeventhnumberRecognise) ON_COMMAND(ID_ZIMU_STUDY, OnZimuStudy)ON_COMMAND(ID_HANZI_STUDY, OnHanziStudy)ON_COMMAND(ID_ZHIFUSHIBIE_ZONGHE, OnZhifushibieZonghe)END_MESSAGE_MAP()// CMyView 构造/析构CMyView::CMyView(){// TODO: 在此处添加构造代码}CMyView::~CMyView(){}BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs){// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或// 样式return CView::PreCreateWindow(cs);}// CMyView 绘制void CMyView::OnDraw(CDC* pDC){CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码if (!m_Image.IsNull()){m_Image.Draw(pDC->m_hDC,0,0);}}// CMyView 打印BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo){// 默认准备return DoPreparePrinting(pInfo);}void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: 打印前添加额外的初始化}void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: 打印后添加清除过程}// CMyView 诊断#ifdef _DEBUGvoid CMyView::AssertValid() const{CView::AssertValid();}void CMyView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CMyDoc* CMyView::GetDocument() const // 非调试版本是内联的{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));return (CMyDoc*)m_pDocument;}#endif //_DEBUG// CMyView 消息处理程序void CMyView::OnFileOpen(){// TODO: 在此添加命令处理程序代码CString strFilter;CSimpleArray<GUID> aguidFileTypes;HRESULT hResult;// 获取CImage支持的图像文件的过滤字符串hResult =m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "AllImage Files") );if (FAILED(hResult)){MessageBox("GetExporterFilter调用失败!");return;}CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);if(IDOK != dlg.DoModal())return;m_Image.Destroy();// 将外部图像文件装载到CImage对象中hResult = m_Image.Load(dlg.GetFileName());if (FAILED(hResult)) {MessageBox("调用图像文件失败!");return;}// 设置主窗口标题栏内容CString str;str.LoadString(AFX_IDS_APP_TITLE); AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName());Invalidate(); // 强制调用OnDraw}void CMyView::OnImageParament(){// TODO: 在此添加命令处理程序代码CClientDC dc(this);HBRUSH hBrush;HPEN hPen;int i,x,y,k,nYChar;CString str;TEXTMETRIC tm;char *textbuf[]={"像素行的存储顺序","像素宽度","像素高度","每像素位数","每行字节数"};x=775;y=120;hPen=(HPEN) GetStockObject(WHITE_PEN);hBrush=(HBRUSH) GetStockObject(WHITE_BRUSH);dc.SelectObject(hPen);dc.SelectObject(hBrush);dc.GetTextMetrics(&tm);dc.SetTextColor(RGB(0,0,0));nYChar=(tm.tmHeight+tm.tmExternalLeading)*3/2;dc.TextOut(x+60,y-nYChar*3/2,"图像特征参数");for(i=0;i<5;i++){dc.TextOut (x,y+nYChar*i,textbuf[i]);}x+=175;k=m_Image.GetPitch();if(k<0)dc.TextOut (x,y+nYChar*0,"自下而上");elsedc.TextOut (x,y+nYChar*0,"自上而下");str.Format ("%d",abs(k));dc.TextOut (x,y+nYChar*4,str,lstrlen(str));str.Format ("%d",m_Image.GetWidth ());dc.TextOut (x,y+nYChar*1,str);str.Format ("%d",m_Image.GetHeight ());dc.TextOut (x,y+nYChar*2,str);str.Format ("%d",m_Image.GetBPP ());dc.TextOut (x,y+nYChar*3,str);if(m_Image.GetMaxColorTableEntries ()){dc.TextOut (x-175,y+nYChar*6,"调色板单元数");k=m_Image.GetMaxColorTableEntries ();str.Format ("%d",k);dc.TextOut (x,y+nYChar*6,str);}elsedc.TextOut (x-175,y+nYChar*6,"真彩色图像,无调色板");}void CMyView::OnFindCarnumber(){// TODO: 在此添加命令处理程序代码}struct IMAGEPARAMENT {int nWidth;int nHeight;int nBitCount;int nBytesPerLine;int nBytesPerPixel;int nNumColors;int nSize;};void GetImageParament(CImage *pImg,struct IMAGEPARAMENT *ppImgParam){if (pImg->IsNull()) return;ppImgParam->nWidth = pImg->GetWidth();ppImgParam->nHeight = pImg->GetHeight();ppImgParam->nBitCount = pImg->GetBPP();ppImgParam->nBytesPerLine =(pImg->GetWidth()*pImg->GetBPP()+31)/32*4;ppImgParam->nBytesPerPixel = pImg->GetBPP()/8;if (pImg->GetBPP()<=8)ppImgParam->nNumColors= 1 << pImg->GetBPP();elseppImgParam->nNumColors= 0;ppImgParam->nSize =ppImgParam->nBytesPerLine*ppImgParam->nHeight;}void ImageCopy(CImage *pImgn,CImage *pImgm){struct IMAGEPARAMENT P;RGBQUAD ColorTab[256];CDC *pOrigDC,*pDC;GetImageParament(pImgm,&P);if (!pImgn->IsNull())pImgn->Destroy();pImgn->Create(P.nWidth,P.nHeight,P.nBitCount,0);if (P.nNumColors>0){pImgm->GetColorTable(0,P.nNumColors,ColorTab);pImgn->SetColorTable(0,P.nNumColors,ColorTab);}pOrigDC= CDC::FromHandle(pImgm->GetDC());pDC = CDC::FromHandle(pImgn->GetDC());pDC->BitBlt(0,0,P.nWidth,P.nHeight,pOrigDC,0,0,SRCCOPY);pImgm->ReleaseDC();pImgn->ReleaseDC();}void ColorToGray(CImage *pImgn,CImage *pImgm){int i, x, y;int gray[256];BYTE *cbuf,*gbuf;RGBQUAD ColorTab[256];CImage gpImg;CString str1;struct IMAGEPARAMENT P;GetImageParament(pImgm,&P);if (P.nBitCount<8) return;gpImg.Create(P.nWidth,P.nHeight,8,0);for (i=0; i<256; i++){ColorTab[i].rgbBlue = ColorTab[i].rgbGreen =ColorTab[i].rgbRed = i;}gpImg.SetColorTable(0,256,ColorTab);if (pImgm->GetBPP()<=8) { pImgm->GetColorTable(0,P.nNumColors,ColorTab);for (i=0; i<P.nNumColors; i++){gray[i] = (int) (0.11*ColorTab[i].rgbBlue +0.59*ColorTab[i].rgbGreen +0.30*ColorTab[i].rgbRed);}for (y=0; y<P.nHeight; y++) {cbuf = (BYTE*) pImgm->GetPixelAddress(0,y);gbuf = (BYTE*) gpImg.GetPixelAddress(0,y);for (x=0; x<P.nWidth; x++)gbuf[x] = (BYTE) gray[cbuf[x]];}}else {for (y=0; y<P.nHeight; y++) {cbuf = (BYTE*) pImgm->GetPixelAddress(0,y);gbuf = (BYTE*) gpImg.GetPixelAddress(0,y);for (x=0,i=0; x<P.nWidth; x++,i+=P.nBytesPerPixel) { gbuf[x] = (BYTE) (0.11*cbuf[i] + 0.59*cbuf[i+1] +0.30*cbuf[i+2]);}}}ImageCopy(pImgn,&gpImg);gpImg.Destroy();}void CMyView::OnColorCray(){// TODO: 在此添加命令处理程序代码CString str1;ColorToGray(&m_Image,&m_Image);str1.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str1 + " - " +"灰度图");Invalidate();}int MedValue(int *buf,int n,int m){int i,j,k,f;for(i=1;i<n;i++){for(j=n-1,f=0;j>=i;j--){if(buf[j]>buf[j+1]){k=buf[j];buf[j]=buf[j+1];buf[j+1]=k;f=1;}}if(f==0) break;}return(buf[m]);}int buff1[5];void Median5(BYTE **list0,BYTE**list1,int DX,int DY){int flag=5;for(int i=1;i<DY-1;i++){for(int j=1;j<DX-1;j++){buff1[0]=list1[i-1][j];buff1[1]=list1[i][j];buff1[2]=list1[i+1][j];buff1[3]=list1[i][j-1];buff1[4]=list1[i][j+1];list0[i][j]=(BYTE)MedValue(buff1,flag,flag/2);}}}BYTE** Create2DList(CImage *pImg){struct IMAGEPARAMENT P;int i;BYTE **list;GetImageParament(pImg,&P);list=(BYTE**)malloc(P.nHeight*sizeof(BYTE*));for (i=0;i<P.nHeight;i++)list[i]=(BYTE*) pImg->GetPixelAddress(0,i);return(list);}void CMyView::OnMedian5(){// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT PP;BYTE **list1,**list0;ImageCopy(&m_Image1,&m_Image);list1=(BYTE **)Create2DList(&m_Image);list0=(BYTE **)Create2DList(&m_Image1);GetImageParament(&m_Image,&PP);Median5(list0,list1,PP.nWidth,PP.nHeight);ImageCopy(&m_Image,&m_Image1);CString str2;str2.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str2 + " - " +"5点中值滤波");Invalidate();}int Mask[3][3],Mask5[5][5],Scale,Offset;void WINAPI Template(BYTE **list0,BYTE **list1,int Dx,int Dy){int i,j,g;for (i=1;i<Dy-1;i++) {for (j=1;j<Dx-1;j++) {g = (Mask[0][0]*list1[i-1][j-1]+Mask[0][1]*list1[i-1][j]+Mask[0][2]*list1[i-1][j+1]+Mask[1][0]*list1[i][j-1]+Mask[1][1]*list1[i][j] +Mask[1][2]*list1[i][j+1]+Mask[2][0]*list1[i+1][j-1]+Mask[2][1]*list1[i+1][j] +Mask[2][2]*list1[i+1][j+1])/Scale+Offset;if (g>0xff) g=0xff;else if (g<0) g=0;list0[i][j] = (BYTE) g;}}}void WINAPI TemplateB(BYTE **list0,BYTE **list1,int Dx,int Dy,int t) { // t x t 邻域处理共用程序 (t = 3 or 5)int i,j,g,m,n,*p;for (i=t/2;i<Dy-t/2;i++) {for (j=t/2;j<Dx-t/2;j++) {g=0;p=&Mask5[0][0];for (m=i-t/2;m<=i+t/2;m++) {for (n=j-t/2;n<=j+t/2;n++)g+=(*p++)*list1[m][n];}g=g/Scale+Offset;if (g>0xff) g=0xff;else if (g<0) g=0;list0[i][j] = g;}}}void WINAPI Laplacian(BYTE **list0,BYTE **list1,int Dx,int Dy)//拉普拉斯算法{Scale=1;Offset=1;Mask[0][0]=Mask[0][2]=Mask[2][0]=Mask[2][2]=-1;Mask[0][1]=Mask[2][1]=Mask[1][0]=Mask[1][2]=-1;Mask[1][1]=8;Template(list0,list1,Dx,Dy);Offset=0;}void CMyView::OnLapBorddetec(){// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT PP;BYTE **list1,**list0;ImageCopy(&m_Image1,&m_Image);list1=(BYTE **)Create2DList(&m_Image);list0=(BYTE **)Create2DList(&m_Image1);GetImageParament(&m_Image,&PP);Laplacian(list0,list1,PP.nWidth,PP.nHeight);ImageCopy(&m_Image,&m_Image1);CString str2;str2.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str2 + " - " +"laplacian变换");Invalidate();}void WINAPI LoG(BYTE **list0,BYTE **list1,int Dx,int Dy){ // 高斯型拉普拉斯算法int mask[25]={ 0, 0,-1, 0, 0,0,-1,-2,-1, 0,-1,-2,16,-2,-1,0,-1,-2,-1, 0,0, 0,-1, 0, 0};Scale=1; Offset=254;memcpy(Mask5,mask,25*sizeof(int));TemplateB(list0,list1,Dx,Dy,5);Offset=0;}void CMyView::OnLogBorddetec(){// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT PP;BYTE **list1,**list0;ImageCopy(&m_Image1,&m_Image);list1=(BYTE **)Create2DList(&m_Image);list0=(BYTE **)Create2DList(&m_Image1);GetImageParament(&m_Image,&PP);LoG(list0,list1,PP.nWidth,PP.nHeight);ImageCopy(&m_Image,&m_Image1);CString str2;str2.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str2 + " - " +"log变换");Invalidate();}int MaxMin(double *tab,int flag){double max,min;int i,p,q;max=min=tab[128];p=q=128;for (i=0;i<256;i++) {if (tab[i]>max) {max=tab[i];p=i;}if (tab[i]<min) {min=tab[i];q=i;}}if (flag==1) {for (i=0;i<256;i++)tab[i]=120*(max-tab[i])/(max-min);}else {for (i=0;i<256;i++)tab[i]=120*(tab[i]-min)/(max-min);p=q;}return(p);}void Release2DList(BYTE** list){free(list);}void SetAllPalette(CImage *pImg, RGBQUAD *ColorTab){struct IMAGEPARAMENT P;GetImageParament(pImg,&P);pImg->SetColorTable(0, P.nNumColors, ColorTab);}void SetPalette(CImage *pImg,int n,int r,int g,int b){RGBQUAD ColorTab;ColorTab.rgbBlue = b;ColorTab.rgbGreen = g;ColorTab.rgbRed = r;pImg->SetColorTable(n, 1, &ColorTab);}int WINAPI Otsu(long *pg) // 大津法取阈值{int i,j,p;double m0,m1,M0,M1,u,v,w[256];M0=M1=0;for (i=0;i<256;i++) {M0+=pg[i]; M1+=pg[i]*i;}for (j=0;j<256;j++) {m0=m1=0;for (i=0;i<=j;i++) {m0+=pg[i]; m1+=pg[i]*i;}if (m0) u=m1/m0;else u=0;if (M0-m0) v=(M1-m1)/(M0-m0);else v=0;w[j]=m0*(M0-m0)*(u-v)*(u-v);}p=MaxMin(w,1);return(p);}long pg[256];void Threshold(CImage *pImgm,double ff){struct IMAGEPARAMENT P;BYTE **list,*lpBuf;RGBQUAD ColorTab[256];int x,y,thre;//int t;//int tab[256],buf[20],bn;GetImageParament(pImgm,&P);list=(BYTE**) Create2DList(pImgm);//histog(list,pg,0,0,P.nWidth,P.nHeight);thre=Otsu(pg);for (y=0;y<P.nHeight;y++) {lpBuf=(BYTE*) pImgm->GetPixelAddress(0,y);for (x=0;x<P.nWidth;x++,lpBuf++) {if (*lpBuf>=thre) *lpBuf=1;else *lpBuf=0;}}memset(ColorTab,0,1024);SetAllPalette(pImgm,ColorTab);SetPalette(pImgm,1,255,255,255);Release2DList(list);}void CMyView::OnOtsuThreshold()//二值化响应函数{// TODO: 在此添加命令处理程序代码Threshold(&m_Image,0);CString str2;str2.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str2 + " - " +"OTSU法二值化");Invalidate();}int InImage(CImage *pImg,int x,int y){struct IMAGEPARAMENT P;GetImageParament(pImg,&P);if ((x<0)||(y<0)||(x>=P.nWidth)||(y>=P.nHeight)) return 0;else return 1;}DWORD GetPixelValue(CImage *pImg,int x,int y){struct IMAGEPARAMENT P;BYTE *lp;DWORD dd=0;GetImageParament(pImg,&P);if ((P.nBitCount<8)||(!InImage(pImg,x,y))) return 0;lp = (BYTE*) pImg->GetPixelAddress(x,y);memcpy(&dd,lp,P.nBytesPerPixel);return(dd);}void SetPixelValue(CImage *pImg,int x,int y,DWORD c){struct IMAGEPARAMENT P;BYTE *lp;GetImageParament(pImg,&P);if ((P.nBitCount<8)||(!InImage(pImg,x,y))) return;lp = (BYTE*) pImg->GetPixelAddress(x,y);memcpy(lp,&c,P.nBytesPerPixel);}void CMyView::OnCatchNumberonce()//白字法{// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P4,P5;int a[300];GetImageParament(&m_Image,&P4);int i,D,Dmin=3,T=0,T1=0,Tmin=5, Numbery=0,Numberx=0;ImageCopy(&NumberOnce,&m_Image);for (int y=P4.nHeight-5;y>=0;y--){ i=0;for (int x=0;x<P4.nWidth;x++){if (GetPixelValue(&m_Image,x,y)==1)a[i++]=x;//取该行白点存数组a}for(int j=1;j<i;j++){D=a[j]-a[j-1];if(D>=Dmin&&D<=4*Dmin) T++;if(D>4*Dmin) T=0;//判断为字符间距if(T==Tmin){T1++;while(T1==3){Numbery=y;Numberx=a[j-Tmin];//free(a);break;}}}if(Numbery!=0)break;}ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P5);for ( int y=0;y<P5.nHeight;y++){for ( int x=0;x<P5.nWidth;x++){ //if(x==Numberx||y==Numbery) SetPixelValue(&m_Image,x,y,1);//调试专用//elseif(x>0&&x<115+Numberx&&y<Numbery+5&&y>Numbery-15);else//if (GetPixelValue(&m_Image,x,y)==1)SetPixelValue(&m_Image,x,y,0);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"车牌粗定位");Invalidate();}void CMyView::OnCatchBnumber()//黑字法{// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P4,P5;int a[300];GetImageParament(&m_Image,&P4);int i,D,Dmin=3,T=0,T1=0,Tmin=7,Numbery=0,Numberx=0;ImageCopy(&NumberOnce,&m_Image);for (int y=P4.nHeight-5;y>=0;y--){ i=0;for (int x=0;x<P4.nWidth;x++){if (GetPixelValue(&m_Image,x,y)==0)a[i++]=x;//取该行黑点存数组a}for(int j=1;j<i;j++){D=a[j]-a[j-1];if(D>=Dmin&&D<=4*Dmin) T++;if(D>4*Dmin) T=0;//判断为字符间距if(T==Tmin){T1++;while(T1==3){Numbery=y;Numberx=a[j-Tmin];//free(a);break;}}}if(Numbery!=0)break;}ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P5);for ( int y=0;y<P5.nHeight;y++){for ( int x=0;x<P5.nWidth;x++){ //if(x==Numberx||y==Numbery) SetPixelValue(&m_Image,x,y,0);//调试专用// elseif(x>0&&x<115+Numberx&&y<Numbery+5&&y>Numbery-15);else//if (GetPixelValue(&m_Image,x,y)==1)SetPixelValue(&m_Image,x,y,0);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"车牌粗定位");Invalidate();}int x1,x2,y1,y2;void CMyView::OnGetCarnumber()//精定位{// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P6,P7;int T=0,k=0,tabmin=3,Tmin=2,Dimin=3,Di;int tab[800];int b[800];GetImageParament(&m_Image,&P6);ImageCopy(&NumberOnce,&m_Image);for (int i=0;i<P6.nWidth ;i++) //统计每列像素数据{tab[i]=0;for(int j=0;j<P6.nHeight ;j++){if(GetPixelValue(&m_Image,i,j)==1)//统计白点数存tab[i]tab[i]++;}}for (int i=0;i<P6.nWidth ;i++)//生成等差数列b[i]{ if(tab[i]>=tabmin) T++;if(tab[i]<tabmin) T=0;b[i]=T;}int tmax1[50];int Numberx1=0,Numberx2=0;for (int i=1;i<P6.nWidth ;i++)//求b[i]局部最大值bmax1[50]对应下标tmax1【50】{if(b[i]>=Tmin&&b[i+1]==0){tmax1[k++]=i-b[i];}}int c=0,cmin=2;for(int i=0;i<k-1;i++)//精确定位左位置Numberx1{ Di=tmax1[i+1]-tmax1[i];if(Di>=Dimin&&Di<=8*Dimin)c++;elsec=0;while(c==cmin){Numberx1=tmax1[i+1-cmin];break;}int tmax2[50];k=0;for (int i=P6.nWidth-1;i>0 ;i--)//求b[i]局部最大值bmax2[50]对应下标tmax2【50】{if(b[i-1]>=Tmin&&b[i]==0){tmax2[k++]=i;}}c=0;for(int i=0;i<k-1;i++)//精确定位右位置Numberx2{ Di=tmax2[i]-tmax2[i+1];if(Di>=Dimin&&Di<=8*Dimin)c++;elsec=0;while(c==5){Numberx2=tmax2[i+1-5];break;}}if(Numberx2-Numberx1<100)Numberx2=Numberx1+120;x1=Numberx1;x2=Numberx2;ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P7);for ( int y=0;y<P7.nHeight;y++){for ( int x=0;x<P7.nWidth;x++){ if(x>Numberx1&&x<Numberx2);//else SetPixelValue(&m_Image,x,y,0);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"车牌水平方向精定位Invalidate();}void CMyView::OnGetHcarnumber()//竖直方向定位{// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P6,P7;int T=0,tabmin=14,Tmin=3,Numbery1=0,Numbery2=0;int tab[300];GetImageParament(&m_Image,&P6);ImageCopy(&NumberOnce,&m_Image);for (int i=0;i<P6.nHeight;i++) //统计每行像素数据{tab[i]=0;for(int j=0;j<P6.nWidth ;j++){if(GetPixelValue(&m_Image,j,i)==1)//统计白点数存tab[i]tab[i]++;}}for (int i=0;i<P6.nHeight;i++){ if(tab[i]>tabmin)T++;else T=0;if(T==Tmin){Numbery1=i-Tmin;break;}}T=0;for (int i=P6.nHeight-1;i>0;i--){ if(tab[i]>tabmin)T++;else T=0;if(T==Tmin){Numbery2=i+Tmin;break;}}if(Numbery2-Numbery1<10)y1=Numbery1;y2=Numbery2;ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P7);for ( int y=0;y<P7.nHeight;y++){for ( int x=0;x<P7.nWidth;x++){ if(y>Numbery1&&y<Numbery2);//// else if((x1<=x&&x2>=x)&&(y==y1||y==y2))SetPixelValue(&m_Image,x,y,1);else SetPixelValue(&m_Image,x,y,0);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"车牌竖直方向精定位");Invalidate();}void CMyView::OnAddAll()//定位算法综合{// TODO: 在此添加命令处理程序代码CMyView::OnColorCray();CMyView::OnLapBorddetec();CMyView::OnOtsuThreshold();//二值化响应函数CMyView::OnCatchNumberonce();//白字法CMyView::OnGetCarnumber();//精定位CMyView::OnGetHcarnumber();//竖直方向定位}int N7[7];int N0=0,N1=10,N2=20,N3=30,N4=40,N5=50,N6=60;void CMyView::OnNumberCut(){// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P6,P7;int T=0,k=0,tabmin=1,Tmin=3;int tab[800];GetImageParament(&m_Image,&P6);ImageCopy(&NumberOnce,&m_Image);for (int i=0;i<P6.nWidth ;i++) //统计每列像素数据{tab[i]=0;for(int j=0;j<P6.nHeight ;j++){if(GetPixelValue(&m_Image,i,j)==1)//统计白点数存tab[i]tab[i]++;}}for (int i=0;i<P6.nWidth ;i++)//生成等差数列b[i]{ if(tab[i]>=tabmin) T++;if(tab[i]<tabmin) T=0;b[i]=T;}for (int i=1;i<P6.nWidth ;i++)//精确定位左位置N0{if(b[i]>=Tmin&&b[i+1]==0){N0=i-b[i];break;}}for (int i=N0+15;i<P6.nWidth ;i++)//精确定位左位置N1{if(b[i]>=Tmin&&b[i+1]==0){N1=i-b[i];break;}}for (int i=N1+15;i<P6.nWidth ;i++)//精确定位左位置N2{if(b[i]>=Tmin&&b[i+1]==0){N2=i-b[i];break;}}for (int i=N2+15;i<P6.nWidth ;i++)//精确定位左位置N3{if(b[i]>=Tmin&&b[i+1]==0){N3=i-b[i];break;}}{if(b[i]>=Tmin&&b[i+1]==0){N4=i-b[i];break;}}for (int i=N4+15;i<P6.nWidth ;i++)//精确定位左位置N5{if(b[i]>=Tmin&&b[i+1]==0){N5=i-b[i];break;}}for (int i=N5+15;i<P6.nWidth ;i++)//精确定位左位置N6{if(b[i]>=Tmin&&b[i+1]==0){N6=i-b[i];x2=N6+12;break;}}N7[0]=N0;N7[1]=N1;N7[2]=N2;N7[3]=N3;N7[4]=N4;N7[5]=N5;N7[6]=N6;for(int j=3;j<7;j++){if(N7[j]-N7[j-1]>15)N7[j]=N7[j-1]+15;}ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P7);for ( int y=0;y<P7.nHeight;y++){for ( int x=0;x<P7.nWidth;x++){if((y>=y1&&y<=y2)&&(x==N7[0]||x==N7[1]||x==N7[2]||x==N7[3]||x==N7[ 4]||x==N7[5]||x==N7[6]||x==N7[6]+13))SetPixelValue(&m_Image,x,y,1);if((x1<=x&&x2+1>=x)&&(y==y1||y==y2))SetPixelValue(&m_Image,x,y,1);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"字符分割");Invalidate();}double FN[4];int p,pmax;//数字相似度int p1;//汉字相似度int p2;//字母相似度double P[10]={};//数字识别器double P1[31]={};//汉字识别器double P2[24]={};//字母识别器const double JING[4]={};//部分汉字编码京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼const double JINTJ[4]={};const double HU[4]={10,13,12,1};const double YUCHQ[4]={};const double JIHB[4]={};const double YUHN[4]={};const double YUN[4]={};const double LIAO[4]={};const double HEI[4]={};const double XIANG[4]={};const double WAN[4]={};const double LUSD[4]={};const double XIN[4]={};const double SU[4]={13,9,7,9};//SU[4]={14,14,10,10}const double ZHE[4]={};const double GUIGX[4]={};const double GANGS[4]={};const double JINSHX[4]={};const double MENG[4]={};const double SHAN[4]={};const double JIJL[4]={};const double MIN[4]={};const double GUIGZH[4]={};const double YUE[4]={};const double QING[4]={};const double ZANG[4]={};const double CHUAN[4]={};const double NING[4]={};const double QIONG[4]={};const double AA[4]={7,2,13,12};//部分字母编码const double BB[4]={};const double CC[4]={16,11,10,11};const double DD[4]={12,10,15,12};const double EE[4]={18,13,11,11};const double FF[4]={18,11,9,0};const double GG[4]={};const double HH[4]={12,16,7,7};const double JJ[4]={};const double KK[4]={16,7,8,9};const double LL[4]={12,2,12,11};const double MM[4]={14,11,10,9};const double NN[4]={};const double PP[4]={};const double QQ[4]={};const double RR[4]={};const double SS[4]={};const double TT[4]={};const double UU[4]={};const double VV[4]={};const double YY[4]={};const double ZZ[4]={};const double LI[4]={12,11,10,12};//0~9编码const double YI[4]={6,2,6,2};const double ER[4]={11,17,12,10};const double SA[4]={8,17,7,11};const double SI[4]={4,15,17,19};const double WU[4]={9,14,15,14};const double LU[4]={9,9,10,11};const double QI[4]={5,14,4,5};const double BA[4]={14,14,14,14};const double JU[4]={17,13,9,10};int N;void CMyView::OnHanziStudy()//汉字识别共用{struct IMAGEPARAMENT P7;GetImageParament(&m_Image,&P7);//ImageCopy(&NumberOnce,&m_Image);for ( int y=0;y<P7.nHeight;y++){for ( int x=0;x<P7.nWidth;x++){if((y>=y1&&y<=y2)&&(x==N7[0]||x==N7[1]||x==N7[2]||x==N7[3]||x==N7[ 4]||x==N7[5]||x==N7[6]||x==N7[6]+13))SetPixelValue(&m_Image,x,y,0);if((x1<=x&&x2+1>=x)&&(y==y1||y==y2))SetPixelValue(&m_Image,x,y,0);}}//ImageCopy(&m_Image,&NumberOnce);int i=0,k;//int su[4];//double p=0;CClientDC dc(this);HBRUSH hBrush;HPEN hPen;hPen=(HPEN) GetStockObject(WHITE_PEN); hBrush=(HBRUSH) GetStockObject(WHITE_BRUSH);dc.SelectObject(hPen);dc.SelectObject(hBrush);dc.SetTextColor(RGB(0,0,0));CString str;for(int x=N+1;x<=N+6;x++)for (int y=y1+1;y<=y1+6;y++){k=GetPixelValue(&m_Image,x,y);FN[i]=FN[i]+k;}i++;for(int x=N+7;x<=N+12;x++)for (int y=y1+1;y<=y1+6;y++){k=GetPixelValue(&m_Image,x,y);FN[i]=FN[i]+k;}i++;for(int x=N+1;x<=N+6;x++)for (int y=y1+7;y<=y1+12;y++){k=GetPixelValue(&m_Image,x,y);FN[i]=FN[i]+k;}i++;for(int x=N+7;x<=N+12;x++)for (int y=y1+7;y<=y1+12;y++){k=GetPixelValue(&m_Image,x,y);FN[i]=FN[i]+k;}for(i=0;i<4;i++){str.Format ("%g",FN[i]);dc.TextOut (30*i+15,50,str,2);//FN[i]=0;}for(i=0;i<4;i++){if(FN[i]<=JING[i]) P1[0]=P1[0]+(FN[i]+1)/(JING[i]+1);else P1[0]=P1[0]+(JING[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=JINTJ[i]) P1[1]=P1[1]+(FN[i]+1)/(JINTJ[i]+1);else P1[1]=P1[1]+(JINTJ[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=HU[i]) P1[2]=P1[2]+(FN[i]+1)/(HU[i]+1);else P1[2]=P1[2]+(HU[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=YUCHQ[i]) P1[3]=P1[3]+(FN[i]+1)/(YUCHQ[i]+1);else P1[3]=P1[3]+(YUCHQ[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=JIHB[i]) P1[4]=P1[4]+(FN[i]+1)/(JIHB[i]+1);else P1[4]=P1[4]+(JIHB[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=YUHN[i]) P1[5]=P1[5]+(FN[i]+1)/(YUHN[i]+1);else P1[5]=P1[5]+(YUHN[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=YUN[i]) P1[6]=P1[6]+(FN[i]+1)/(YUN[i]+1);else P1[6]=P1[6]+(YUN[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=LIAO[i]) P1[7]=P1[7]+(FN[i]+1)/(LIAO[i]+1);else P1[7]=P1[7]+(LIAO[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=HEI[i]) P1[8]=P1[8]+(FN[i]+1)/(HEI[i]+1);else P1[8]=P1[8]+(HEI[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=XIANG[i]) P1[9]=P1[9]+(FN[i]+1)/(XIANG[i]+1);else P1[9]=P1[9]+(XIANG[i]+1)/(FN[i]+1);。
车牌地区识别
![车牌地区识别](https://img.taocdn.com/s3/m/d48fcf24bed5b9f3f90f1cbc.png)
5.方茴说:“那时候我们不说爱,爱是多么遥远、多么沉重的字眼啊。
我们只说喜欢,就算喜欢也是偷偷摸摸的。
”6.方茴说:“我觉得之所以说相见不如怀念,是因为相见只能让人在现实面前无奈地哀悼伤痛,而怀念却可以把已经注定的谎言变成童话。
”7.在村头有一截巨大的雷击木,直径十几米,此时主干上唯一的柳条已经在朝霞中掩去了莹光,变得普普通通了。
8.这些孩子都很活泼与好动,即便吃饭时也都不太老实,不少人抱着陶碗从自家出来,凑到了一起。
9.石村周围草木丰茂,猛兽众多,可守着大山,村人的食物相对来说却算不上丰盛,只是一些粗麦饼、野果以及孩子们碗中少量的肉食。
北京市(京)京A、京C、京E、京F、北京市(城区),京G 北京市(远郊区),京B 出租车,京O警察天津市(津)津A、津B、津C、天津市,津E 出租车上海市(沪)沪A、沪B、沪D 上海市区,沪C 远郊区重庆市(渝)渝A 重庆市区(江南),渝B 重庆市区(江北),渝C 永川区,渝F 万州区,渝G 涪陵区,渝H 黔江区河北省(冀)冀A 石家庄,冀B 唐山,冀C 秦皇岛,冀D 邯郸,冀E 邢台,冀F 保定,冀G 张家口,冀H 承德,冀J 沧州,冀R 廊坊,冀T 衡水河南省(豫)豫A 郑州,豫B 开封,豫C 洛阳,豫D 平顶山,豫E 安阳,豫F 鹤壁,豫G 新乡,豫H 焦作,豫J 濮阳,豫K 许昌,豫L 漯河,豫M 三门峡,豫N 商丘,豫P 周口,豫Q 驻马店,豫R 南阳,豫S 信阳,豫U 济源云南省(云)5.方茴说:“那时候我们不说爱,爱是多么遥远、多么沉重的字眼啊。
我们只说喜欢,就算喜欢也是偷偷摸摸的。
”6.方茴说:“我觉得之所以说相见不如怀念,是因为相见只能让人在现实面前无奈地哀悼伤痛,而怀念却可以把已经注定的谎言变成童话。
”7.在村头有一截巨大的雷击木,直径十几米,此时主干上唯一的柳条已经在朝霞中掩去了莹光,变得普普通通了。
8.这些孩子都很活泼与好动,即便吃饭时也都不太老实,不少人抱着陶碗从自家出来,凑到了一起。
车牌识别matlab代码
![车牌识别matlab代码](https://img.taocdn.com/s3/m/0410f5e7e009581b6bd9eb60.png)
close allclc[fn,pn,fi]=uigetfile('ChePaiKu\*.jpg','选择图片');YuanShi=imread([pn fn]);%输入原始图像figure(1);subplot(3,2,1),imshow(YuanShi),title('原始图像');%%%%%%%%%%1、图像预处理%%%%%%%%%%%YuanShiHuiDu=rgb2gray(YuanShi);%转化为灰度图像subplot(3,2,2),imshow(YuanShiHuiDu),title('灰度图像');BianYuan=edge(YuanShiHuiDu,'robert',0.09,'both');%Robert算子边缘检测subplot(3,2,3),imshow(BianYuan),title('Robert算子边缘检测后图像');se1=[1;1;1]; %线型结构元素FuShi=imerode(BianYuan,se1); %腐蚀图像subplot(3,2,4),imshow(FuShi),title('腐蚀后边缘图像');se2=strel('rectangle',[30,30]); %矩形结构元素TianChong=imclose(FuShi,se2);%图像聚类、填充图像subplot(3,2,5),imshow(TianChong),title('填充后图像');YuanShiLvBo=bwareaopen(TianChong,2000);%从对象中移除面积小于2000的小对象figure(2);subplot(2,2,1),imshow(YuanShiLvBo),title('形态滤波后图像');%%%%%%%%%%2、车牌定位%%%%%%%%%%%[y,x]=size(YuanShiLvBo);%size函数将数组的行数返回到第一个输出变量,将数组的列数返回到第二个输出变量YuCuDingWei=double(YuanShiLvBo);%%%%%%%%%%2.1、车牌粗定位之一确定行的起始位置和终止位置%%%%%%%%%%%Y1=zeros(y,1);%产生y行1列全零数组for i=1:yfor j=1:xif(YuCuDingWei(i,j)==1)Y1(i,1)= Y1(i,1)+1;%白色像素点统计endendend[temp,MaxY]=max(Y1);%Y方向车牌区域确定。
基于opencv的车牌识别的代码
![基于opencv的车牌识别的代码](https://img.taocdn.com/s3/m/3a21a44da517866fb84ae45c3b3567ec102ddc14.png)
基于opencv的车牌识别的代码车牌识别是计算机视觉领域的一个重要应用,它可以通过图像处理和模式识别技术,自动识别出车辆的车牌号码。
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和机器学习算法,非常适合用于车牌识别的开发。
下面是一个基于OpenCV的车牌识别的代码示例:```pythonimport cv2import numpy as np# 加载车牌识别模型plate_cascade =cv2.CascadeClassifier('haarcascade_russian_plate_number.xml') # 加载车牌字符识别模型char_cascade =cv2.CascadeClassifier('haarcascade_russian_plate_number_char.xml') # 读取图像img = cv2.imread('car.jpg')# 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测车牌plates = plate_cascade.detectMultiScale(gray, 1.1, 4)# 遍历每个车牌for (x, y, w, h) in plates:# 绘制车牌区域cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)# 提取车牌区域plate = gray[y:y+h, x:x+w]# 检测车牌字符chars = char_cascade.detectMultiScale(plate, 1.1, 4)# 遍历每个字符for (cx, cy, cw, ch) in chars:# 绘制字符区域cv2.rectangle(img, (x+cx, y+cy), (x+cx+cw, y+cy+ch), (0, 255, 0), 2)# 提取字符区域char = plate[cy:cy+ch, cx:cx+cw]# 进行字符识别# ...# 在这里可以使用机器学习或深度学习算法对字符进行识别# 显示结果图像cv2.imshow('License Plate Recognition', img)cv2.waitKey(0)cv2.destroyAllWindows()```在这个代码示例中,首先我们加载了车牌识别模型和车牌字符识别模型。
(完整word版)基于Matlab的车牌识别实现源码
![(完整word版)基于Matlab的车牌识别实现源码](https://img.taocdn.com/s3/m/5c9069342cc58bd63086bdee.png)
function[]=main(jpg)close allclctic %测定算法执行的时间[fn,pn]=uigetfile('timg1,jpg','选择图片') %读入图片I=imread([pn,fn]);figure,imshow(I);title('原始图像'); %显示原始图像Im1=rgb2gray(I);figure(2),subplot(1,2,1),imshow(Im1);title('灰度图');figure(2),subplot(1,2,2),imhist(Im1);title('灰度图的直方图'); %显示图像的直方图Tiao=imadjust(Im1,[0.19,0.78],[0,1]); %调整图片figure(3),subplot(1,2,1),imshow(Tiao);title('增强灰度图');figure(3),subplot(1,2,2),imhist(Tiao);title('增强灰度图的直方图');Im2=edge(Tiao,'Roberts','both'); %使用sobel算子进行边缘检测figure(4),imshow(Im2);title('sobel算子实现边缘检测')se=[1;1;1];Im3=imerode(Im2,se);figure(5),imshow(Im3);title('腐蚀效果图');se=strel('square',40);%'rectangle',[25,25]/'diamond',25/Im4=imclose(Im3,se);figure(6),imshow(Im4);title('平滑图像的轮廓');Im5=bwareaopen(Im4,1500);figure(7),imshow(Im5);title('移除小对象');[y,x,z]=size(Im5); %返回Im5各维的尺寸,并存储在变量y、x、z中Im6=double(Im5); %将Im5换成双精度数值%开始横向扫描tic %tic计时开始,toc结束,计算tic与toc之间程序的运行时间Blue_y=zeros(y,1); %产生y*1的全0矩阵for i=1:y %逐行扫描for j=1:xif(Im6(i,j,1)==1)%如果Im6图像中坐标为(i,j)的点值为1,即为移除小对象的白色区域,Blue_y(i,1)= Blue_y(i,1)+1;%则y*1列矩阵的相应像素点的元素值加1,endendend[temp MaxY]=max(Blue_y);%temp为向量Blue_y的矩阵中的最大值,MaxY为该值的索引(最大值在向量中的位置)%返回包含最大元素的列,即白色区域最宽的列%Y方向车牌区域确定figure(8),subplot(1,2,1),plot(0:y-1,Blue_y),title('行方向白色像素点累计'),xlabel('行数'),ylabel('个数');PY1=MaxY;while ((Blue_y(PY1,1)>=120)&&(PY1>1))PY1=PY1-1;endPY2=MaxY;while ((Blue_y(PY2,1)>=40)&&(PY2<y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);%IY为原始图像I中截取的纵坐标在PY1:PY2之间的部分%横向扫描完成,开始纵向扫描Blue_x=zeros(1,x);%进一步确定x方向的车牌区域for j=1:x %逐列扫描for i=PY1:PY2if(Im6(i,j,1)==1)Blue_x(1,j)= Blue_x(1,j)+1; %根据Im5的x值确定endendendfigure(8),subplot(1,2,2),plot(0:x-1,Blue_x),title('列方向白色像素点累计'),xlabel('列数'),ylabel('个数'); PX1=1;while ((Blue_x(1,PX1)<3)&&(PX1<x))PX1=PX1+1;endPX2=x;while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;end%end纵向扫描PX1=PX1-2;%对车牌区域的校正PX2=PX2+2;dw=I(PY1:PY2,PX1:PX2,:);t=toc;figure(9),subplot(1,2,1),imshow(IY),title('垂直方向合理区域');figure(9),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')imwrite(dw,'dw.jpg'); %将图像写入图形文件中a=imread('dw.jpg');b=rgb2gray(a);imwrite(b,'车牌灰度图像.jpg');figure(10);subplot(3,2,1),imshow(b),title('1.车牌灰度图像')g_max=double(max(max(b)));g_min=double(min(min(b)));T=round(g_max-(g_max-g_min)/3); %T为设定的二值化的阈值,返回一个四舍五入的整数值[m,n]=size(b);d=(double(b)>=T); %d为二值图像imwrite(d,'车牌二值图像.jpg');figure(10);subplot(3,2,2),imshow(d),title('2.车牌二值图像')figure(10),subplot(3,2,3),imshow(d),title('3.均值滤波前')h=fspecial('average',3);%建立预定义的滤波算子,average为均值滤波,模板尺寸为3*3 d=imbinarize(round(filter2(h,d))); %im2bw,使用指定的滤波器h对h进行d即均值滤波imwrite(d,'均值滤波后.jpg');figure(10),subplot(3,2,4),imshow(d),title('4.均值滤波后')se=eye(2);%单位矩阵[m,n]=size(d); %d为二值图像,返回信息矩阵if bwarea(d)/m/n>=0.365%二值图像中对象的总面积与整个面积的比大于0.365d=imerode(d,se);%进行腐蚀elseif bwarea(d)/m/n<=0.235%二值图像中对象的总面积与整个面积的比值小于0.235 d=imdilate(d,se);%进行膨胀endimwrite(d,'膨胀或腐蚀处理后.jpg');figure(10),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后.jpg')d=qiege(d); %切割,寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割[m,n]=size(d);k1=1;k2=1;s=sum(d);j=1;while j~=nwhile s(j)==0j=j+1;endk1=j;while s(j)~=0 && j<=n-1j=j+1;endk2=j-1;if k2-k1>=round(n/6.5)[val,num]=min(sum(d(:,[k1+5:k2-5])));d(:,k1+num+5)=0;endendd=qiege(d);y1=10;y2=0.25;flag=0;word1=[];while flag==0[m,n]=size(d);wide=0;while sum(d(:,wide+1))~=0 %扫过的地方不全为黑色,向右移动,直到不是停止wide=wide+1;endif wide<y1 %如果wide小于y1时,从数值判断没有切好,认为是左干扰d(:,[1:wide])=0;%将此片区域全部转化为黑色,d=qiege(d);%重新切割elsetemp=qiege(imcrop(d,[1 1 wide m]));%返回已经切割好的区域[m,n]=size(temp);all=sum(sum(temp));%统计切割区域所有元素two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));%统计切割区域1/3至2/3行所有元素if two_thirds/all>y2flag=1;word1=temp;endd(:,[1:wide])=0;d=qiege(d);endend[word2,d]=getword(d); %分割出第二个字符[word3,d]=getword(d); %分割出第三个字符[word4,d]=getword(d); %分割出第四个字符[word5,d]=getword(d); %分割出第五个字符[word6,d]=getword(d); %分割出第六个字符[word7,d]=getword(d); %分割出第七个字符word1=imresize(word1,[40 20]);%模板字符大小统一为40*20,为字符辨认做准备word2=imresize(word2,[40 20]);word3=imresize(word3,[40 20]);word4=imresize(word4,[40 20]);word5=imresize(word5,[40 20]);word6=imresize(word6,[40 20]);word7=imresize(word7,[40 20]);figure(11);subplot(2,7,1),imshow(word1),title('1');subplot(2,7,2),imshow(word2),title('2');subplot(2,7,3),imshow(word3),title('3');subplot(2,7,4),imshow(word4),title('4');subplot(2,7,5),imshow(word5),title('5');subplot(2,7,6),imshow(word6),title('6');subplot(2,7,7),imshow(word7),title('7');imwrite(word1,'1.jpg');imwrite(word2,'2.jpg');imwrite(word3,'3.jpg');imwrite(word4,'4.jpg');imwrite(word5,'5.jpg');imwrite(word6,'6.jpg');imwrite(word7,'7.jpg');liccode=char(['0':'9' 'A':'Z' '辽粤豫鄂鲁陕京津苏浙']);%建立自动识别字符代码表,将t'0':'9' 'A':'Z' '鲁陕苏豫'多个字符串组成一个字符数组,每行对应一个字符串,字符数不足的自动补空格SubBw2=zeros(40,20);%40*20的零矩阵l=1;for I=1:7ii=int2str(I);%整型转换字符串t=imread([ii,'.jpg']);SegBw2=imresize(t,[40 20],'nearest');%改变图片的大小SegBw2=double(SegBw2)>50;%将灰度图转化为二值图像,double产生0-255的灰度值if l==1 %第一位汉字识别kmin=37;kmax=46;%模板中汉字所在的位置elseif l==2 %第二位字母识别kmin=11;kmax=36;%A-Z字母位置elsel>=3 %第三位后字母或数字识别kmin=1;kmax=36;endfor k2=kmin:kmaxfname=strcat('字符模板\',liccode(k2),'.jpg');SamBw2=imread(fname);SamBw2=double(SamBw2)>50;%将模板转换为二值图,double产生0-255的灰度值for i=1:40for j=1:20SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);endend%相当于两幅图相减得第三幅图Dmax=0;for k1=1:40for l1=1:20if abs(SubBw2(k1,l1))>0Dmax=Dmax+1;endendendError(k2)=Dmax;endError1=Error(kmin:kmax);%模板对应的字符模板进行匹配选择MinError=min(Error1);findc=find(Error1==MinError);Code(l*2-1)=liccode(findc(1)+kmin-1);Code(l*2)=' ';l=l+1;endmsgbox(Code,'识别结果')function [word,result]=getword(d) %定义分割字符用函数(1)word=[];flag=0;y1=8;y2=0.5;while flag==0[m,n]=size(d);wide=0;while sum(d(:,wide+1))~=0 && wide<=n-2wide=wide+1;endtemp=imcrop(d,[1 1 wide m]);%用于返回图像的一个裁剪区域[m1,n1]=size(temp);z=sum(temp,2);count=0;for i=1:m1if z(i)~=0count=count+1;endendif count<m/3d(:,[1,wide])=0;d=qiege(d);elsetemp=qiege(imcrop(d,[1 1 wide m]));%用于返回图像的一个裁剪区域[m1,n1]=size(temp);if wide<y1 && n1/m1>y2 %宽度过小,或长大于宽的两倍d(:,[1,wide])=0;if sum(sum(d))~=0 %d中所有元素之和d=qiege(d);%切割出最小范围elseword=[];flag=1;endelseword=qiege(imcrop(d,[1 1 wide m]));%划分出的temp进行切割d(:,[1:wide])=0;%切割完后该区域变为黑色if sum(sum(d))~=0d=qiege(d);flag=1;elsed=[];endendendendresult=d;function e=qiege(d) %定义分割字符用函数(2)[m,n]=size(d);top=1;bottom=m;left=1;right=n; %intewhile sum(d(top,:))==0 && top<=mtop=top+1;endwhile sum(d(bottom,:))==0 && bottom>=1 bottom=bottom-1;endwhile sum(d(:,left))==0 && left<=nleft=left+1;endwhile sum(d(:,right))==0 && right>=1right=right-1;enddd=right-left;hh=bottom-top;e=imcrop(d,[left top dd hh]);//字符实别需要字符图库,没有对照图库是识别不了的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
车牌识别电子1301 洪江 13一、目的与要求车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。
通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力二、设计原理:牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照、牌照颜色自动识别的模式识别技术。
其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。
某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。
一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。
当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。
牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照输出。
三、详细设计步骤:为了进行牌照识别,需要以下几个基本的步骤:a.牌照定位,定位图片中的牌照位置;b.牌照字符分割,把牌照中的字符分割出来;c.牌照字符识别,把分割好的字符进行识别,最终组成牌照。
牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。
(1)牌照定位:自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。
首先对采集到的视频图像进行大围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。
(2)牌照字符分割 :完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。
字符分割一般采用垂直投影法。
由于字符在垂直方向上的投影必然在字符间或字符的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。
利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。
(3)牌照字符识别 :字符识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。
基于模板匹配算法首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。
基于人工神经元网络的算法有两种:一种是先对待识别字符进行特征提取,然后用所获得特征来训练神经网络分配器;另一种方法是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。
实际应用中,牌照识别系统的识别率与牌照质量和拍摄质量密切相关。
牌照质量会受到各种因素的影响,如生锈、污损、油漆剥落、字体褪色、牌照被遮挡、牌照倾斜、高亮反光、多牌照、假牌照等等;实际拍摄过程也会受到环境亮度、拍摄亮度、车辆速度等等因素的影响。
这些影响因素不同程度上降低了牌照识别的识别率,也正是牌照识别系统的困难和挑战所在。
为了提高识别率,除了不断的完善识别算法,还应该想办法克服各种光照条件,使采集到的图像最利于识别。
四、各个功能模块的主要实现程序1.载入车牌图像:I=imread('car1.jpg');figure(1),imshow(I);title('original image');%将车牌的原图显示出来,结果如下:2.将彩图转换为灰度图并绘制直方图:I1=rgb2gray(I);%将彩图转换为灰度图figure(2),subplot(1,2,1),imshow(I1);title('gray image');figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%绘制灰度图的直方图结果如下所示:3. 用roberts算子进行边缘检测:I2=edge(I1,'roberts',0.18,'both');%选择阈值0.18,用roberts算子进行边缘检测figure(3),imshow(I2);title('roberts operator edge detection image');结果如下:4.图像实施腐蚀操作:se=[1;1;1];I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作figure(4),imshow(I3);title('corrosion image');5.平滑图像se=strel('rectangle',[25,25]);%构造结构元素以正方形构造一个seI4=imclose(I3,se);figure(5),imshow(I4);title('smothing image');结果如下所示:6. 删除二值图像的小对象I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分figure(6),imshow(I5);title('remove the small objects'); %用imshow函数显示滤波后图像结果如下所示:7.车牌定位[y,x,z]=size(I5);%返回I5各维的尺寸,存储在x,y,z中myI=double(I5);%将I5转换成双精度tic %tic表示计时的开始,toc表示计时的结束Blue_y=zeros(y,1);%产生一个y*1的零阵for i=1:yfor j=1:xif(myI(i,j,1)==1)Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计 endendend[temp MaxY]=max(Blue_y);%Y方向车牌区域确定PY1=MaxY;while ((Blue_y(PY1,1)>=5)&&(PY1>1))PY1=PY1-1;endPY2=MaxY;while ((Blue_y(PY2,1)>=5)&&(PY2<y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);Blue_x=zeros(1,x);%进一步确定x方向的车牌区域for j=1:xfor i=PY1:PY2if(myI(i,j,1)==1)Blue_x(1,j)= Blue_x(1,j)+1;endendendPX1=1;while ((Blue_x(1,PX1)<3)&&(PX1<x))PX1=PX1+1;endPX2=x;while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;endPX1=PX1-1;%对车牌区域的校正PX2=PX2+1;dw=I(PY1:PY2-8,PX1:PX2,:);t=toc;figure(7),subplot(1,2,1),imshow(IY),title('Line direction areas'); figure(7),subplot(1,2,2),imshow(dw),title('positioning color images');8.字符分割与识别对分割出的彩色车牌图像进行灰度转换、二值化、均值滤波、腐蚀膨胀以及字符分割以从车牌图像中分离出组成车牌的单个字符图像,对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌。
代码如下:imwrite(dw,'dw.jpg');%将彩色车牌写入dw文件中a=imread('dw.jpg');%读取车牌文件中的数据b=rgb2gray(a);%将车牌图像转换为灰度图imwrite(b,'gray licence plate.jpg');%将灰度图像写入文件中figure(8);subplot(3,2,1),imshow(b),title('车牌灰度图像')g_max=double(max(max(b)));g_min=double(min(min(b)));T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值[m,n]=size(b);d=(double(b)>=T); % d:二值图像imwrite(d,'binary licence plate.jpg');subplot(3,2,2),imshow(d),title('before filtering binary licence plate')h=fspecial('average',3);d=im2bw(round(filter2(h,d)));%使用指定的滤波器h对h进行d即均值滤波imwrite(d,'after average licence plate.jpg');subplot(3,2,3),imshow(d),title('after average licence plate')se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵[m,n]=size(d);%返回矩阵b的尺寸信息,并存储在m,n中if bwarea(d)/m/n>=0.365 %计算二值图像中对象的总面积与整个面积的比是否大于0.365 d=imerode(d,se);%如果大于0.365则图像进行腐蚀elseif bwarea(d)/m/n<=0.235 %计算二值图像中对象的总面积与整个面积的比是否小于0.235d=imdilate(d,se);%如果小于则实现膨胀操作endimwrite(d,'expansion or corrosion the licence plate.jpg');subplot(3,2,4),imshow(d),title('expansion or corrosion the licence plate');运行结果如下所示:9.字符分割在汽车牌照自动识别过程中,字符分割有承前启后的作用。
它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。
字符识别的算法很多,因为车牌字符间间隔较大,不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。
一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。
但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。