Меня интересует обнаружение лиц, и я пытаюсь использовать OpenCV для своего приложения Delphi. Позднее я буду использовать Google Picasa для распознавания лиц. И я нашел 4 различных основные Хаар каскадов для обнаружения лобных лиц:OpenCV Haar Cascade xml format
haarcascade_frontalface_default.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt2.xml
haarcascade_frontalface_alt_tree.xml
haarcascade «по умолчанию» дает слишком много ложных срабатываний и не годится, в то время как «альт», «Alt2» и ' каскады деревьев, похоже, дают довольно точные, но иногда разные результаты. Каскад «дерева» имеет тенденцию создавать больше ложных негативов, чем «alt» и «alt2», но и наименее ложные срабатывания.
Проблема в том, что есть два разных формата для этих XML-файлов haarcascade.
Во-первых, как это: https://github.com/Danukeru/FOUCAM/blob/master/haarcascade_frontalface.xml
И второй, как это: https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml
Если я не ошибаюсь, второй один считается «новый» формат, но мое приложение в настоящее время понимает только первый «старый» формат. «Новые» каскады, вероятно, могут быть более точными, и я бы хотел попробовать.
Есть ли способ конвертировать каскады нового формата в старый формат?
Или как еще я могу использовать их в своем приложении?
Вот некоторый код (от sites.google.com/site/josejp1/index/OCV.ZIP):
f1 := 'haarcascade_frontalface_alt.xml';
file1 := PChar(f1);
cascade_f := cvLoad(file1,0,0,0);
storage := cvCreateMemStorage(0);
s.width := 40;
s.height := 40;
faces := cvHaarDetectObjects(PCvArr(img), cascade_f, storage, 1.1, 3, 0, s);
И если я пытаюсь использовать «новый» формат XML каскадный файл я получаю ошибка:
OpenCV GUI Error Handler
---------------------------
Unspecified error (The node does not represent a user object (unknown type?))
in function cvRead, ..\..\cxcore\src\cxpersistence.cpp(5061)
я не нашел каких-либо готовых к использованию примеров в Delphi с API новой C++, поэтому я преобразованного this example of detectMultiScale (a C++ version of cvHaarDetectObjects) в Delphi. Он компилируется, но сбой при попытке загрузить каскад. Im новый для C++, поэтому любая помощь будет оценена.
Delphi 2010 project in zip archive
unit Unit1;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
ExtCtrls,
DateUtils,
ExtDlgs,
highgui_c,
core_c,
Core.types_c,
imgproc_c,
imgproc.types_c,
objdetect;
type
TForm1 = class(TForm)
Image1: TImage;
Button2: TButton;
Label1: TLabel;
Memo1: TMemo;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
mystorage: pCvMemStorage = nil;
mycascade : pCvHaarClassifierCascade = nil;
mycascade_name: AnsiString = 'cascades\haarcascade_frontalface_alt.xml';
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var img, grayImage : PIplImage;
myobjects : TArray<TCvRect>;
myscale : double;
i: integer;
r: pCvRect;
mycolors : array[0..7] of TCvScalar;
myCascadeClassifier : TCascadeClassifier;
begin
mycolors[0] := CvScalar(0,0,255);
mycolors[1] := CvScalar(0,128,255);
mycolors[2] := CvScalar(0,255,255);
mycolors[3] := CvScalar(0,255,0);
mycolors[4] := CvScalar(255,128,0);
mycolors[5] := CvScalar(255,255,0);
mycolors[6] := CvScalar(255,0,0);
mycolors[7] := CvScalar(255,0,255);
img := cvLoadImage('lena.jpg');
grayImage := cvCreateImage(cvGetSize(img),8,1);
cvCvtColor(img,grayImage,CV_BGR2GRAY);
cvShowImage('gray', grayImage);
mystorage := cvCreateMemStorage(0);
Memo1.Lines.Add('Memory allocated');
mycascade := cvLoad('cascade.xml');
myscale := 1.3;
cvClearMemStorage(mystorage);
myobjects := nil;
myCascadeClassifier.detectMultiScale(grayImage,myobjects,1.1,3,CV_HAAR_SCALE_IMAGE or CV_HAAR_DO_CANNY_PRUNING,cvSize(0,0),cvSize(40,40));
Memo1.Lines.Add('Object size? : ' + IntToStr(Length(myobjects)));
for i := 0 to (Length(myobjects)-1) do
begin
cvRectangle(grayImage,cvPoint(r.x,r.y),cvPoint(r.x+r.width,r.y+r.height),CvScalar(0,0,255));
end;
cvNamedWindow('Output');
cvShowImage('Output', grayImage);
cvReleaseImage(grayImage);
cvReleaseImage(img);
end;
end.
@TLama: Я использую последнюю версию Delphi-OpenCV для этого проекта с detectMultiScale, и некоторые устаревшие (но работает) версия для первого проекта с cvHaarDetectObjects упомянутых в первом post (sites.google.com/site/josejp1/index/OCV.ZIP).
Какую версию Delphi-OpenCV вы используете? В текущих заметках фиксации отображается «Переход к версии 2.4.8», который является самой последней версией OpenCV, доступной в настоящее время. Таким образом, похоже, что Delphi-OpenCV должен быть обновлен. Является ли версия Delphi-OpenCV, которую вы используете, также актуальна? – TLama
Если вы хотите, чтобы мой 2 ct, разработчик delphi-обертки живет под скалой. даже если он поддерживает 2.4.8, он, похоже, основывается на c-api, который больше не поддерживается с 4 лет и будет постепенно прекращен в ближайшее время. * – berak
Вы наконец нашли способ, используя новый C++ API с Delphi (> = XE)? – menjaraz