我正在編輯一個名爲Opencv for Delphi的開源項目,它使用Delphi 6,Delphi 2009和Delphi xe2進行編譯。如何將OpenCV與Unicode版本的Delphi一起使用?
我只是刪除不兼容的(如:Application.MainFormOnTaskbar := True;
)的Delphi編譯6。
在運行時D6應用程序工作正常且沒有錯誤,但調用cvopencv.dll
休息時被編譯良好,但與運行時錯誤。
原來的項目是用Delphi 2007編譯的西班牙項目工作正常。
在d6 exe中,我無法讀取任何東西,除了???????但其他顯示西班牙語,這意味着這是一個UNICODE問題,當調用cvopencv.dll
錯誤發生。
我能做些什麼,使這個項目與2009年或更高版本的Delphi工作(仍然D2009編譯好)
====================== ===大衛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.
謝謝;我認爲我已經通過了你的指導路線,但仍然是同樣的問題,我附上了新的(更新的)源代碼和答案。 – VibeeshanRC
好吧,我可以看到'file1:= PAnsiChar(ExtractFilePath .....「)的代碼,這正是我們所說的不要做的事情,'ExtractFilePath'返回'UnicodeString'將它轉換爲'AnsiString'。你有另一個非常仔細的通讀你的代碼 –
謝謝,它的工作原理,抱歉沒有正確地遵守你的指導 – VibeeshanRC