【问题标题】:OpenCV Haar Cascade xml formatOpenCV Haar Cascade xml 格式
【发布时间】:2014-02-16 17:53:35
【问题描述】:

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

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

'default' haarcascade 给出了太多的误报并且一点都不好,而 'alt'、'alt2' 和 'tree' 级联似乎产生了相当准确但有时不同的结果。 '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, ..\..\cxcore\src\cxpersistence.cpp(5061)

我没有在 Delphi 中找到任何带有新 C++ API 的现成示例,因此我已将 this example of detectMultiScale (a C++ version of cvHaarDetectObjects) 转换为 Delphi。它编译但在尝试加载级联时崩溃。我是 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 版本(sites.google.com/site /josejp1/index/OCV.ZIP)。

【问题讨论】:

  • 您使用的是哪个版本的 Delphi-OpenCV?当前的提交说明显示“迁移到版本 2.4.8”,这是目前可用的 OpenCV 的最新版本。所以看起来 Delphi-OpenCV 应该是最新的。您使用的 Delphi-OpenCV 版本是否也是最新的?
  • 如果你想要我的 2 ct,delphi 包装器的开发者生活在一块岩石之下。即使它支持 2.4.8,它似乎也是基于 c-api 构建的,已经 4 年不再维护,并且将在 非常 不久的将来逐步淘汰
  • 您终于找到了将新的 C++ API 与 Delphi (>= XE) 结合使用的方法吗?
  • 如果您可以对 OpenCV 的源代码进行一些更改并重建 dll。您可以将 C++ API 与 delphi 一起使用。我会尽快展示。

标签: delphi opencv image-processing computer-vision face-detection


【解决方案1】:

如果那些 delphi 绑定使用过时的 c-api,(cvHaarDetectObjects) - 你只能使用旧格式。

c++ api ( cv::CascadeClassifier ) 支持 hog 和 lbp 级联。

再次,这是旧 c-api 的限制。如果可以,请避免!

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2017-01-19
    • 2011-01-01
    • 2017-12-02
    • 2017-11-24
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多