Пример #1
0
bool CFaceDetect::detectByAsm( const Mat &faceImage,vector<CFaceRect> &rclist,bool onlybig )
{
	int foundface = 0;
	float landmarks[2 * stasm_NLANDMARKS]; // x,y coords (note the 2)
	//if(!stasm_init("../model",0))
	//{
	//	return ;
	//}
	Mat_<unsigned char> matimage = faceImage;
	//detect face
	if (!stasm_open_image((const char*)matimage.data, faceImage.cols, faceImage.rows, "image",
				onlybig?0:1 /*multiface*/, 10 /*minwidth*/))
	{
		//cout<<"detect face failed !!"<<stasm_lasterr()<<endl;	
		return false;
	}
	Mat_<unsigned char> outimg(faceImage.clone());
	for(;;)
	{
		CFaceRect facerect;
		//find all the face
		if(!stasm_search_auto(&foundface, landmarks))
		{
			return false;
		}

		if(foundface == 0)
		{
			break;
		}

		facerect.noalign = false;
		//landmarks inner the image
		stasm_force_points_into_image(landmarks, faceImage.cols, faceImage.rows);
		getAsmPointer(landmarks,facerect.rcface);
		//printLandmarks(landmarks);
		//drawLandmarks(outimg, landmarks);
		//markLandmarks(outimg, landmarks);

		facerect.rcfullface = facerect.rcface;
		facerect.rclefteye = Rect((int)landmarks[L_LPupil * 2],(int)landmarks[L_LPupil * 2 + 1],1,1);
		facerect.rcrighteye = Rect((int)landmarks[L_RPupil * 2],(int)landmarks[L_RPupil * 2 + 1],1,1);
		facerect.rcmouth = Rect((int)landmarks[L_CTopOfTopLip * 2],(int)landmarks[L_CTopOfTopLip * 2 + 1],1,1);
		//cout<<"eye "<<facerect.rclefteye.x<<" "<<facerect.rclefteye.y<<" "<<facerect.rcrighteye.x<<" "<<facerect.rcrighteye.y<<" "<<facerect.rcmouth.x<<" "<<facerect.rcmouth.y<<endl;
		outimg(cvRound(landmarks[L_LPupil*2+1]),cvRound(landmarks[2*L_LPupil]))=255;
		outimg(cvRound(landmarks[L_RPupil*2+1]),cvRound(landmarks[2*L_RPupil]))=255;
		outimg(cvRound(landmarks[L_CTopOfTopLip*2+1]),cvRound(landmarks[2*L_CTopOfTopLip]))=255;
		rclist.push_back(facerect);
	}
	return true;
	//imwrite("test_stasm_lib_auto.bmp", outimg);

}
Пример #2
0
int main()
{
    if (!stasm_init("../data", 0 /*trace*/))
        error("stasm_init failed: ", stasm_lasterr());

    static const char* path = "../data/testface.jpg";

    cv::Mat_<unsigned char> img(cv::imread(path, CV_LOAD_IMAGE_GRAYSCALE));

    if (!img.data)
        error("Cannot load", path);

    if (!stasm_open_image((const char*)img.data, img.cols, img.rows, path,
                          1 /*multiface*/, 10 /*minwidth*/))
        error("stasm_open_image failed: ", stasm_lasterr());

    int foundface;
    float landmarks[2 * stasm_NLANDMARKS]; // x,y coords (note the 2)

    int nfaces = 0;
    while (1)
    {
        if (!stasm_search_auto(&foundface, landmarks))
             error("stasm_search_auto failed: ", stasm_lasterr());

        if (!foundface)
            break;      // note break

        // for demonstration, convert from Stasm 77 points to XM2VTS 68 points
        stasm_convert_shape(landmarks, 68);

        // draw the landmarks on the image as white dots
        stasm_force_points_into_image(landmarks, img.cols, img.rows);
        for (int i = 0; i < stasm_NLANDMARKS; i++)
            img(cvRound(landmarks[i*2+1]), cvRound(landmarks[i*2])) = 255;

        nfaces++;
    }
    printf("%s: %d face(s)\n", path, nfaces);
    fflush(stdout);
    cv::imwrite("minimal2.bmp", img);
    cv::imshow("stasm minimal2", img);
    cv::waitKey();

    return 0;
}
Пример #3
0
int main(int argc, char *argv[])
{
    std::string path = "../data/testface.jpg";
    if (argc > 1)
        path = argv[1];

    cv::Mat_<unsigned char> img(cv::imread(path, CV_LOAD_IMAGE_GRAYSCALE));

    if (!img.data)
    {
        printf("Cannot load %s\n", path.c_str());
        exit(1);
    }
    cv::resize(img, img, cv::Size(100, 100));

    int foundface;
    float landmarks[2 * stasm_NLANDMARKS]; // x,y coords (note the 2)

    if (!stasm_search_single(&foundface, landmarks,
                             (const char*)img.data, img.cols, img.rows, path.c_str(), "../data"))
    {
        printf("Error in stasm_search_single: %s\n", stasm_lasterr());
        exit(1);
    }

    if (!foundface)
         printf("No face found in %s\n", path.c_str());
    else
    {
        // draw the landmarks on the image as white dots (image is monochrome)
        stasm_force_points_into_image(landmarks, img.cols, img.rows);
        for (int i = 0; i < stasm_NLANDMARKS; i++)
            img(cvRound(landmarks[i*2+1]), cvRound(landmarks[i*2])) = 255;
    }

    cv::imwrite("minimal.bmp", img);
    cv::imshow("stasm minimal", img);
    cv::waitKey();
    return 0;
}
Пример #4
0
bool face_points(cv::Mat* img,float* landmarks, bool add_boundary_points = true) {
	const char* path = "/data/data/org.stasmdemo.android/app_stasm/testface.jpg";
//	cv::Mat img=cv::imread(imgpath,CV_LOAD_IMAGE_GRAYSCALE);//注意!!这里需要完成img转换
	if(!img->data){
		aprintf("-------stasm -------------  img load fail");
		return false;
	}
	int foundface;
	aprintf("locator face_points landmarks : %i ptr : %i",len(landmarks),landmarks);
	if(!stasm_search_single(&foundface,landmarks,(const char*)img->data,img->cols,img->rows,path,"/data/data/org.stasmdemo.android/app_stasm/")){
		aprintf("--------stasm------------error in stasm search single");
		return false;
	}
	aprintf("locator face_points landmarks : %i ptr : %i",len(landmarks),landmarks);
	if(!foundface){
		aprintf("-------stasm-------------no face found");
	}else{
		stasm_force_points_into_image(landmarks,img->cols,img->rows);
	}
	aprintf("locator face_points landmarks : %i ptr : %i",len(landmarks),landmarks);
	return true;
	}
