OpenCV'yi Delphi'nin Unicode sürümleriyle nasıl kullanabilirim?

Delphi için Opencv adlı bir açık kaynak projesini düzenliyorum

Delphi 6 derlemesi için uyumsuz (örneğin: Application.MainFormOnTaskbar: = True; ) kaldırdım.

Çalışma zamanında d6 uygulaması hatasız çalışır, ancak geri kalanı iyi derler ama cvopencv.dll çağrılırken çalışma zamanı hatası ile.

Orijinal proje, iyi çalışan Delphi 2007 ile derlenen bir İspanyol projesi.

D6 exe dışında bir şey okuyamıyorum ??????? ancak diğerleri, cvopencv.dll çağrılırken UNICODE sorunu olduğu anlamına gelen ispanyolcada gösterilir.

Bu projeyi Delphi 2009 veya üstü ile çalışmak için ne yapabilirim (hala d2009 iyi derleme)

David Heffemans'ın Yanıtı =================================

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 cevap

Başvurduğunuz OpenCV kitaplığı, üstbilginin üst kısmında şöyle diyor:

Intel Açık Kaynak Bilgisayarı Vizyon Kütüphanesi için

Borland Delphi 4,5,6,7 API

Bu kod, OpenCV DLL'lerinin etrafında bir Delphi sarıcısı sunar.

Bu eski Delphi sürümleri için Char , PChar ve string haritasının AnsiChar , PAnsiChar ve sırasıyla AnsiString . Bu, saf ANSI olan OpenCV DLL'leriyle eşleşir. OpenCV'de Unicode API'leri yoktur (en azından ayırt edebildiğim kadarıyla).

Bu birimi Delphi 2009'dan kullanmak isterseniz, bunu Delphi 2009'da tanımanız gerekiyor, Unicode desteği eklendi. Bu, Char , PChar ve string haritasının WideChar , PWideChar olarak değiştirilmesini değiştirdi ve sırasıyla UnicodeString . Bu birimin arkasındaki DLL hala tek baytlı ANSI metni işlediği için karşılaştığınız uyumsuzluğun nedeni budur.

Muhtemelen bu ünitede en hassas yaklaşım, AnsiChar , PAnsiChar ve AnsiString 'i kullanmaktır. Bunu global bir arama ile yapabilir ve ünitede değiştirebilirsiniz.

Bu OpenCV.pas ünitesini tekrar DLL'lerle eşleştirecektir. Bu OpenCV.pas ünitesiyle nasıl bir arayüz oluşturduğunuz konusunda dikkatli olmanız gerekiyor. PAnsiChar parametrelerini alan işlevlerin özel bir işleme ihtiyacı vardır.

Örneğin aşağıdaki örneği göz önünde bulundurun:

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

Bu orijinal beyannamedir. Aramanızdan ve değiştirdikten sonra şu şekilde okunur:

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

Aramaya geldiğinizde, uygun bir PAnsiChar ilettiğinizden emin olmanız gerekir. Bunun gibi:

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

string dosyasından ( UnicodeString ile eşlenen) AnsiString 'e dönüştürmeniz ve sadece PAnsiChar ' a yayınlayabilmeniz gerekir. yazmayın PAnsiChar (DosyaAdı) yazın. Bu, Unicode dizesini ANSI'ye dönüştürmez ve başarısız olur.

Neyse ki sizin için OpenCV kütüphanesi, metin alan nispeten az sayıda API'ye sahiptir.

7
katma
Teşekkürler ; Sanırım rehber çizgilerin üzerinden geçtim ama yine de aynı problemi, yeni (güncellenmiş) kaynak kodunu cevabı ile ekledim.
katma yazar VibeeshanRC, kaynak
Teşekkürler, Çalışır, Talimatlarınızı doğru şekilde takip etmediğim için üzgünüm
katma yazar VibeeshanRC, kaynak
Peki, hemen kodu file1: = PAnsiChar (ExtractFilePath ..... ) yapamıyorum. Tam olarak ne yapılacağı söylenir. ExtractFilePath bir döndürür UnicodeString onu AnsiString 'e dönüştürür.Kodunuzda çok dikkatli bir okuma yaptığınızı öneririm.
katma yazar David Heffernan, kaynak
Telaşa gerek yok. Memnun kaldım.
katma yazar David Heffernan, kaynak

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
katma