CascadeClassifier::detectMultiScale()
的推荐参数是什么?取决于我应该更改默认参数的因素?
void CascadeClassifier::detectMultiScale(
const Mat& image,
vector<Rect>& objects,
double scaleFactor=1.1,
int minNeighbors=3,
int flags=0,
Size minSize=Size(),
Size maxSize=Size() )
答案 0 :(得分:126)
在这些参数中,您需要更加关注其中的四个:
scaleFactor
- 参数指定每个图像比例下图像尺寸减少的程度。
基本上,比例因子用于创建比例金字塔。可以找到更多解释here。简而言之,正如here所述,您的模型在训练期间定义了固定大小,在xml
中可见。这意味着如果存在,则在图像中检测到这种尺寸的面部。但是,通过重新缩放输入图像,您可以将较大的面调整为较小的面,使其可被算法检测到。
1.05
是一个很好的可能值,这意味着您只需要一小步调整大小,即将大小缩小5%,就可以增加匹配大小的机会找到检测模型。这也意味着算法运行得更慢,因为它更彻底。为了加快检测速度,您可以将其增加到1.4,并且可能会完全丢失一些面孔。
minNeighbors
- 参数指定每个候选矩形应保留多少个邻居。
此参数将影响检测到的面部的质量。值越高,检测越少,但质量越高。 3~6
是一个很好的价值。
minSize
- 最小可能的对象大小。小于的对象将被忽略。
此参数确定您要检测的小尺寸。你决定了!通常, [30, 30]
是人脸检测的良好开端。
maxSize
- 最大可能的对象大小。大于此值的对象将被忽略。
此参数确定您要检测的大小。再一次,你决定了! 通常情况下,您不需要手动设置,默认值假定您要检测没有脸部大小的上限。
答案 1 :(得分:-4)
如果您具有良好的CPU和RAM性能或更高,则可以进行设置 比例因子= 1 minNeighbors = 3
如果您正在像树莓这样的嵌入式系统中工作,我建议选择像smth一样 scaleFactor = 2,(值越高意味着精度越低) minNeighbors = 1,(值越高意味着精度越低但可靠性越高) 算法将运行得更快,否则如果CPU性能和RAM不够,它将会冻结。
希望有所帮助
答案 2 :(得分:-4)
cl_int err;
cl_uint numPlatforms;
err = clGetPlatformIDs(0, NULL, &numPlatforms);
if (CL_SUCCESS == err)
printf("\nDetected OpenCL platforms: %d", numPlatforms);
else
printf("\nError calling clGetPlatformIDs. Error code: %d", err);
string str ="haarcascade_frontalface_alt2.xml";
ocl::OclCascadeClassifier fd;
fd.load(str);
ocl::oclMat frame, frameGray;
Mat frameCpu;
CvVideoCapture vcap = openVideo("0");
vcap.set(CV_CAP_PROP_FRAME_WIDTH,320);
vcap.set(CV_CAP_PROP_FRAME_HEIGHT,240);
static const cv::Size maxSize;
for(;;){
// // processing loop
vector<Rect> faces;
vcap >> frameCpu;
frame = frameCpu;
ocl::cvtColor(frame, frameGray, CV_BGR2GRAY);
//ocl::equalizeHist(frameGray, frameGray);
//Mat mm(frameGray);
//cvWaitKey(100);
fd.detectMultiScale(frameGray,faces,1.05,3,0|CV_HAAR_FIND_BIGGEST_OBJECT ,minSize,maxSize);
for(int i=0; i< faces.size() ; i++)
{
if(faces.size())
//circle(img, Point(palm[i].x+ palm[i].width/2,palm[i].y+palm[i].height/2),palm[i].width,Scalar(255,0,0), 2,8 );
cv::rectangle(frameCpu, faces[i],Scalar(255,0,0), 2,8 );
}
imshow("fsfs",frameCpu);
cvWaitKey(1);