mirror of
https://github.com/moparisthebest/Simba
synced 2024-12-24 08:18:52 -05:00
28f5c30785
OCR still needs work. Also needs newer fonts. git-svn-id: http://www.villavu.com/repositories/merlijn/mufasa@286 3f818213-9676-44b0-a9b4-5e4c4e03d09d
313 lines
7.5 KiB
ObjectPascal
313 lines
7.5 KiB
ObjectPascal
program project1;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
uses
|
|
{$IFDEF UNIX}{$IFDEF UseCThreads}
|
|
cthreads,
|
|
{$ENDIF}{$ENDIF}
|
|
Classes, SysUtils, CustApp,
|
|
Forms,Interfaces,
|
|
LCLIntf,
|
|
Client,
|
|
bitmaps,{x ,}mufasatypes,dtm,dtmutil, ocrutil ,graphics ,colour_conv,math
|
|
|
|
|
|
{ you can add units after this };
|
|
|
|
type
|
|
|
|
{ MufasaTests }
|
|
|
|
MufasaTests = class(TCustomApplication)
|
|
protected
|
|
procedure DoRun; override;
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure WriteHelp; virtual;
|
|
end;
|
|
|
|
{ MufasaTests }
|
|
|
|
const
|
|
CW = 800;
|
|
CH = 600;
|
|
|
|
function randomdtm(a: integer): pdtm;
|
|
var
|
|
i: integer;
|
|
begin
|
|
initdtm(result, a);
|
|
for i := 1 to result.l - 1 do
|
|
begin
|
|
result.p[i] := point(random(30) - 15, random(30) - 15);
|
|
result.c[i] := 0;
|
|
result.t[i] := random(255);
|
|
result.asz [i] := random(5);
|
|
result.ash[i] := 0;
|
|
writeln(format('dtm: (%d, %d) c: %d, t: %d, asz: %d', [result.p[i].x,
|
|
result.p[i].y, result.c[i], result.t[i], result.asz[i]]));
|
|
end;
|
|
result.c[0] := 255;
|
|
end;
|
|
|
|
procedure MufasaTests.DoRun;
|
|
|
|
|
|
const
|
|
ocr_Limit_High = 191;
|
|
ocr_Limit_Low = 65;
|
|
|
|
ocr_White = 16777215;
|
|
ocr_Green = 65280;
|
|
ocr_Red = 255;
|
|
ocr_Yellow = 65535;
|
|
ocr_Blue = 16776960;
|
|
ocr_ItemC = 16744447;
|
|
|
|
ocr_Purple = 8388736;
|
|
|
|
var
|
|
ErrorMsg: String;
|
|
Time: DWord;
|
|
C: TClient;
|
|
I, w, h,x,y: Integer;
|
|
dtm: pdtm;
|
|
p:tpointarray;
|
|
bmp, bmprs: TMufasaBitmap;
|
|
r,g,b:integer;
|
|
t:Dword;
|
|
|
|
begin
|
|
// quick check parameters
|
|
ErrorMsg:=CheckOptions('h','help');
|
|
if ErrorMsg<>'' then begin
|
|
ShowException(Exception.Create(ErrorMsg));
|
|
Terminate;
|
|
Exit;
|
|
end;
|
|
|
|
// parse parameters
|
|
if HasOption('h','help') then begin
|
|
WriteHelp;
|
|
Terminate;
|
|
Exit;
|
|
end;
|
|
|
|
|
|
{ clOlive = false point }
|
|
{ clSilver = false shadow }
|
|
{ clLime = false shadow}
|
|
|
|
{ add your program here }
|
|
|
|
|
|
bmprs := TMufasaBitmap.Create;
|
|
bmprs.LoadFromFile('/home/merlijn/Programs/mufasa/pics/16.bmp');
|
|
C := TClient.Create;
|
|
C.MWindow.SetTarget(bmprs);
|
|
C.MWindow.GetDimensions(w, h);
|
|
|
|
writeln(inttostr(clpurple));
|
|
|
|
bmp := TMufasaBitmap.Create;
|
|
bmp.CopyClientToBitmap(C.MWindow, True, 0, 0, 450, 50);
|
|
|
|
t:=gettickcount;
|
|
|
|
for y := 0 to bmp.Height - 1 do
|
|
for x := 0 to bmp.Width - 1 do
|
|
begin
|
|
colortorgb(bmp.fastgetpixel(x,y),r,g,b);
|
|
// the abs(g-b) < 15 seems to help heaps when taking out crap points
|
|
if (r > ocr_Limit_High) and (g > ocr_Limit_High) and (b > ocr_Limit_High){ and (abs(g-b) < 15)} then
|
|
begin
|
|
bmp.fastsetpixel(x,y,ocr_White);
|
|
continue;
|
|
end;
|
|
if (r < ocr_Limit_Low) and (g > ocr_Limit_High) and (b > ocr_Limit_High) then
|
|
begin
|
|
bmp.fastsetpixel(x,y,ocr_Blue);
|
|
continue;
|
|
end;
|
|
if (r < ocr_Limit_Low) and (g > ocr_Limit_High) and (b < ocr_Limit_Low) then
|
|
begin
|
|
bmp.fastsetpixel(x,y,ocr_Green);
|
|
continue;
|
|
end;
|
|
|
|
// false results with fire
|
|
if(r > ocr_Limit_High) and (g > 100) and (g < ocr_Limit_High) and (b > 40) and (b < 90) then
|
|
begin
|
|
bmp.fastsetpixel(x,y,ocr_ItemC);
|
|
continue;
|
|
end;
|
|
if(r > ocr_Limit_High) and (g > ocr_Limit_High) and (b < ocr_Limit_Low) then
|
|
begin
|
|
bmp.fastsetpixel(x,y,ocr_Yellow);
|
|
continue;
|
|
end;
|
|
// better use g < 40 than ocr_Limit_Low imo
|
|
if (r > ocr_Limit_High) and (g < ocr_Limit_Low) and (b < ocr_Limit_Low) then
|
|
begin
|
|
bmp.fastsetpixel(x,y,ocr_Red);
|
|
continue;
|
|
end;
|
|
|
|
if (r < ocr_Limit_Low) and (g < ocr_Limit_Low) and (b < ocr_Limit_Low) then
|
|
begin
|
|
bmp.FastSetPixel(x,y, ocr_Purple);
|
|
continue;
|
|
end;
|
|
|
|
bmp.fastsetpixel(x,y,0);
|
|
end;
|
|
|
|
// increase height by 1, so our algo works better. (shadow)
|
|
bmp.SetSize(Bmp.Width, Bmp.Height+1);
|
|
for x := 0 to bmp.width -1 do
|
|
bmp.fastsetpixel(x,bmp.height-1,0);
|
|
|
|
for y := 0 to bmp.Height - 2 do
|
|
for x := 0 to bmp.Width - 2 do
|
|
begin
|
|
if bmp.fastgetpixel(x,y) = clPurple then
|
|
continue;
|
|
if bmp.fastgetpixel(x,y) = clBlack then
|
|
continue;
|
|
if (bmp.fastgetpixel(x,y) <> bmp.fastgetpixel(x+1,y+1)) and (bmp.fastgetpixel(x+1,y+1) <> clpurple) then
|
|
bmp.fastsetpixel(x,y,{clAqua}0);
|
|
end;
|
|
|
|
{ Optional - remove false shadow }
|
|
for y := bmp.Height - 1 downto 1 do
|
|
for x := bmp.Width - 1 downto 1 do
|
|
begin
|
|
if bmp.fastgetpixel(x,y) <> clPurple then
|
|
continue;
|
|
if bmp.fastgetpixel(x,y) = bmp.fastgetpixel(x-1,y-1) then
|
|
begin
|
|
bmp.fastsetpixel(x,y,clSilver);
|
|
continue;
|
|
end;
|
|
if bmp.fastgetpixel(x-1,y-1) = 0 then
|
|
bmp.fastsetpixel(x,y,clLime);
|
|
end;
|
|
|
|
{ remove bad points }
|
|
for y := bmp.Height - 2 downto 1 do
|
|
for x := bmp.Width - 2 downto 1 do
|
|
begin
|
|
if bmp.fastgetpixel(x,y) = clPurple then
|
|
continue;
|
|
if bmp.fastgetpixel(x,y) = clBlack then
|
|
continue;
|
|
if (bmp.fastgetpixel(x,y) = bmp.fastgetpixel(x+1,y+1) ) then
|
|
continue;
|
|
|
|
if bmp.fastgetpixel(x+1,y+1) <> clPurple then
|
|
begin
|
|
bmp.fastsetpixel(x,y,clOlive);
|
|
continue;
|
|
end;
|
|
end;
|
|
|
|
{ Dangerous removes all pixels that had no pixels on x-1 or x+1}
|
|
{ for y := 0 to bmp.Height - 2 do
|
|
for x := 1 to bmp.Width - 2 do
|
|
begin
|
|
if bmp.fastgetpixel(x,y) = clBlack then continue;
|
|
if bmp.fastgetpixel(x,y) = clPurple then continue;
|
|
if bmp.fastgetpixel(x,y) = clOlive then continue;
|
|
if bmp.fastgetpixel(x,y) = clSilver then continue;
|
|
if bmp.fastgetpixel(x,y) = clLime then continue;
|
|
if (bmp.fastgetpixel(x,y) <> bmp.fastgetpixel(x+1,y) ) and
|
|
(bmp.fastgetpixel(x,y) <> bmp.fastgetpixel(x-1,y) ) then
|
|
bmp.fastsetpixel(x,y,clFuchsia);
|
|
end; }
|
|
|
|
writeln(inttostr(gettickcount-t));
|
|
|
|
|
|
|
|
|
|
bmp.SaveToFile('/tmp/output.bmp');
|
|
//bmp.OnDestroy:=nil;
|
|
bmp.Free;
|
|
C.Free;
|
|
|
|
// stop program loop
|
|
Terminate;
|
|
end;
|
|
|
|
constructor MufasaTests.Create(TheOwner: TComponent);
|
|
begin
|
|
inherited Create(TheOwner);
|
|
StopOnException:=True;
|
|
end;
|
|
|
|
destructor MufasaTests.Destroy;
|
|
begin
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure MufasaTests.WriteHelp;
|
|
begin
|
|
{ add your help code here }
|
|
writeln('Usage: ',ExeName,' -h');
|
|
end;
|
|
|
|
var
|
|
Application: MufasaTests;
|
|
|
|
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
|
|
|
|
begin
|
|
Application:=MufasaTests.Create(nil);
|
|
Application.Title:='My Application';
|
|
Application.Run;
|
|
Application.Free;
|
|
end.
|
|
|
|
|
|
{ {$WARNING Change This Path!}
|
|
C.MOCR.InitTOCR('/home/merlijn/Programs/mufasa/Fonts/');
|
|
//C.MOCR.InitTOCR('/home/merlijn/Programs/mufasa/ben/');
|
|
|
|
{C.MWindow.GetDimensions(W, H);
|
|
Time := GetTickCount;
|
|
for i := 0 to 100 do
|
|
C.MFinder.FindColor(X, Y, 0, 0, 0, W - 1, H - 1);
|
|
writeln('Time: ' + IntToStr(GetTickCount - Time));
|
|
|
|
if C.MFinder.FindColor(X, Y, 0, 0, 0, W - 1, H - 1) then
|
|
begin
|
|
C.MInput.SetMousePos(X, Y);
|
|
writeln('found!');
|
|
end else
|
|
begin
|
|
writeln('not found!');
|
|
end; }
|
|
|
|
|
|
bmp := TMufasaBitmap.Create;
|
|
|
|
{$WARNING Change This Path!}
|
|
{ bmp.LoadFromFile('/home/merlijn/Programs/mufasa/UpText/text1.bmp');
|
|
//bmp.LoadFromFile('/home/merlijn/Programs/mufasa/output.bmp');
|
|
|
|
writeln(inttostr(bmp.Width) + ', ' + inttostr(bmp.height));
|
|
{C.MWindow.SetTarget(x.TWindow(94371927)); }
|
|
C.MWindow.SetTarget(bmp);
|
|
|
|
Time := GetTickCount;
|
|
for i := 0 to 100 do
|
|
C.MOCR.GetUpTextAt(0,0);
|
|
writeln('Time: ' + FloatToStr(((GetTickCount - Time) / (i + 1))));
|
|
writeln(C.MOCR.GetUpTextAt(0,0)); }
|
|
|
|
//C.MInput.ClickMouse(5,5, mouse_Left);
|
|
sleep(2000);
|
|
C.MInput.SendText('a'); }
|