Rose-Hulman Robotics Team

Changeset 489

Show
Ignore:
Timestamp:
05/14/09 00:13:53 (3 years ago)
Author:
mosttw
Message:

Added support for video capture and releasing the GIL

Location:
trunk/software/rb/vision
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/software/rb/vision/__init__.py

    r485 r489  
    99                self.controller = controller 
    1010                _vision._init_classifier() 
     11                _vision._init_capture() 
    1112                start_new_thread(self._main, ()) 
    1213 
    1314        def _main(self): 
    1415                sleep(2) 
    15                 while (self.running == True): 
     16                while self.running: 
    1617                        print "getting points" 
    1718                        data = _vision._get_points() 
  • trunk/software/rb/vision/_vision.c

    r488 r489  
    2525 
    2626#include <opencv/cv.h> 
     27#include <opencv/highgui.h> 
    2728 
    2829#include "vision.h" 
     
    3132static PyTypeObject *PyGObject_Type=NULL;     
    3233classifier_t *classifier = NULL; 
     34CvCapture *cam = NULL; 
    3335 
    3436void free_pixbuf_data(guchar *pixels, gpointer _ipl_image) 
     
    7880 
    7981static PyObject* 
     82_init_capture(PyObject *self, PyObject *args) 
     83{ 
     84  if (!PyArg_ParseTuple(args, "")) { 
     85    return NULL; 
     86  } 
     87  printf("Initializing capture\n"); 
     88  cam = cvCreateCameraCapture(0); 
     89  if (cam == NULL) { 
     90    return PyErr_SetFromErrno(PyExc_IOError); 
     91  } 
     92  return Py_None; 
     93} 
     94 
     95IplImage *capture() 
     96{ 
     97  cvGrabFrame(cam); 
     98  return cvRetrieveFrame(cam); 
     99} 
     100 
     101static PyObject* 
    80102_get_points(PyObject *self, PyObject *args) 
    81103{ 
    82104        if (classifier == NULL) { 
    83                 printf("Error: you must call _init_classifier first\n"); 
     105                PyErr_SetString(PyExc_RuntimeError, "_init_classifier must be called first"); 
     106                return NULL; 
     107        } else if (cam == NULL) { 
     108                PyErr_SetString(PyExc_RuntimeError, "_init_capture must be called first"); 
    84109                return NULL; 
    85110        } 
     
    89114        PyObject *points = PyList_New(0); 
    90115 
    91         IplImage *input       = get_image(); 
    92         IplImage *transformed = transform_image(input, 0.25); 
    93         CvMat    *classes     = classifier_predict(classifier, transformed); 
    94         CvSeq    *seq         = get_points(classes); 
     116        IplImage *input; 
     117        IplImage *transformed; 
     118        CvMat    *classes; 
     119        CvSeq    *seq; 
     120         
     121        // Release the global interpreter lock.  No messing with Python objects without it, though! 
     122        // This creates a new block, so we need to declare variables above to access them after we 
     123        // reacquire the GIL. 
     124        Py_BEGIN_ALLOW_THREADS 
    95125 
     126        input       = capture(); 
     127        transformed = transform_image(input, 0.25); 
     128        classes     = classifier_predict(classifier, transformed); 
     129        seq         = get_points(classes); 
     130         
     131        Py_END_ALLOW_THREADS 
     132         
    96133        CvSeqReader reader; 
    97134        cvStartReadSeq(seq, &reader, 0); 
     
    110147 
    111148        cvReleaseMemStorage(&seq->storage); 
    112         cvReleaseImage(&input); 
     149        //cvReleaseImage(&input); // Don't free captured images 
    113150        cvReleaseImage(&transformed); 
    114151        cvReleaseMat(&classes); 
     
    125162        {"_init_classifier", _init_classifier, METH_VARARGS, 
    126163         "Initialize the classifier using predefined training images"}, 
     164    {"_init_capture", _init_capture, METH_VARARGS, 
     165     "Initialize the camera capture device"}, 
    127166        {NULL, NULL, 0, NULL} // sentinel 
    128167}; 
  • trunk/software/rb/vision/vision.c

    r488 r489  
    6969} 
    7070 
    71 int [3]point_to_ 
     71//int [3]point_to_ 
    7272 
    7373CvSeq *get_points(CvMat *classes)