2011-10-28 9 views
1

Opencv for Delphiと呼ばれるオープンソースプロジェクトを編集しています。このプロジェクトは、Delphi 6、Delphi 2009、Delphi xe2でコンパイルできます。OpenCVをどのようにUnicodeバージョンのDelphiで使用できますか?

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

実行時にd6 appはエラーなしで正常に動作しますが、残りはコンパイルは良好ですが、cvopencv.dllを呼び出すと実行時エラーが発生します。

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

d6 exeでは、「???????」以外のものを読み取ることができません。 cvopencv.dllを呼び出すと、UNICODEの問題を意味するスペイン語で表示されるエラーが発生します。

私は、Delphi 2009以上で、このプロジェクトの作業は(まだよくコンパイルD2009)にするために何ができるの

====================== === David 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. 

答えて

7

あなたが参照しているOpenCVライブラリは、ヘッダーの上部にこれを示しています:

インテルオープンソースコンピュータビジョンライブラリ用ボーランドデルファイ4,5,6,7 API

このコードは、OpenCV DLLの周りのDelphiラッパーを示しています。これらの古いDelphiのバージョンの

CharPCharそれぞれAnsiCharPAnsiCharAnsiStringからstringマップ。これは、純粋な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))); 

あなたは(UnicodeStringにマップ)stringからAnsiStringに変換する必要がありますだけにして、あなたはPAnsiCharにキャストすることができます。 ではなく、と書いてください。PAnsiChar(FileName)です。これは、Unicode文字列をANSIに変換せず、失敗します。

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

+0

ありがとう;私はあなたのガイドラインを通過したと思うが、同じ問題を抱えていると思う。新しい(更新された)ソースコードを答えに付け加えた。 – VibeeshanRC

+1

さて、すぐに私は 'file1:= PAnsiChar(ExtractFilePath .....'これはまったくしないと言われているコードですが、 'ExtractFilePath'は' UnicodeString'を 'AnsiString'に変換して返します。 –

+0

ありがとうございます、あなたのガイドラインに正しく従わなかったのは残念です – VibeeshanRC

1

github上のDelphi-OpenCVプロジェクト(OpenCVバージョン2.4.6、環境 - Delphi XE2-XE4)を参照してください。 DelphiでのOpenCVライブラリヘッダーファイルの翻訳:https://github.com/Laex/Delphi-OpenCV

関連する問題