質問: 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. ```](https://delphimagic.blogspot.com/2011/08/reconocimiento-de-caras-con-delphi.html)
回答: あなたが参照しているOpenCVライブラリは、ヘッダーの一番上にこれを示しています: > インテルオープンソースコンピュータビジョンライブラリ用のBorland Delphi 4,5,6,7 API > > このコードは、OpenCV DLLの周りにDelphiラッパーを提供します。 これらの古いバージョンのDelphiでは、 `AnsiChar` 、 `PAnsiChar` に `Char` 、 `PChar` >と `AnsiString` をそれぞれ使用します。これは、純粋なANSIであるOpenCV DLLと一致します。 OpenCVにはUnicode APIはありません(少なくとも私が識別できる限り)。 このユニットをDelphi 2009以降で使用する場合は、Delphi 2009でUnicodeサポートが追加されたことを認識する必要があります。これにより `Char` 、 `PChar` および `string` のマッピングが `WideChar` 、 `PWideChar` `UnicodeString` をそれぞれ使用します。これは、このユニットの背後にあるDLLが1バイトの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))); ``` `string` ( `UnicodeString` )に変換して `AnsiString` に変換し、次に `PAnsiChar` にキャストする必要があります。 `PAnsiChar(FileName)`を**書き込まない**。これは、Unicode文字列をANSIに変換せず、失敗します。 OpenCVライブラリには、幸いなことに、テキストを受け取る比較的少数のAPIがあります。