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); }
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; }
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; }
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; }
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; }
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; }