OMarks - библиотека оптических маркеров
Решает множество проблем с поиском маркера для ДР и работает если смотреть на пример (http://intbusoft.com/download/CameraOpenCV.zip) быстро и надежно .
Одна беда не получается прикрутить ее к коду на Лазарусе
Подключение простое как двери
- Код: Выделить всё
const
External_library='OMarks.dll'; {Setup as you need}
Type
//Pchar = ^char;
Plongint = ^longint;
const
OMARKS_TYPE_SMALL_AZTEC = $01;
{ Params }
OMARKS_IMAGE24 = $01;
OMARKS_IMAGE8 = $02;
OMARKS_IMAGE32 = $20;
OMARKS_QUALITY_1 = $04;
OMARKS_QUALITY_2 = $08;
OMARKS_QUALITY_3 = $10;
{ Dinamic }
DMARK_TREMBLE = $100;
DMARK_MOTION = $200;
{
Function FindMarkers finds markers on image.
0 - No Markers.
1 - Markers.
2 - Unknown image format.
3 - Unknown type marker.
4 - Unknown quality.
5 - Error recognition.
}
{ Result }
const
MAX_CHAR = 4000;
{ type
MARKER = record
len : longint;
result : array[0..(MAX_CHAR)-1] of char;
Points : array[0..3] of CvPoint;
end;
}
function FindMarkers(Image_Data:Pchar; Image_Width:longint; Image_Height:longint;
All_Markers:Plongint; Data_Result:PPchar;
Size_Data_Result:PPlongint; Points4_Mark:PPlongint;
Type_Marker:longint; Param:longint):longint;
//cdecl;
stdcall;
external External_library name 'FindMarkers';
function DMarksInit:pointer;stdcall; //cdecl;
external External_library name 'DMarksInit';
procedure DMarksRelease(Marks:Ppointer); stdcall; //cdecl;
external External_library name 'DMarksRelease';
procedure DMarksProcessed(Image_Data:Pchar; Image_Width:longint; Image_Height:longint; Marks:Ppointer; All_Markers:Plongint;
Data_Result:PPchar; Size_Data_Result:PPlongint;
Points4_Mark:PPlongint; flags:longint); stdcall; //cdecl;
external External_library name 'DMarksProcessed';
Вызов еще проще (Image1 обычная картинка ТImage )
- Код: Выделить всё
procedure TMainForm.Button1Click(Sender: TObject);
Var
AM,I:Longint;
Size_Data_Result: Array[0..9] of Longint;
Points4_Mark: Array[0..9] of PLongint ;
Data_Result: Array[0..9] of Pchar;
B8:TBitmap;
DM:Pointer;
begin
B8:=TBitmap.Create;
//b8.PixelFormat:=pf8bit;
b8.PixelFormat:=pf24bit;
b8.SetSize(Image1.Picture.Bitmap.width, Image1.Picture.Bitmap.height);
b8.Canvas.Draw(0,0,Image1.Picture.Bitmap);
AM:=10;
For I:=0 to 9 do begin
Size_Data_Result[i]:=400;//?
GetMem(Data_Result[i],400);
GetMem(Points4_Mark[i],Sizeof(Longint)*8);
end;
B8.BeginUpdate;
I:=FindMarkers( Pointer(B8.RawImage.Data),
B8.width, B8.height,
@AM,@Data_Result,@Size_Data_Result,
@Points4_Mark, OMARKS_TYPE_SMALL_AZTEC,
OMARKS_IMAGE24 or OMARKS_QUALITY_1);
{ ------------------------------------------------------------------------
// DMarksProcessed( якобы улучшает результат но без него работать тоже по идее должно ..
DMarksProcessed( Pointer(B8.RawImage.Data),
B8.width, B8.height,@DM,
@AM,@Data_Result,@Size_Data_Result,
@Points4_Mark,
OMARKS_IMAGE24 or OMARKS_QUALITY_1);
DMarksRelease(DM);
------------------------------------------------------------------------------------ }
B8.ENDUpdate;
ShowMessage(IntToStr(I)+' '+IntToStr(AM) );
For I:=0 to 9 do begin
FreeMem(Data_Result[i],400);
FreeMem(Points4_Mark[i],Sizeof(Longint)*8);
end;
b8.Free;
end;
Но не фурычит ! Выбивает с исключением хотя если неверно задать flags FindMarkers возвращает правильные ошибки
(То есть в DLL заходит) Если убрать cdecl; (или stdcall;) успевает выдать 0 (что еще понятно )и все рано выбивает или 2 (что совсем непонятно )
хотя картинка гарантированно содержит Aztec метку ,
Вообщем полночи сегодня провозился но понять в чем дело не вышло .
Зы
Кроме OMarks.dll есть еще и OMarks.Lib может лучшее попытаться ее использовать ?