gpt4 book ai didi

delphi - OpenCV Haar 级联 xml 格式

转载 作者:太空宇宙 更新时间:2023-11-03 20:46:30 26 4
gpt4 key购买 nike

我对人脸检测很感兴趣,我正在尝试将 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' 级联似乎产生了相当准确但有时不同的结果。 “树”级联往往比“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

如果我没记错的话,第二种格式被认为是"new"格式,但我的应用目前只能理解第一种“旧”格式。 "new"级联可能更准确,我想试一试。

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

或者我还能如何在我的应用中使用它们?

这是一些代码(来自 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);

如果我尝试使用"new"格式的 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)到德尔福。它编译但在尝试加载级联时崩溃。我是 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 绑定(bind)使用的是过时的 c-api,(cvHaarDetectObjects) - 您只能使用旧格式。

C++ API ( cv::CascadeClassifier ) 支持两者,以及 hog 和 lbp 级联。

同样,这是旧 c-api 的限制。如果可以,请避免使用它!

关于delphi - OpenCV Haar 级联 xml 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21354668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com