Delphi OpenCV Haar级联xml格式

Delphi OpenCV Haar级联xml格式,delphi,opencv,image-processing,computer-vision,face-detection,Delphi,Opencv,Image Processing,Computer Vision,Face Detection,我对人脸检测感兴趣,我正在尝试将OpenCV用于我的Delphi应用程序。稍后我将使用Google Picasa进行面部识别。我发现了4种用于检测正面人脸的基本haar级联: haarcascade_frontalface_default.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt2.xml haarcascade_frontalface_alt_tree.xml “默认”haarcascade给出了太多的误报

我对人脸检测感兴趣,我正在尝试将OpenCV用于我的Delphi应用程序。稍后我将使用Google Picasa进行面部识别。我发现了4种用于检测正面人脸的基本haar级联:

haarcascade_frontalface_default.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt2.xml
haarcascade_frontalface_alt_tree.xml
“默认”haarcascade给出了太多的误报,一点也不好,而“alt”、“alt2”和“tree”级联似乎产生了相当准确的结果,但有时会有所不同。“树”级联往往比“alt”和“alt2”级联产生更多的误报,但误报也最少

问题是这些haarcascade xml文件有两种不同的格式。

首先是这样的:

第二个是这样的:

如果我没有弄错的话,第二种被认为是“新”格式,但我的应用程序目前只理解第一种“旧”格式。“新”级联可能更精确,我想尝试一下

有没有办法将新格式的级联转换为旧格式?

或者我如何在我的应用程序中使用它们?

下面是一些代码(来自sites.google.com/site/josejp1/index/OCV.ZIP):

如果我尝试使用“新”格式的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中没有找到任何可用的新的C++应用程序,所以我已经转换成Delphi。它可以编译,但在尝试加载级联时崩溃。我是新的C++,所以任何帮助都会被赏识。

单元1;
接口
使用
窗户,
信息,
SysUtils,
变体,
班级,
绘图,
控制,
形式,
对话,
StdCtrls,
ExtCtrls,
DateUtils,
ExtDlgs,
highgui_c,
核心(c),,
Core.types_c,
imgproc\U c,
imgproc.types\u c,
目标检测;
类型
TForm1=类(TForm)
图1:TImage;
按钮2:t按钮;
标签1:TLabel;
备忘录1:TMemo;
程序按钮2点击(发送者:对象);
私有的
{私有声明}
公众的
{公开声明}
结束;
变量
表1:TForm1;
mystorage:pCvMemStorage=nil;
mycascade:pcvhaar=nil;
mycascade_name:ansisting='cascades\haarcascade_frontalface_alt.xml';
实施
{$R*.dfm}
程序TForm1.按钮2单击(发送方:TObject);
变量img,灰度图像:PIplImage;
肌对象:跗骨;
myscale:double;
i:整数;
r:pCvRect;
mycolors:TCvScalar的数组[0..7];
MyCascade分类器:TCASCA解密器;
开始
mycolors[0]:=CvScalar(0,0255);
mycolors[1]:=CvScalar(0128255);
mycolors[2]:=CvScalar(0255255);
mycolors[3]:=CvScalar(0255,0);
mycolors[4]:=CvScalar(255128,0);
mycolors[5]:=CvScalar(255255,0);
mycolors[6]:=CvScalar(255,0,0);
mycolors[7]:=CvScalar(255,0255);
img:=cvLoadImage('lena.jpg');
灰度图像:=cvCreateImage(cvGetSize(img),8,1);
CVT颜色(img、灰度图像、CV_BGR2GRAY);
cvShowImage(“灰色”,灰度图像);
mystorage:=cvCreateMemStorage(0);
备注1.行。添加(“内存分配”);
mycascade:=cvLoad('cascade.xml');
myscale:=1.3;
cvClearMemStorage(mystorage);
对象:=零;
myCascadeClassifier.detectMultiScale(灰度图像,MyObject,1.1,3,CV_HAAR_SCALE_图像或CV_HAAR_DO_CANNY_修剪,cvSize(0,0),cvSize(40,40));
备注1.Lines.Add('objectsize:'+IntToStr(长度(myobjects)));
对于i:=0到(长度(MyObject)-1)do
开始
cvRectangle(灰度图像,cvPoint(r.x,r.y),cvPoint(r.x+r.width,r.y+r.height),CvScalar(0,0255));
结束;
cvNamedWindow(“输出”);
cvShowImage(“输出”,灰度图像);
cvReleaseImage(灰度图像);
cvReleaseImage(img);
结束;
结束。

@特拉玛:我正在使用Delphi OpenCV的最新版本来完成这个带有detectMultiScale的项目,在第一篇文章(sites.google.com/site/josejp1/index/OCV.ZIP)中提到的带有CvHaardeTecObjects的第一个项目中使用了一些过时(但仍在运行)的版本。

如果那些Delphi绑定使用的是过时的c-api,(CvHaardeTecObjects)-您只能使用旧格式

C++ API(CV:CasCADECLIX)支持HOG和LBP级联,


同样,这是旧c-api的一个限制。如果可以,避免它

您使用的是哪个版本的Delphi OpenCV?当前的提交说明显示“迁移到2.4.8版”,这是目前可用的OpenCV的最新版本。因此,DelphiOpenCV似乎应该是最新的。您正在使用的DelphiOpenCV版本也是最新的吗?如果您想要我的2 ct,Delphi包装器的开发人员正处于困境之中。即使它支持2.4.8,它似乎是建立在C-API上的,它已经不被维护4年了,而且将在非常接近的将来逐步淘汰。您最终找到了一种使用Delphi(>=Xe)的新C++ API的方法吗?如果您可以对OpenCV的源代码做一些更改并重建DLL。你可以用Delphi使用C++ API。我会很快表现出来的。
OpenCV GUI Error Handler
---------------------------
Unspecified error (The node does not represent a user object (unknown type?))
in function cvRead, ..\..\cxcore\src\cxpersistence.cpp(5061)
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.