delphi – OpenCV Haar Cascade xml格式
我对面部检测很感兴趣,我正在尝试将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的限制.如果可以的话,避免它! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |