X-Git-Url: https://git.ucc.asn.au/?p=matches%2FMCTX3420.git;a=blobdiff_plain;f=server%2Fimage.c;h=164dc0944cc9570e66dd4ffde96178c7e90322f0;hp=3c3046727a300ffc5b650f1565d7bef0f0d0fe3a;hb=f316d3b0234badc48d97ef3fcc607f7eddcb9a62;hpb=69d9f5d6774384f76c75248907304b0fbd66bbd1 diff --git a/server/image.c b/server/image.c index 3c30467..164dc09 100644 --- a/server/image.c +++ b/server/image.c @@ -6,6 +6,7 @@ #include CvCapture *capture; +IplImage *frame; int captureID = -1; void Image_Handler(FCGIContext * context, char * params) @@ -31,7 +32,7 @@ void Image_Handler(FCGIContext * context, char * params) CvMat * g_src = NULL; // Source Image CvMat * g_encoded; // Encoded Image - Camera_GetImage( num, width, height ,g_src); + result = Camera_GetImage( num, width, height ,g_src); g_encoded = cvEncodeImage("test_encode.jpg",g_src,0); Log(LOGNOTE, "Sending image!"); @@ -43,19 +44,29 @@ void Image_Handler(FCGIContext * context, char * params) cvReleaseMat(&g_encoded); cvReleaseMat(&g_src); } - + bool Camera_GetImage(int num, int width, int height, CvMat * image) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // Need to use a mutex to ensure 2 captures are not open at once pthread_mutex_lock(&mutex); bool result = false; - capture = cvCreateCameraCapture(num); + if( capture == NULL) + { + capture = cvCreateCameraCapture(num); + captureID = num; + } + else if( num != captureID) + { + cvReleaseCapture(&capture); + capture = cvCreateCameraCapture(num); + captureID = num; + } cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height); - IplImage * frame = cvQueryFrame(capture); + frame = cvQueryFrame(capture); if( frame == NULL) return result; @@ -65,11 +76,14 @@ void Image_Handler(FCGIContext * context, char * params) if( image == NULL) return result; + pthread_mutex_unlock(&mutex); //Close the mutex + return true; +} + +void Image_Cleanup() +{ // Release the capture and IplImage pointers cvReleaseImageHeader(&frame); cvReleaseCapture(&capture); - - pthread_mutex_unlock(&mutex); //Close the mutex - return true; }