加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – OpenCV Haar Cascade xml格式

发布时间:2020-12-15 09:52:05 所属栏目:大数据 来源:网络整理
导读:我对面部检测很感兴趣,我正在尝试将OpenCV用于我的Delphi应用程序.我稍后将使用Google Picasa进行面部识别.我发现了4种不同的基本haar级联用于检测正面: haarcascade_frontalface_default.xmlhaarcascade_frontalface_alt.xmlhaarcascade_frontalface_alt2.
我对面部检测很感兴趣,我正在尝试将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’级联似乎产生了相当准确但有时不同的结果. ‘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);
storage := cvCreateMemStorage(0);

s.width := 40;
s.height := 40;
faces := cvHaarDetectObjects(PCvArr(img),cascade_f,storage,1.1,3,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中找到任何带有新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 = '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,255);
   mycolors[1] := CvScalar(0,128,255);
   mycolors[2] := CvScalar(0,255,255);
   mycolors[3] := CvScalar(0,0);
   mycolors[4] := CvScalar(255,0);
   mycolors[5] := CvScalar(255,0);
   mycolors[6] := CvScalar(255,0);
   mycolors[7] := CvScalar(255,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,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,255));
    end;

   cvNamedWindow('Output');
   cvShowImage('Output',grayImage);

   cvReleaseImage(grayImage);
   cvReleaseImage(img);

end;

end.

@TLama:我正在使用最新版本的Delphi-OpenCV用于带有detectMultiScale的项目,以及第一个项目中使用cvHaarDetectObjects的第一个项目的一些过时(但工作)版本(sites.google.com/site/josejp1/ / OCV.ZIP)指数.

解决方法

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

c api(cv :: CascadeClassifier)支持这两种,以及hog和lbp级联.

再次,它是旧c-api的限制.如果可以的话,避免它!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读