Библиотека OpenCV, на которую вы ссылаетесь, говорит в верхней части заголовка:
Borland Delphi 4,5,6,7 API для Intel Open Source Computer Vision Library
Этот код представляет оболочку Delphi для библиотек DLL OpenCV.
Для этих более старых версий Delphi Char
, PChar
и string
отображаются на AnsiChar
, PAnsiChar
и AnsiString
соответственно.Это соответствует библиотекам OpenCV, которые являются чистыми ANSI.В OpenCV нет API-интерфейсов Unicode (по крайней мере, насколько я могу заметить).
Если вы хотите использовать этот модуль с Delphi 2009 и выше, вам необходимо признать, что в Delphi 2009 была добавлена поддержка Unicode.Это изменило отображение Char
, PChar
и string
map на WideChar
, PWideChar
и UnicodeString
соответственно.Это является причиной несовместимости, с которой вы столкнулись, потому что DLL-библиотека позади этого устройства все еще обрабатывает однобайтовый текст 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, которые получают текст.