OpenCVをどのようにUnicodeバージョンのDelphiで使用できますか?

私は DelphiのOpenCv という名前のオープンソースプロジェクトを編集しています。 a>は、Delphi 6、Delphi 2009、Delphi xe2でうまくコンパイルできます。

Delphi 6のコンパイルで互換性のないもの(例: Application.MainFormOnTaskbar:= True; )を削除しました。

実行時にd6アプリはエラーなく正常に動作しますが、残りはうまくコンパイルされますが、 cvopencv.dll を呼び出すときに実行時エラーが発生します。

元のプロジェクトは、うまく動作するDelphi 2007でコンパイルされたスペイン語のプロジェクトです。

d6 exeでは、私は??????エラーが発生したときに cvopencv.dll を呼び出すときにUNICODEの問題を意味するスペイン語で表示されるものがあります。

このプロジェクトをDelphi 2009以上で動作させるには何ができますか(まだd2009はうまくコンパイルされています)

=======================================================================================================================================デビッド

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

このコードは、OpenCV DLLの周りにDelphiラッパーを提供します。

これらの古いバージョンのDelphiでは、 AnsiCharPAnsiCharCharPChar >と AnsiString をそれぞれ使用します。これは、純粋なANSIであるOpenCV DLLと一致します。 OpenCVにはUnicode APIはありません(少なくとも私が識別できる限り)。

このユニットをDelphi 2009以降で使用する場合は、Delphi 2009でUnicodeサポートが追加されたことを認識する必要があります。これにより CharPChar および string のマッピングが WideCharPWideChar UnicodeString をそれぞれ使用します。これは、このユニットの背後にあるDLLが1バイトのANSIテキストを処理しているために発生した非互換性の原因です。

おそらく、このユニットの最も賢明なアプローチは、 AnsiCharPAnsiChar 、および 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)));

stringUnicodeString )に変換して AnsiString に変換し、次に PAnsiChar にキャストする必要があります。 PAnsiChar(FileName)書き込まない。これは、Unicode文字列をANSIに変換せず、失敗します。

OpenCVライブラリには、幸いなことに、テキストを受け取る比較的少数のAPIがあります。

7
追加された
ありがとう。私はあなたのガイドラインを通過したと思うが、同じ問題を抱えていると思う。新しい(更新された)ソースコードを答えに付け加えた。
追加された 著者 VibeeshanRC,
ありがとうございます、それは正常にあなたのガイドラインに従わなかったため申し訳ありません
追加された 著者 VibeeshanRC,
さて、すぐに私は file1:= PAnsiChar(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
追加された