Каковы рекомендуемые параметры для 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() )
Среди этих параметров вам нужно уделить больше внимания четырем из них:
scaleFactor
— Параметр, указывающий, насколько уменьшается размер изображения при каждом масштабе изображения.
В основном масштабный коэффициент используется для создания вашей масштабной пирамиды. Больше объяснений можно найти Вот. Короче, как описано Вот, Ваша модель имеет фиксированный размер, определенный во время тренировки, который виден на xml
, Это означает, что этот размер лица определяется на изображении, если он присутствует. Однако, изменяя масштаб входного изображения, вы можете изменить размер большего лица на меньшее, что делает его обнаруживаемым алгоритмом.
1.05
является хорошим возможным значением для этого, что означает, что вы используете небольшой шаг для изменения размера, то есть уменьшаете размер на 5%, вы увеличиваете вероятность совпадения размера с найденной моделью для обнаружения. Это также означает, что алгоритм работает медленнее, поскольку он более тщательный. Вы можете увеличить его до 1,4 для более быстрого обнаружения с риском пропустить некоторые лица в целом.
minNeighbors
— Параметр, указывающий, сколько соседей должен иметь каждый прямоугольник-кандидат для его сохранения.
Этот параметр влияет на качество обнаруженных лиц. Чем выше значение, тем меньше обнаружений, но с более высоким качеством. 3~6
это хорошая ценность для этого.
minSize
— Минимально возможный размер объекта. Объекты меньшего размера игнорируются.
Этот параметр определяет, какой маленький размер вы хотите обнаружить. Вы решаете это! Обычно, [30, 30]
хорошее начало для распознавания лиц.
maxSize
— Максимально возможный размер объекта. Объекты большего размера игнорируются.
Этот параметр определяет, какой большой размер вы хотите обнаружить. Опять вы решаете это! Обычно вам не нужно устанавливать его вручную, значение по умолчанию предполагает, что вы хотите обнаружить без верхнего предела размера лица.
Если у вас хорошая производительность процессора и оперативной памяти или больше, вы можете установить
scaleFactor = 1
minNeighbors = 3
если вы работаете во встроенной системе, как в RasPberry, я рекомендую выбрать что-то вроде
scaleFactor = 2, (чем выше значения, тем меньше точность)
minNeighbors = 1, (более высокие значения означают меньшую точность, но большую надежность)
алгоритм будет работать намного быстрее, иначе он зависнет, если производительности процессора и оперативной памяти недостаточно.
Надеюсь, поможет
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);