Fel*_*lus 7 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
Run Code Online (Sandbox Code Playgroud)
"默认"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);
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用'新'格式的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)
Run Code Online (Sandbox Code Playgroud)
我还没有在Delphi中找到任何带有新C++ API的现成示例,所以我将这个detectMultiScale示例(cvHaarDetectObjects的C++版本)转换为Delphi.它会在尝试加载级联时编译但崩溃.我是C++的新手,所以任何帮助都会受到赞赏.
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.
Run Code Online (Sandbox Code Playgroud)
@TLama:我正在使用最新版本的Delphi-OpenCV用于带有detectMultiScale的项目,以及第一个项目中使用cvHaarDetectObjects的第一个项目的一些过时(但工作)版本(sites.google.com/site/josejp1//OCV.ZIP)指数.
如果这些delphi绑定使用的是过时的c-api(cvHaarDetectObjects),则只能使用旧格式。
c ++ api(cv :: CascadeClassifier)同时支持hog和lbp级联。
再次,这是旧的c-api的局限性。如果可以,请避免!
| 归档时间: |
|
| 查看次数: |
3898 次 |
| 最近记录: |