Видеосъемка застряла при отключении IP-камеры - PullRequest
0 голосов
/ 04 июля 2018

я работаю с opencv 2.4.9 mvsc ++ 2012 и Qt, код отлично работает при подключении камеры, но если камера отключается, код застрял в vcap.open (видеостримадрес) вот мой код

const string videoStreamAddress="rtsp://admin:admin@192.168.1.11:88/live/h264/VGA";
VideoCapture  vcap;
Mat image_input;
cameraOpen=true;
//first open the graphic widget to display the camera stream
ui.graphicsView->setEnabled(TRUE);
    while ((vcap.open(videoStreamAddress)==true)&&(cameraOpen==true))
         {
            if(vcap.read(image_input)==false) 
                {
                //QmessageBox 
                QMessageBox msgBox;
                msgBox.setText("probleme de connexion a la caméra");
                msgBox.exec();
                //close_camera_feed();
                break;
                }           
                vcap.set(CV_CAP_PROP_FPS, 1);
                //vcap.read(image_input);
                qimage_input = QImage((const unsigned char*)(image_input.data), 
                                        image_input.cols,image_input.rows, 
                                        QImage::Format_RGB888).rgbSwapped();
                image = QPixmap::fromImage(qimage_input);
                scene = new QGraphicsScene(this);
                scene->addPixmap(image);
                scene->setSceneRect(image.rect());
                ui.graphicsView->setScene(scene);
                //to 
                qApp->processEvents();
                 //thread t1(task1, "Hello");
                detect_license_plate(image_input);
            }

        if(vcap.open(videoStreamAddress)==false)
            {
                QMessageBox msgBox;
                msgBox.setText("La Caméra est déconnecté, vérifier l'uinstallation");
                msgBox.exec();  
            }   

Спасибо за вашу помощь в продвинутом!

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Я решил эту проблему, используя потоки, я проверяю подключение камеры в отдельном потоке и жду некоторое время (2 секунды), если этот поток не завершается и не возвращает никакого значения, это означает, что камера не подключена. есть код

cameraOpen=true; 
//first open the graphic widget to display the camera stream
ui.graphicsView->setEnabled(TRUE);
cameraIsConnected = false ;

while ((check_camera_thread()==true)&&(cameraOpen==true))   
    //while ((vcap.isOpened()==true)&&(cameraOpen==true))
         {
            if(vcap.read(image_input)==false) 
                {
                //QmessageBox 
                QMessageBox msgBox;
                msgBox.setText("probleme de connexion a la caméra");
                msgBox.exec();
                //close_camera_feed();
                break;
                }           
                vcap.set(CV_CAP_PROP_FPS, 1);
                //vcap.read(image_input);
                qimage_input = QImage((const unsigned char*)(image_input.data), 
                                        image_input.cols,image_input.rows, 
                                        QImage::Format_RGB888).rgbSwapped();
                image = QPixmap::fromImage(qimage_input);
                scene = new QGraphicsScene(this);
                scene->addPixmap(image);
                scene->setSceneRect(image.rect());
                ui.graphicsView->setScene(scene);
                //to 
                qApp->processEvents();
                 //thread t1(task1, "Hello");
                detect_license_plate(image_input);
            }

        if(vcap.isOpened()==false)
            {
                QMessageBox msgBox;
                msgBox.setText("La Caméra est déconnecté, vérifier l'uinstallation");
                msgBox.exec();  
            }                       
vcap.release();
close_camera_feed();
 } 
bool check_camera_thread()
 {
   std::thread t0( check_camera);   
   Sleep(2000);
   t0.detach();
   return cameraIsConnected;
  }
bool check_camera()
{
  vcap.open(videoStreamAddress);
  cameraIsConnected= true ;
  return cameraIsConnected;
}
0 голосов
/ 04 июля 2018

Согласно вашему комментарию, используйте следующий шаблон для доступа к вашей камере.

cv::VideoCapture vcap("url");
if(!vcap.isOpened())
{
    std::cout<<"Camera could not be opened"<<std::endl;
    return -1;
}

cv::Mat frame;
bool ret;
while(true) {

    ret = vcap.read(frame);
    if(!ret)
    {
        std::cout<<"Empty frame returned"<<std::endl;
        break;
    }

    /* Process frame here*/


    /* Set loop terminating condition here*/

}

vcap.release();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...