Exemplo n.º 1
0
int faceDetect_GPU(Mat &image, vector<Mat> &faces, int init)
{
	static CascadeClassifier_GPU cascade_gpu;
	static HANDLE init_mutex;

	if(init == 1)
	{
		init_mutex = CreateMutex(NULL, FALSE, NULL);
		cascade_gpu.load(string(CASCADE_PATH));
		return 0;
	}

	Mat gray;
	cvtColor(image, gray, CV_BGR2GRAY);
	equalizeHist(gray, gray);

	GpuMat image_gpu(gray);
	GpuMat objbuf;
	
	WaitForSingleObject(init_mutex, INFINITE);

	double start  = GetTickCount();
	int detections_number = cascade_gpu.detectMultiScale(image_gpu, objbuf, 1.1, 3);
	cout << "Face Detect GPU Time : " << GetTickCount()-start << "ms" << endl;

	ReleaseMutex(init_mutex);

	Mat obj_host;
	objbuf.colRange(0, detections_number).download(obj_host);
	Rect* det_faces = obj_host.ptr<Rect>();
	for(int i = 0; i < detections_number; ++i)
	{
		Mat face = gray(det_faces[i]);
		faces.push_back(face); 
	}
	return 0;
}