话题2344533的标题是: 图象识别技术! (300分)
分类:图形图象 ZRWeng (2003-12-10 9:56:00)
如何识别图象文件中的文字信息?
支持的文件格式是BMP和JPG图象,可以识别出图象中的汉字,数字等信息。
可用于车牌图象识别,希望能有相关资料或代码参考
问题不一定有答案,但我仍期待 :)
能解决后,另开贴给分!
QSmile (2003-12-10 9:58:00)
高难度问题!!!!!
我是来学习的。
ie65652 (2003-12-10 10:09:00)
晕,这种问题不是一两句就说的清楚的,汉王的车牌识别技术就不错,可以向他们咨询。
xusong168 (2003-12-10 11:47:00)
http://wenjinshan.wx-e.com/index2.htm
阿山编程主页
另推荐一本书《Visual C++数字图像模式识别技术及工程实践》
人民邮电出版社
lichengbin (2003-12-10 17:12:00)
It's very hard!
shaga (2003-12-10 17:27:00)
[
]
ZRWeng (2003-12-10 21:03:00)
查过离线资料,知道以前有DFW实现过,但没说明,
VCHelp站点也有这个图象识别项目,好象是OpenSource,但没看到
相关资料也少,呵呵,难度是很大
abencat (2003-12-11 12:39:00)
示范简单的图象识别,以腾讯网页附加码为例~~
//RecogniseUnit.pas
unit RecogniseUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ImgList, StdCtrls, OleCtrls, SHDocVw;
type
TFormRecognise = class(TForm)
ImageList1: TImageList;
ButtonRefresh: TButton;
WebBrowser1: TWebBrowser;
EditNumber: TEdit;
procedure ButtonRefreshClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure WebBrowser1DownloadComplete(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormRecognise: TFormRecognise;
implementation
{$R *.dfm}
uses Math; //use Math.Min()
function SameCanvas(mCanvasA, mCanvasB: TCanvas): Boolean; { 比较两个画布是否相同 }
var
I, J: Integer;
begin
Result := False;
if not Assigned(mCanvasA) then Exit;
if not Assigned(mCanvasB) then Exit;
for I := Min(mCanvasA.ClipRect.Left, mCanvasB.ClipRect.Left) to
Min(mCanvasA.ClipRect.Right, mCanvasB.ClipRect.Right) do
for J := Min(mCanvasA.ClipRect.Top, mCanvasB.ClipRect.Top) to
Min(mCanvasA.ClipRect.Bottom, mCanvasB.ClipRect.Bottom) do
if mCanvasA.Pixels[I, J] <> mCanvasB.Pixels[I, J] then Exit;
Result := True;
end; { SameCanvas }
procedure TFormRecognise.ButtonRefreshClick(Sender: TObject);
begin
TButton(Sender).Enabled := False;
WebBrowser1.Refresh;
end;
procedure TFormRecognise.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://verify.tencent.com/getimage?0.8539209923422657');
end;
procedure TFormRecognise.WebBrowser1DownloadComplete(Sender: TObject);
procedure fNumBitmap(mHandle: THandle; mIndex: Integer; mBitmap: TBitmap);
var
vDC: HDC;
begin
vDC := GetDC(mHandle);
try
mBitmap.Assign(nil);
mBitmap.Width := 5;
mBitmap.Height := 8;
BitBlt(mBitmap.Canvas.Handle, 0, 0, mBitmap.Width, mBitmap.Height, vDC,
17 + 6 * mIndex, 18, SRCCOPY);
mBitmap.PixelFormat := pf8bit;
mBitmap.PixelFormat := pf1bit;
finally
DeleteDC(vDC);
end;
end;
function fGetNum(mHandle: THandle; mIndex: Integer): Integer;
var
I: Integer;
vBitmapA: TBitmap;
vBitmapB: TBitmap;
begin
Result := -1;
vBitmapA := TBitmap.Create;
vBitmapB := TBitmap.Create;
fNumBitmap(mHandle, mIndex, vBitmapA);
vBitmapB.Width := vBitmapA.Width;
vBitmapB.Height := vBitmapA.Height;
for I := 9 downto 0 do begin //8会覆盖3的基础码,所以反循环
vBitmapB.Canvas.Draw(0, 0, vBitmapA);
ImageList1.Draw(vBitmapB.Canvas, 0, 0, I);
vBitmapB.PixelFormat := pf8bit;
vBitmapB.PixelFormat := pf1bit;
if SameCanvas(vBitmapA.Canvas, vBitmapB.Canvas) then begin
Result := I;
Exit;
end;
end;
vBitmapA.Free;
vBitmapB.Free;
end;
var
S: string;
I: Integer;
begin
Application.ProcessMessages;
S := '';
for I := 0 to 3 do S := S + IntToStr(fGetNum(WebBrowser1.Handle, I));
EditNumber.Text := S;
ButtonRefresh.Enabled := True;
end;
end.
//RecogniseUnit.dfm
object FormRecognise: TFormRecognise
Left = 369
Top = 273
Width = 174
Height = 88
Caption = 'FormRecognise'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object ButtonRefresh: TButton
Left = 89
Top = 35
Width = 75
Height = 25
Caption = 'Refresh'
TabOrder = 0
OnClick = ButtonRefreshClick
end
object WebBrowser1: TWebBrowser
Left = 0
Top = 0
Width = 165
Height = 34
TabOrder = 1
OnDownloadComplete = WebBrowser1DownloadComplete
ControlData = {
4C0000000E110000840300000000000000000000000000000000000000000000
000000004C000000000000000000000001000000E0D057007335CF11AE690800
2B2E126208000000000000004C0000000114020000000000C000000000000046
8000000000000000000000000000000000000000000000000000000000000000
00000000000000000100000000000000000000000000000000000000}
end
object EditNumber: TEdit
Left = 3
Top = 37
Width = 86
Height = 21
Color = clSilver
TabOrder = 2
end
object ImageList1: TImageList
Height = 8
Width = 5
Left = 127
Bitmap = {
494C01010A000E00040005000800FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000140000002000000001001000000000000005
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000424D3E000000000000003E000000
2800000014000000200000000100010000000000800000000000000000000000
000000000000000000000000FFFFFF0000000000000000000000000000000000
0000000000000000000000000000000088C00000774000007780000074000000
8B80000073800000738000008C400000EC637000EB9D7000079DB0006F9DB000
6B83D000A85FD000CBEFE000E8300000D8011000AEDEE00076EFE00076F7E000
76FB900072FDE000ACDCE000DEE3100000000000000000000000000000000000
000000000000}
end
end
星期一 (2003-12-11 22:10:00)
这个问题我在做收费站项目时也碰到过,不过后来那个收费站决定买另外的商业系统了。
我认为的难点有两个:
1、如何找到要识别的区域?对于车牌识别系统,可能可以通过定位设施强迫车辆在一个大概的位置停车,这是取得照片,车牌的位置也可以相对固定了。不知汉王是如何实现的。
2、OCR识别。不仅要识别数字和字母,还有汉字,不过汉字少些,只要能够识别40来字就可以了。
都是废话,只要有了OCR的技术,这就不是问题。我感兴趣的是如何判别两张图象是一样的,不管这两张图是不是一样大。
任远 (2003-12-13 22:20:00)
真的很难呀,我来帮忙顶,以后也许自己也会遇到
ZRWeng (2003-12-13 22:34:00)
是收费站项目,有这个需求,虽然目前还没有很强烈要求有这个功能:
通过摄相头拍摄过路车辆车牌图像,进行车牌识别,分析是否冲关车辆
是的话可以进行报警等一系列功能。目前可以讨论图象识别的实现可能:)
luweizhong (2003-12-13 23:16:00)
我覺得圖象識別關鍵是特征的提取與匹配.
沒做過車牌識別,几年前做過指紋識別和AOI(自動外觀檢測,檢測柔性線路板表面缺陷).
車牌的類型與字有固定的模板,先找出規律,然后對需要檢測的車輛進行匹配.
彩色圖象的信息量比灰度多,檢測算法復雜,最好用一些帶學習功能的算法.
htw (2003-12-15 8:56:00)
难度有点高, 有了这个技术可以开个公司当老板了
车牌识别属于模式识别问题, 需要至少具备数字图像处理和模式识别的知识。
数字的识别还好办, 汉字识别就复杂了
文字识别的方法有很多。
模板法,浮动模板法,神经网络, 小波分析都可以用于文字识别
http://www.delphibbs.com/delphibbs/dispq.asp?lid=941040
啊啊啊啊啊 (2003-12-23 21:02:00)
呵呵,判断是否冲关很简单,装个测速雷达不就行了,通过速度和距离判断就行了:)
对车牌识别很难,尤其是运动中的:(
niwei0784 (2003-12-24 10:43:00)
车牌识别是很难的,当初我们也想做,但做到一半,就毕业了。
t1122 (2003-12-27 8:57:00)
呵呵,这个问题可能有点复杂了,我也正在做一个计算机上面的图像识别,比这个简单的多
了,我说说我的思路,也许有用。
由于我的识别没有噪音,也很简单,所以没有二义化、切割等等。
是这样,我规定了一个色差范围,凡是在一定范围内的都认为是相同的颜色。然后根据汉字
和数字的特点(其中包括汉字的横、竖、连线、交点)查找有没有想类似的图片区域,然后
在这个区域里面具体的颜色判断汉字的形状,根据已知的字体,匹配特征(只要是80%点相
同就认为相同),然后计算出来汉字的大小、间隔,最后识别出来。
这个东西我也在做,还没有完。我的对象比较固定,噪音也非常得少,甚至颜色都是想近的
所以可能用处不大。
CGN (2003-12-27 9:24:00)
识别的关键是硬件!
t1122 (2003-12-27 9:40:00)
现在我就发现了一个问题,拍照系统不是垂直拍摄的,一定是有角度的,而且角度也不固定
所以这个扭曲一定要计算的
huaihaizi (2004-01-10 4:51:00)
他奶奶的我写出来一定把它做成个免费的软件包,大家分享!这个问题,我都想了好久好久了,还是没有结果
netwatch (2004-01-10 9:49:00)
有意思,虽然没做过类似的,但值得去思考
cclltt (2004-01-10 18:05:00)
怎么看你们的回答
cdly74 (2004-02-27 18:49:51)
正好,我也在感趣这方面的问题,现在有很多用VC写的代码来实现一些图像处理,但其中实现的都似乎是较简单的问题,无学习功能等。
god father (2004-03-28 20:33:25)
我的上帝,这个也太难了,那个老大能搞出来啊?我们的boss要这个软件,想来想去还是买了个杭州的,我们就搞搞后台的数据库吧,这个现实一点
boy_505 (2004-04-19 16:06:02)
这个技术,很难。
我们也在研究中……我们正在开发一套测速仪,就是把这个东东摆在路边测量经过车辆是否超速行驶的。
期待中……
顶……
ivw (2004-04-19 17:28:45)
我试过。数字识别,达到90%,不过汉字好难,要知道所有车牌才行,我也想知道其它方法,哪个知道也跟我说一声。多谢