我對臉部檢測感興趣,我正在嘗試爲我的Delphi應用程序使用OpenCV。我將在稍後使用Google Picasa進行面部識別。我發現4級不同的基本哈爾級聯檢測正面人臉:OpenCV Haar Cascade xml格式
haarcascade_frontalface_default.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt2.xml
haarcascade_frontalface_alt_tree.xml
「默認」 haarcascade給人太多的誤報和不擅長所有,而「ALT」,「ALT2」和'樹'級聯似乎產生相當準確,但有時不同的結果。 '樹'級聯傾向於產生比'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);
如果我嘗試使用「新」格式的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:我使用的是德爾福OpenCV的最新版本的對這個項目detectMultiScale,和一些過時的(但工作)版本的第一個項目,在第一次提到cvHaarDetectObjects發佈(sites.google.com/site/josejp1/index/OCV.ZIP)。
您正在使用哪個版本的Delphi-OpenCV?當前的提交說明顯示了「遷移到版本2.4.8」,這是目前可用的最新版本的OpenCV。所以看來Delphi-OpenCV應該是最新的。您使用的Delphi-OpenCV版本是否也是最新版本? – TLama
如果你想要我的2克拉,delphi封裝的開發人員是生活在一塊岩石下。即使它支持2.4.8,它似乎是建立在c-api基礎之上的,這已經是4年以來沒有更多的維護了,並且將會在*非常不遠的將來被淘汰 – berak
你終於找到了一種使用用Delphi創建新的C++ API(> = XE)? – menjaraz