OpenCV ning Delphi-ning Unicode versiyalari bilan qanday foydalanishi mumkin?

Delphi uchun ochilgan ochiq kodli loyihani tahrir qilaman

Delphi 6 kompilyatsiyasi uchun faqat mos bo'lmagan (masalan, Application.MainFormOnTaskbar: = True ) olib tashlandi.

Foydalanish davrida d6 ilovasi xatolikka yo'l qo'ymasdan yaxshi ishlaydi, ammo qolganlari yaxshi ishlaydi, lekin cvopencv.dll ga qo'ng'iroq qilganda ish vaqti xatoligi bilan.

Asl loyiha Delphi 2007 bilan tuzilgan ispan loyihasi bo'lib, u yaxshi ishlaydi.

D6 exe da bironta narsani o'qib chiqolmayman ??????? ammo boshqa tillarda ispan tilida ko'rsatiladigan bo'lsa, bu cvopencv.dll deb nom olganida UNICODE muammosi degan ma'noni anglatadi.

Ushbu loyihani Delphi 2009 yoki undan yuqori versiyalar bilan ishlash uchun nima qila olaman (hali ham yaxshi d2009 kompilyatsiya qilish)

========================= Devid Heffermans javobidan keyin =====================

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 javoblar

Siz atagan OpenCV kutubxonasi buni sarlavhaning yuqori qismida bildiradi:

Intel Open Source Kompyuter Vizyon Kutubxonasi uchun Borland Delphi 4,5,6,7 API.

Ushbu kod OpenCV DLLlar atrofida Delphi paketini taqdim etadi.

Ushbu eski Delphi versiyalarida AnsiChar uchun Char , PChar va string xarita uchun PAnsiChar va AnsiString ni tanlashingiz mumkin. Bu sof ANSI bo'lgan OpenCV DLL-lariga mos keladi. OpenCVda hech qanday Unicode API mavjud emas (hech bo'lmaganda men farq qiladigan darajada).

Agar siz ushbu asbobni Delphi-2009 dan foydalanishni istasangiz, unda Delphi-2009-da Unicode-quvvatlash qo'shilganligini bilishingiz kerak. PWideChar kodiga Char , PChar va string va UnicodeString . Bu duch keladigan mos kelmaslikning sababi, bu qitish orqasidagi DLL hali ham bitta baytli ANSI matnini ishlov berib turadi.

Ehtimol, bu birlik bilan eng mantiqiy yondashuv uni AnsiChar , PAnsiChar va AnsiString dan foydalanish uchun o'zgartirishdir. Buni global qidiruv bilan qilishingiz va qitish almashtirishingiz mumkin.

Bu esa, OpenCV.pas birligidan DLL'leri yana mos keladi. Keling, ushbu OpenCV.pas birligida interfeysi qanday bo'lishidan ehtiyot bo'lishingiz kerak. PAnsiChar parametrlarini oladigan vazifalar maxsus muolajaga muhtoj.

Masalan, quyidagi misolni ko'rib chiqing:

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

Bu asl deklaratsiya. Sizning qidiruvingizdan keyin va uni almashtirgandan keyin shunday o'qiladi:

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

Siz uni chaqirish uchun kelganingizda, to'g'ri PAnsiChar ni uzatishni ta'minlashingiz kerak. Shunga o'xshash:

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

AnsiString uchun string ( UnicodeString -ga tegishli bo'lgan) dan o'zgartirilishi kerak va faqatgina PAnsiChar ga ko'chirishi mumkin. emas PAnsiChar (FileName) yozing. Unicode usulini ANSI ga o'zgartirmaydi va bajarilmaydi.

Yaxshiyamki, siz uchun OpenCV kutubxonasi matn qabul qiluvchi nisbatan kam sonli APIga ega.

7
qo'shib qo'ydi
Rahmat; O'ylaymanki, men sizning yo'riqnomangizdan o'tib ketganman, ammo hali ham xuddi shu muammo, yangi (yangilangan) manba kodini javob bilan biriktirdim.
qo'shib qo'ydi muallif VibeeshanRC, manba
Rahmat, ishlaydi, ko'rsatmalarni to'g'ri bajarmaslik uchun uzr so'raymiz
qo'shib qo'ydi muallif VibeeshanRC, manba
ExtractFilePath Faylni qaytaradi file1: = PAnsiChar (ExtractFilePath ..... UnicodeString uni AnsiString ga o'zgartiradi. Men sizning kodingiz orqali juda ehtiyotkorlik bilan o'qiganingizni tavsiya qilaman.
qo'shib qo'ydi muallif David Heffernan, manba
Hech qisi yo'q; tashvishga o'rin yo'q. Xushbichim ishlab chiqilgan.
qo'shib qo'ydi muallif David Heffernan, manba

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
qo'shib qo'ydi