Delphi OpenCV Haar级联xml格式
我对人脸检测感兴趣,我正在尝试将OpenCV用于我的Delphi应用程序。稍后我将使用Google Picasa进行面部识别。我发现了4种用于检测正面人脸的基本haar级联: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给出了太多的误报
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.