Як я магу выкарыстоўваць OpenCV з Unicode версіямі Delphi?

Я рэдагаванне зыходнага праекта з адкрытым назвай OpenCV для Delphi , які выдатна кампілюецца з Delphi 6, Delphi 2009 і Delphi XE2.

Я толькі што выдаліў несумяшчальным (напрыклад: Application.MainFormOnTaskbar: = True; ) для кампіляцыі Delphi 6.

На час выканання d6 прыкладанне працуе выдатна без памылак, але астатнія кампіляцыі, але з выкананнем памылкай часу пры выкліку cvopencv.dll .

Арыгінальны праект з'яўляецца іспанскі праект скампіляваны з Delphi 2007, які працуе выдатна.

У d6 ехе я не магу чытаць любую рэч, акрамя ??????? але іншыя, якія паказваюць на іспанскай мове, што азначае, што гэта праблема UNICODE, пры выкліку cvopencv.dll адбываецца памылка.

Што я магу зрабіць, каб зрабіць гэты праект працы з Delphi 2009 і вышэй (да гэтага часу D2009 кампіляцыяй добра)

========================= Пасля Дэвід Heffemans Адказ =====================

procedure TForm1.Button2Click(Sender: TObject);
var

   file1 : PAnsiChar;//"haarcascade_frontalface_alt.xml";
   file2 : PAnsiChar; //"haarcascade_eye.xml";
   file3 : PAnsiChar; //"haarcascade_upperbody.xml";
   SourceFileName : AnsiString;
   StorageType : Integer;
   ImSize : CvSize;

begin
   memo1.Lines.Clear;
   GetMem(Storage, SizeOf(CvMemStorage));
   SourceFileName:=Edit1.Text;
   StorageType:=0;
   storage:=nil;
   storage :=cvCreateMemStorage(storageType);
   file1 := PAnsiChar(ExtractFilePath(Application.ExeName)+'haarcascade_frontalface_alt.xml');
   file2 := PAnsiChar(ExtractFilePath(Application.ExeName)+'haarcascade_eye.xml');
   file3 := PAnsiChar(ExtractFilePath(Application.ExeName)+'haarcascade_upperbody.xml');

   cascade_f := cvLoad(file1, nil, nil, nil);
   cascade_e := cvLoad(file2, nil, nil, nil);
   cascade_ub := cvLoad(file3, nil, nil, nil);

   if cascade_f=nil then ShowMessage('Íå ìîãó çàãðóçèòü êàñêàä Face');
   if cascade_e=nil then ShowMessage('Íå ìîãó çàãðóçèòü êàñêàä Eye');
   if cascade_ub=nil then ShowMessage('Íå ìîãó çàãðóçèòü êàñêàä UpperBody');

   img := cvLoadImage(PAnsiChar(AnsiString(SourceFileName)), 1);

   cvNamedWindow((PAnsiChar(AnsiString(Edit1.Text))), 1);

   detectEyes(img);
   cvShowImage(PAnsiChar(AnsiString(SourceFileName)), img);

end;

end.
1

2 адказы

Бібліятэка OpenCV вы спасылаецеся кажа, што гэта ў верхняй частцы загалоўка:

<Р> Borland Delphi 4,5,6,7 API для Intel Open Source Computer Library Vision,

Гэты код ўяўляе сабой Delphi абгортку вакол OpenCV бібліятэк DLL.

Для гэтых старых версій Delphi, Char , PChar і радок Карта AnsiChar , PAnsiChar і AnsiString адпаведна. Гэта адпавядае OpenCV бібліятэкі DLL, якія з'яўляюцца чыста ANSI. Там няма Unicode API, у OpenCV (прынамсі, наколькі я магу адрозніць).

Калі вы хочаце выкарыстоўваць дадзены апарат з Delphi 2009 і вышэй вы павінны прызнаць, што ў Delphi 2009 г., была дададзеная падтрымка Unicode. Гэта змяніла адлюстраванне Char , PChar і радок Карта WideChar , PWideChar і UnicodeString адпаведна. Гэта з'яўляецца прычынай несумяшчальнасці вы сутыкнуліся, таму што DLL ззаду гэтага блока яшчэ апрацоўвае адзін байт ANSI тэкст.

Верагодна, найбольш разумны падыход з дадзеным прыладай, каб змяніць яго выкарыстоўваць AnsiChar , PAnsiChar і AnsiString . Вы можаце зрабіць гэта з дапамогай глабальнага пошуку і замены ў блоку.

Гэта прымусіць блок OpenCV.pas адпавядаць бібліятэкі DLL зноў. Цяпер вы павінны быць асцярожныя, як вы ўзаемадзейнічаць з гэтым OpenCV.pas блокам. Функцыі, якія атрымліваюць PAnsiChar параметры патрабуюць спецыяльнай апрацоўкі.

Напрыклад, разгледзім наступны прыклад:

Function  cvLoadImage( const filename : PChar; 
    iscolor : integer=1) : PIplImage; cdecl; 

Гэта арыгінал дэкларацыі. Пасля вашага пошуку і замены ён будзе чытаць, як гэта:

Function  cvLoadImage( const filename : PAnsiChar; 
    iscolor : integer=1) : PIplImage; cdecl; 

Калі вы прыходзіце назваць гэта вам трэба, каб вы прайсці правільны PAnsiChar . Як гэта:

var
  FileName: string;
...
image := cvLoadImage(PAnsiChar(AnsiString(FileName)));

Вы павінны канвертаваць з радкі (які адлюстроўвае UnicodeString ) у AnsiString і толькі тады вы можаце прывесці да PAnsiChar . У <моцны> не <код запісы> PAnsiChar (FileName) . Гэта не будзе ператвараць радок Unicode ў ANSI і пацерпіць няўдачу.

На шчасце для вас бібліятэка OpenCV мае адносна невялікая колькасць API, якія атрымліваюць тэкст.

7
дададзена
дзякуючы; Я думаю, што я прайшоў праз вашыя накіроўвалыя лініі, але ўсё тая ж праблема, я прымацаваў новы (абноўлены) зыходны код з адказам.
дададзена аўтар VibeeshanRC, крыніца
Дзякуй, гэта працуе, Выбачайце за не крочыць вашым рэкамендацый правільна
дададзена аўтар VibeeshanRC, крыніца
Ну, я адразу магу ўбачыць код, які робіць file1 :. = PAnsiChar (ExtractFilePath ..... Гэта менавіта тое, што сказана не рабіць ExtractFilePath вяртае UnicodeString пераўтварыць яго ў AnsiString . Я мяркую, у вас ёсць яшчэ адзін вельмі асцярожнага чытання праз ваш код.
дададзена аўтар David Heffernan, крыніца
Не хвалюйся. Рады, што гэта спрацавала.
дададзена аўтар David Heffernan, крыніца

See the project - Delphi-OpenCV on github (OpenCV version - 2.4.6, environment - Delphi XE2-XE4). Translation of OpenCV library header files in Delphi: https://github.com/Laex/Delphi-OpenCV

1
дададзена