c++qtopencvvideo-streamingrtsp

Videocapture stuck when IP camera is disconnected


i am working with opencv 2.4.9 mvsc++2012 and Qt, the code works perfectly when the camera is connected but if the camera gets disconnected the code stuck at vcap.open(videostreamadress) here is my code

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();  
            }   

Solution

  • The way I solved this problem is by using threads; I check the camera connection in a separate thread and wait for a period of time (2 seconds). If that thread did not finish and did not return any value it means that the camera is not connected.

    Here is the code:

    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;
    }