Формат XML с использованием OpenCV каскада Хаара

меня интересует распознавание лиц, и я пытаюсь использовать OpenCV для своего приложения Delphi. Я собираюсь использовать Google Picasa для распознавания позже. И я нашел 4 различных основных каскада Хаара для обнаружения фронтальных граней:

haarcascade_frontalface_default.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt2.xml
haarcascade_frontalface_alt_tree.xml

"default" haarcascade дает слишком много ложных срабатываний и совсем не хорош, в то время как каскады "alt", "alt2" и "tree", похоже, дают довольно точные, но иногда разные результаты. Каскад "дерево" имеет тенденцию производить больше ложные негативы, чем " alt " и "alt2", но и наименее ложные положительные.

проблема в том, что есть два разных формата для этих файлов haarcascade xml.

сначала вот так: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, ....cxcoresrccxpersistence.cpp(5061)

Я не нашел готовых к использованию примеров в Delphi с новым API C++, поэтому я преобразовал этот пример detectMultiScale (c++ версия cvHaarDetectObjects) в Дельфы. Он компилируется, но аварийно завершает работу при попытке загрузить каскад. Im новый для C++ так любая помощь будет оценили.

проект Delphi 2010 в zip архиве

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 = 'cascadeshaarcascade_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, упомянутую в первом посте (sites.google.com/site/josejp1/index/OCV.ZIP).

1 ответов


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

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

опять же, это ограничение старого C-api. если можете, избегайте этого !