Пример #5
0
bool CFaceDetect::detectByAsmMarks( const Mat &faceImage,vector<float *> &vlandmarks,bool onlybig )
{
	int foundface = 0;
	Mat_<unsigned char> matimage = faceImage;
	//detect face
	if (!stasm_open_image((const char*)matimage.data, faceImage.cols, faceImage.rows, "image",
				onlybig?0:1 /*multiface*/, 10 /*minwidth*/))
	{
		return false;
	}
	Mat_<unsigned char> outimg(faceImage.clone());
	for(;;)
	{
		CFaceRect facerect;
		float *landmarks = new float[2 * stasm_NLANDMARKS]; // x,y coords (note the 2)
		//find all the face
		if(!stasm_search_auto(&foundface, landmarks))
		{
			return false;
		}

		if(foundface == 0)
		{
			break;
		}

		facerect.noalign = false;
		//landmarks inner the image
		stasm_force_points_into_image(landmarks, faceImage.cols, faceImage.rows);
		//printLandmarks(landmarks);
		//drawLandmarks(outimg, landmarks);
		//markLandmarks(outimg, landmarks);
		//imshow("tmp", outimg);

		vlandmarks.push_back(landmarks);
	}
	return true;
}
Пример #6
0
static PyObject* Py_force_points_into_image(
	PyObject*	self,
	PyObject*	args)
{
	PyObject*	landmarks_obj;
	PyObject*	img_obj;

	if (!PyArg_ParseTuple(args, "OO:force_points_into_image",
				&landmarks_obj, &img_obj))
		return NULL;

	PyArrayObject* landmarks_array = (PyArrayObject*)
		PyArray_FROM_OTF(landmarks_obj, NPY_FLOAT, NPY_ARRAY_IN_ARRAY);
	if (landmarks_array == NULL)
	{
		PyErr_SetString(PyExc_TypeError, landmark_error);
		return NULL;
	}

	if (PyArray_NDIM(landmarks_array) != 2)
	{
		PyErr_SetString(PyExc_TypeError, landmark_dim_error);
		return NULL;
	}

	int width, height;
	if (PyArray_to_image(img_obj, &width, &height) == NULL)
		return NULL;

	PyObject* retArray = PyArray_Copy(landmarks_array);
	Py_DECREF(landmarks_array);
	float* landmarks = (float*)PyArray_DATA((PyArrayObject*)retArray);
	stasm_force_points_into_image(landmarks, width, height);

	return retArray;
}