5

Меня интересует обнаружение лиц, и я пытаюсь использовать 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).

+0

Какую версию Delphi-OpenCV вы используете? В текущих заметках фиксации отображается «Переход к версии 2.4.8», который является самой последней версией OpenCV, доступной в настоящее время. Таким образом, похоже, что Delphi-OpenCV должен быть обновлен. Является ли версия Delphi-OpenCV, которую вы используете, также актуальна? – TLama

+1

Если вы хотите, чтобы мой 2 ct, разработчик delphi-обертки живет под скалой. даже если он поддерживает 2.4.8, он, похоже, основывается на c-api, который больше не поддерживается с 4 лет и будет постепенно прекращен в ближайшее время. * – berak

+0

Вы наконец нашли способ, используя новый C++ API с Delphi (> = XE)? – menjaraz

ответ

4

Если эти привязки delphi используют устаревший c-api (cvHaarDetectObjects), вы можете использовать только старый формат.

C++ api (cv :: CascadeClassifier) ​​поддерживает оба, а также каскады hog и lbp.

еще раз, это ограничение старого c-api. если можно, избегайте этого!

Смежные вопросы