超难问题!!!!  求 车牌 识别 程序!!!!
就是将  图片 中 的 汽车 车牌 号识别出来例如 图片那部汽车的 车牌是 "粤 B.0034" ,  现在要将 车牌 号识别出来, 转成字符串 "B.0034"  ,如果能识别出中文就更好了  !!图片都是 正面 拍照的, 图片格式是 bmp 或 jpg

解决方案 »

  1.   

    我想起当初专业实习时做的皮革切割项目呢。先是在皮革上画出轮廓,用DC照下图片,分析,驱动切割机然后按照轮廓切割皮革。图片分析部分是VC做的(不是俺做的)。帮不上忙了,哈哈!等着高手解答吧。^_^
      

  2.   

    记得好像市面上有一本delphi多媒体编程的书,好像是清华的,里面就有车牌识别的相关介绍
      

  3.   

    用OCR SDK文字识别开发包
    下载地址:http://www.tomore.com/dispdocnew.php?id=16943
      

  4.   

    chenylin(陈SIR)  你的 开发包 运行不了
      

  5.   

    我们做过银行票据的OCR识别可以的,不过识别汉字识别率比较底,如果是手写就更底了,用的是汉王识别引擎。
      

  6.   

    嗯,应该属于人工智能的知识。大概浏览过,好像就是将图片处理后,突出重点,然后比对识别。有点像photoshop的单色,柔话这样的处理
      

  7.   

    我沒寫過, 但是知道實現方法:
    1. RGB 轉為 黑白 並 調整 , 可以濾除背景, 使得字體顯示出來
    2. 通過一些算法可以得到字體的輪廓, 比對字庫,得出結果.真正做出來, 我想還是需要下很大工夫的.
    希望能給樓主些幫助.
       
      

  8.   

    谁有资料也给我一份:[email protected]
      

  9.   

    高斯—拉普拉斯(LOG)边缘检测及其应用
    本文介绍了边缘检测的原理和方法,将几种常见的边缘检测方法进行比较,选出最优算子高斯-拉普拉斯(LOG)算子。基于Visual C++ 实现了一个简单的边缘检测处理软件。本软件主要是提供给用户对图像进行平滑、锐化、边缘检测、加随机噪声、保边去噪处理等功能。在实际应用中,对三维地震数据进行LOG边缘检测,并根据检测结果进行分析。
    【关键词】 边缘检测、高斯-拉普拉斯或LOG、三维地震数据
    1.前言
    数字图像处理技术起源于20世纪20年代,经过半个多世纪的发展,目前已经广泛地用于工业、医疗保健、航空航天、军事、地理等各个领域,在国民经济中发挥着越来越重要的作用。目前,随着信息技术的发展、数字化地球概念的提出以及因特网的飞速发展,数字图像处理越来越受到人们的重视。数字图像处理科学与技术逐步向其他学科领域渗透,并为其他学科所利用是科学发展的必然。所谓数字图像处理就是利用数字计算机或者其他数字硬件,对从图像信息转换而得的电信号进行某些数学运算,以提高图像的实用性。
    2.边缘检测方法及其预处理
    数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,图像理解和分析的第一步往往就是边缘检测,目前它已成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。
    2.1 预处理
    ●保边去噪
    保边和去噪是一对矛盾的概念,不可能同时做到既保持边缘特性又去除噪声,而保边去噪却打破常规,它在保持边界的情况下将噪声滤掉,是一种新型的去噪方法。
    2.2 边缘检测方法
    ⑴高斯算子
    高斯算子是一个平滑模板,平滑模板的思想是通过将一点和周围8个点作平均,从而去除突然变化的点,滤掉噪声,其代价是图象有一定程度的模糊。而减少图像模糊代价是图像平滑研究的主要问题之一。常见的高斯模板为:
    ⑵拉普拉斯算子
    拉普拉斯算子是一个锐化模板,锐化和平滑恰恰相反,它是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波。锐化处理在增强图象边缘的同时增强了图像的噪声。常见的拉普拉斯锐化模板为: 
    ⑶高斯-拉普拉斯(LOG)算子
    高斯-拉普拉斯算子把高斯平滑滤波器和拉普拉斯锐化滤波器结合起来,先
    平滑掉噪声,再进行边沿检测。常见的高斯-拉普拉斯算子如下: 
    ⑷方法选择
    Canny最佳边缘检测原理是:
    ①只要是边缘就检测出来(不漏检)。
    ②只要不是边缘就不检测出来(不错检)。
    ③边缘检测前后位置一致。
    高斯-拉普拉斯(LOG)算子符合Canny最佳边远检测原理,是最佳的边缘检测算法。且LOG是两种算子的结合,即具备高斯算子的优点又具备拉普拉斯算子的优点,它抑制了噪声,检测到了真正的边缘。平滑和锐化,积分和微分是一对矛盾的两个侧面,统一在一起后就变成了最佳因子,为什么呢?因为图像数据中包含的随机噪音太多,平滑和积分可以滤掉这些噪音,消除噪音后再进行边缘检测(锐化和微分)就更可靠。所以,我选择高斯-拉普拉斯算子对图像进行边缘检测。
    3.软件实现
    3.1 软件界面展示
    图3.1 图3.2
    图3.1为软件的主界面,当选择打开图像文件并选定要进行处理的图像时,出现界面图3.2,根据此界面中的菜单选项,可对选定的图像进行不同的处理操作。
    3.2 软件功能介绍
    ⑴去噪处理,其中方法有高斯平滑、保边去噪。
    ⑵锐化处理,其中方法有拉普拉斯锐化,还可设置自己所需的锐化模板。
    ⑶高斯-拉普拉斯边缘检测。 
    ⑷对话框操作,实现了友好的人机对话界面。
    ⑸在实际应用中,可对三维地震数据文件进行上述操作,完成提取、识别边缘以判断其地震特征等功能。
    4.高斯-拉普拉斯边缘检测的实际应用
    4.1 泥岩裂缝检测方法研究
    ⑴泥岩裂缝性油气藏是一种特殊的隐蔽油气藏,其裂缝是油气运移和储集的主要空间,相对砂岩油气藏,可以说,没有裂缝就没有泥岩油气藏,裂缝是泥岩油气藏赖以存在的先决条件。然而,由于裂缝发育的密度相对小,宏观规模也小,因而,其地震波场特征的差异也小,所以,实际识别检测相当困难。
    ⑵振幅和速度的异常是裂缝特征的标志参数。因此,提取和识别振幅和速度的异常则是裂缝检测的关键。振幅异常的大小,既是裂隙或裂隙流体发育程度的大小标志。
    ⑶我们将应用高斯-拉普拉斯边缘检测的方法,从微观上对上面提取的目的层进行层切片检测,揭示该区泥岩裂缝发育和分布的时空规律。
    4.2 泥岩裂缝的高斯-拉普拉斯边缘检测
    图4.1为沙三段裂缝发育平面图。图的右侧为色标。从图中我们可以看到两个大的裂缝,一个是近乎东西走向的裂缝,另一个是东北走向的裂缝。由于噪音的影响图中本应有的某些裂缝无法显示出来,所以我们要对其进行边缘检测以便找出其它裂缝发育带。 
    图4.2为高斯-拉普拉斯边缘检测后的图像, 图4.3为高斯-拉普拉斯边缘检测结合滤噪预处理后的图像。
    图4.2 图4.3
    从图4.2可以看出LOG将所有的边界都检测出来,确实符合Canny最佳边缘检测原理,但是由于细节边缘全部得以体现,不利于我们寻找大的裂缝带,所以我们将其结合高斯滤波预处理得到图4.3,从这张图我们可以看出几条大的裂缝发育带,利于我们今后的分析和开发。
      

  10.   

    这是我以前写的边缘检测的例子,效果还可以,不知道满意否?
    procedure TMainForm.gausslaplaceClick(Sender: TObject);  //¸高斯-拉普拉斯算子
    var
     bmp1,bmp2:Tbitmap;
     p,a1,a2,a3,a4,a5:pbytearray;
     i,j: integer;
     begin
     //  self.DoubleBuffered:=true;   
       bmp1:=Tbitmap.Create;
       bmp2:=Tbitmap.Create;
       bmp1.Assign(backbmp);
       bmp1.PixelFormat:=pf24bit;
       bmp1.Width:=ChildForm.image1.Picture.Graphic.Width;
       bmp1.Height:=ChildForm.image1.Picture.Graphic.Height;
       bmp2.Assign(backbmp);
       bmp2.PixelFormat:=pf24bit;
        for j:=2 to bmp1.Height-3 do
           begin
                p:=bmp1.ScanLine[j];
                a1:=bmp2.ScanLine[j-2];
                a2:=bmp2.ScanLine[j-1];
                a3:=bmp2.ScanLine[j];
                a4:=bmp2.ScanLine[j+1];
                a5:=bmp2.ScanLine[j+2];
                for i:=2 to bmp1.Width-3  do
                   begin
                   p[3*i+2]:=min(255,max(0,(-(2*a1[3*(i-2)+2]+4*a1[3*(i-1)+2]+4*a1[3*i+2]+4*a1[3*(i+1)+2]+2*a1[3*(i+2)+2])
                     -4*a2[3*(i-2)+2]+8*a2[3*i+2]-4*a2[3*(i+2)+2]
                     -4*a3[3*(i-2)+2]+8*a3[3*(i-1)+2]+24*a3[3*i+2]+8*a3[3*(i+1)+2]-4*a3[3*(i+2)+2]
                      -4*a4[3*(i-2)+2]+8*a4[3*i+2]-4*a4[3*(i+2)+2]
                     -(2*a5[3*(i-2)+2]+4*a5[3*(i-1)+2]+4*a5[3*i+2]+4*a5[3*(i+1)+2]+2*a5[3*(i+2)+2]))));
                    p[3*i+1]:=min(255,max(0,(-(2*a1[3*(i-2)+1]+4*a1[3*(i-1)+1]+4*a1[3*i+1]+4*a1[3*(i+1)+1]+2*a1[3*(i+2)+1])
                     -4*a2[3*(i-2)+1]+8*a2[3*i+1]-4*a2[3*(i+2)+1]
                     -4*a3[3*(i-2)+1]+8*a3[3*(i-1)+1]+24*a3[3*i+1]+8*a3[3*(i+1)+1]-4*a3[3*(i+2)+1]
                      -4*a4[3*(i-2)+1]+8*a4[3*i+1]-4*a4[3*(i+2)+1]
                     -(2*a5[3*(i-2)+1]+4*a5[3*(i-1)+1]+4*a5[3*i+1]+4*a5[3*(i+1)+1]+2*a5[3*(i+2)+1]))));
                    p[3*i]:=min(255,max(0,(-(2*a1[3*(i-2)]+4*a1[3*(i-1)]+4*a1[3*i]+4*a1[3*(i+1)]+2*a1[3*(i+2)])
                     -4*a2[3*(i-2)]+8*a2[3*i]-4*a2[3*(i+2)]
                     -4*a3[3*(i-2)]+8*a3[3*(i-1)]+24*a3[3*i]+8*a3[3*(i+1)]-4*a3[3*(i+2)]
                      -4*a4[3*(i-2)]+8*a4[3*i]-4*a4[3*(i+2)]
                     -(2*a5[3*(i-2)]+4*a5[3*(i-1)]+4*a5[3*i]+4*a5[3*(i+1)]+2*a5[3*(i+2)]))));               end;       end;
           ChildForm.image1.Picture.Bitmap.Assign(bmp1);
        // JP1:=Tjpegimage.Create;
       // jp1.Assign(bmp1);
        Bmp1.Free;
      //  bmpnumber:=bmpnumber+1;
      //  jp1.SaveToFile('c:\temp\'+inttostr(bmpnumber)+'.jpg');
    //  jp1.Free;
    end;
    procedure TMainForm.prewittClick(Sender: TObject);     //prewitt算子
    var
     bmp1,bmp2:Tbitmap;
     p1,p3,p2,p4:pbytearray;
     i,j: integer;
     r,g,b:integer;
     begin
       self.DoubleBuffered:=true;  
       bmp1:=Tbitmap.Create;
       bmp2:=Tbitmap.Create;
       bmp1.Assign(backbmp);
       bmp1.PixelFormat:=pf24bit;
       bmp1.Width:=ChildForm.image1.Picture.Graphic.Width;
       bmp1.Height:=ChildForm.image1.Picture.Graphic.Height;
       bmp2.Assign(bmp1);
       bmp2.PixelFormat:=pf24bit;
        for j:=1 to bmp1.Height-2 do
           begin
            p1:=bmp1.ScanLine[j];           //²sobal算子         // -1 -1 -1
                                                                 // 0  0  0
             p2:=bmp2.ScanLine[j-1];                             // 1  1  1
             p3:=bmp2.ScanLine[j];                    //和 算子            取较大输出
              p4:=bmp2.ScanLine[j+1];                            //1 0 -1
                for i:=1 to bmp1.Width-2  do                     //1 0 -1
                          begin                                  //1 0 -1               r:=min(255,max(0,((-p2[3*(i-1)+2]-p2[3*i+2]-p2[3*(i+1)+2]-0*p3[3*(i-1)+2]+0*p3[3*i+2]-0*p3[3*(i+1)+2]+p4[3*(i-1)+2]+p4[3*i+2]+p4[3*(i+1)+2]))));
                   g:=min(255,max(0,((-p2[3*(i-1)+1]-p2[3*i+1]-p2[3*(i+1)+1]-0*p3[3*(i-1)+1]+0*p3[3*i+1]-0*p3[3*(i+1)+1]+p4[3*(i-1)+1]+p4[3*i+1]+p4[3*(i+1)+1]))));
                    b:=min(255,max(0,((-p2[3*(i-1)]-p2[3*i]-p2[3*(i+1)]-0*p3[3*(i-1)]+0*p3[3*i]-0*p3[3*(i+1)]+p4[3*(i-1)]+p4[3*i+2]+p4[3*(i+1)]))));                 begin
                        p1[3*i+2]:=min(255,max(0,((p2[3*(i-1)+2]-0*p2[3*i+2]-p2[3*(i+1)+2]+p3[3*(i-1)+2]+0*p3[3*i+2]-p3[3*(i+1)+2]+p4[3*(i-1)+2]+0*p4[3*i+2]-p4[3*(i+1)+2]))));
                        p1[3*i+1]:=min(255,max(0,((p2[3*(i-1)+1]-0*p2[3*i+1]-p2[3*(i+1)+1]+p3[3*(i-1)+1]+0*p3[3*i+1]-p3[3*(i+1)+1]+p4[3*(i-1)+1]+0*p4[3*i+1]-p4[3*(i+1)+1]))));
                        p1[3*i]:= min(255,max(0,((p2[3*(i-1)]-0*p2[3*i]-p2[3*(i+1)]+p3[3*(i-1)]+0*p3[3*i]-p3[3*(i+1)]+p4[3*(i-1)]+0*p4[3*i]-p4[3*(i+1)]))));
                         p1[3*i+2]:=(max(r,p1[3*i+2]));
                         p1[3*i+1]:=(max(g,p1[3*i+1]));
                         p1[3*i]:=(max(b,p1[3*i]));
                     end;            end;
           end;
           ChildForm.image1.Picture.Bitmap.Assign(bmp1);
           bmp1.free;
        end;