From 101de2b07aa2feefa74f7e73876fd5cc8fc696cf Mon Sep 17 00:00:00 2001
From: AlexeyAB <alexeyab84@gmail.com>
Date: Tue, 20 Mar 2018 21:40:01 +0000
Subject: [PATCH] More stable web-cam

---
 src/demo.c          |    6 ++++--
 src/http_stream.cpp |   28 ++++++++++++++++++++++------
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/src/demo.c b/src/demo.c
index 59672f8..b5917fa 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -64,6 +64,7 @@
 	in = get_image_from_stream_resize(cap, net.w, net.h, &in_img, use_webcam);
     if(!in.data){
         //error("Stream closed.");
+		printf("Stream closed.\n");
 		flag_exit = 1;
 		return;
     }
@@ -166,6 +167,8 @@
     probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *));
     for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes, sizeof(float *));
 
+	flag_exit = 0;
+
     pthread_t fetch_thread;
     pthread_t detect_thread;
 
@@ -198,7 +201,7 @@
     }
 
 	CvVideoWriter* output_video_writer = NULL;    // cv::VideoWriter output_video;
-	if (out_filename)
+	if (out_filename && !flag_exit)
 	{
 		CvSize size;
 		size.width = det_img->width, size.height = det_img->height;
@@ -212,7 +215,6 @@
 		//output_video_writer = cvCreateVideoWriter(out_filename, CV_FOURCC('X', 'V', 'I', 'D'), 25, size, 1);
 		//output_video_writer = cvCreateVideoWriter(out_filename, CV_FOURCC('W', 'M', 'V', '2'), 25, size, 1);
 	}
-	flag_exit = 0;
 
     double before = get_wall_time();
 
diff --git a/src/http_stream.cpp b/src/http_stream.cpp
index d42ecff..ca57728 100644
--- a/src/http_stream.cpp
+++ b/src/http_stream.cpp
@@ -197,16 +197,32 @@
 
 
 CvCapture* get_capture_webcam(int index) {
-	CvCapture* cap = (CvCapture*)new cv::VideoCapture(index);
+	CvCapture* cap = NULL;
+	try {
+		cap = (CvCapture*)new cv::VideoCapture(index);
+		//((cv::VideoCapture*)cap)->set(CV_CAP_PROP_FRAME_WIDTH, 1280);
+		//((cv::VideoCapture*)cap)->set(CV_CAP_PROP_FRAME_HEIGHT, 960);
+	}
+	catch (...) {
+		std::cout << " Error: Web-camera " << index << " can't be opened! \n";
+	}
 	return cap;
 }
 
 IplImage* get_webcam_frame(CvCapture *cap) {
-	cv::VideoCapture &cpp_cap = *(cv::VideoCapture *)cap;
-	cv::Mat frame;
-	cpp_cap >> frame;
-	IplImage* src = cvCreateImage(cvSize(frame.cols, frame.rows), 8, frame.channels());
-	*src = frame;
+	IplImage* src = NULL;
+	try {
+		cv::VideoCapture &cpp_cap = *(cv::VideoCapture *)cap;
+		cv::Mat frame;
+		if (cpp_cap.isOpened()) {
+			cpp_cap >> frame;
+			src = cvCreateImage(cvSize(frame.cols, frame.rows), 8, frame.channels());
+			*src = frame;
+		}
+	}
+	catch (...) {
+		std::cout << " Web-camera stoped! \n";
+	}
 	return src;
 }
 

--
Gitblit v1.10.0