/CV_web/cv/native_modules/facerecognition.c

https://github.com/raphaelcruzeiro/Face-Detector · C · 95 lines · 67 code · 26 blank · 2 comment · 6 complexity · 55a59b068130315e3fabf19cbc0f1fe9 MD5 · raw file

  1. #include <Python.h>
  2. #include <opencv/cv.h>
  3. #include <opencv2/highgui/highgui_c.h>
  4. static PyObject *FaceError;
  5. CvHaarClassifierCascade *cascade;
  6. CvMemStorage *storage;
  7. PyObject *detectFaces(IplImage *img)
  8. {
  9. int i;
  10. /* Detect all faces on the frame */
  11. CvSeq *faces = cvHaarDetectObjects(
  12. img,
  13. cascade,
  14. storage,
  15. 1.1,
  16. 3, 0,
  17. cvSize(50, 50),
  18. cvSize(50, 50)
  19. );
  20. PyObject *result = PyList_New(0);
  21. /* Now, let's mark each face */
  22. for(i = 0 ; i < (faces ? faces->total : 0) ; i++) {
  23. CvRect *r = (CvRect*)cvGetSeqElem(faces, i);
  24. PyObject *origin = Py_BuildValue("{sisi}", "x", r->x, "y", r->y);
  25. PyObject *size = Py_BuildValue("{sisi}", "width", r->width, "height", r->height);
  26. PyObject *rect = Py_BuildValue("{sOsO}", "origin", origin, "size", size);
  27. PyList_Append(result, rect);
  28. }
  29. return result;
  30. }
  31. static PyObject *
  32. face_detect(PyObject *self, PyObject *args)
  33. {
  34. const char *path;
  35. int sts;
  36. if (!PyArg_ParseTuple(args, "s", &path))
  37. return NULL;
  38. IplImage* frame;
  39. char *file = "/usr/local/share/opencv/"
  40. "/haarcascades/haarcascade_frontalface_alt.xml";
  41. cascade = (CvHaarClassifierCascade*)cvLoad(file, 0, 0, 0);
  42. storage = cvCreateMemStorage(0);
  43. IplImage* image = cvLoadImage(path, CV_LOAD_IMAGE_COLOR);
  44. if(image == NULL) {
  45. PyErr_SetString(FaceError, "Image not found!");
  46. return NULL;
  47. }
  48. PyObject *result = detectFaces(image);
  49. cvReleaseHaarClassifierCascade(&cascade);
  50. cvReleaseMemStorage(&storage);
  51. cvReleaseImage(&image);
  52. return result;
  53. }
  54. static PyMethodDef FaceMethods[] = {
  55. {"detect", face_detect, METH_VARARGS,
  56. "Detect the faces on an image."},
  57. {NULL, NULL, 0, NULL} /* Sentinel */
  58. };
  59. PyMODINIT_FUNC
  60. initface(void)
  61. {
  62. PyObject *m;
  63. m = Py_InitModule("face", FaceMethods);
  64. if (m == NULL)
  65. return;
  66. FaceError = PyErr_NewException("face.error", NULL, NULL);
  67. Py_INCREF(FaceError);
  68. PyModule_AddObject(m, "error", FaceError);
  69. }