title: OpenCV's VideoCapture::open Video Source Dialog
body: <p>In my current project, when I call VideoCapture::open(<code>camera device index</code>) and the camera is in used by another program, it shows a <code>Video Source</code> dialog and returns true when I select a device that is already in use.</p>
  
  <p>However, in my [previous] experiment project, when I called VideoCapture::open(<code>camera device index</code>), it doesn't show this dialog.</p>
  
  <p>I want to know what is causing the <code>Video Source</code> dialog to show and the program to behave differently from the experimental project.</p>
  
  <p>This is the source code to the experiment project:</p>
  
  <pre><code>int main (int argc, char *argv[])
  {
  
      //vars
      time_duration td, td1;
      ptime nextFrameTimestamp, currentFrameTimestamp, initialLoopTimestamp, finalLoopTimestamp;
      int delayFound = 0;
      int totalDelay= 0;
  
      // initialize capture on default source
      VideoCapture capture;
      std::cout &lt;&lt; "capture.open(0): " &lt;&lt; capture.open(0) &lt;&lt; std::endl;
      std::cout &lt;&lt; "NOOO" &lt;&lt; std::endl;
      namedWindow("video", 1);
  
      // set framerate to record and capture at
      int framerate = 15;
  
      // Get the properties from the camera
      double width = capture.get(CV_CAP_PROP_FRAME_WIDTH);
      double height = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
  
      // print camera frame size
      //cout &lt;&lt; "Camera properties\n";
      //cout &lt;&lt; "width = " &lt;&lt; width &lt;&lt; endl &lt;&lt;"height = "&lt;&lt; height &lt;&lt; endl;
  
      // Create a matrix to keep the retrieved frame
      Mat frame;
  
      // Create the video writer
      VideoWriter video("capture.avi",0, framerate, cvSize((int)width,(int)height) );
  
      // initialize initial timestamps
      nextFrameTimestamp = microsec_clock::local_time();
      currentFrameTimestamp = nextFrameTimestamp;
      td = (currentFrameTimestamp - nextFrameTimestamp);
  
      // start thread to begin capture and populate Mat frame
      boost::thread captureThread(captureFunc, &amp;frame, &amp;capture);
      // loop infinitely
      for(bool q=true;q;)
      {
          if(frame.empty()){continue;}
          //if(cvWaitKey( 5 ) == 'q'){ q=false; }
          // wait for X microseconds until 1second/framerate time has passed after previous frame write
          while(td.total_microseconds() &lt; 1000000/framerate){
              //determine current elapsed time
              currentFrameTimestamp = microsec_clock::local_time();
              td = (currentFrameTimestamp - nextFrameTimestamp);
              if(cvWaitKey( 5 ) == 'q'){
                  std::cout &lt;&lt; "B" &lt;&lt; std::endl;
                  q=false;
                  boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(0);
                  captureThread.timed_join(timeout);
                  break;
              }
          }
  
          // determine time at start of write
          initialLoopTimestamp = microsec_clock::local_time();
  
          // Save frame to video
          video &lt;&lt; frame;
          imshow("video", frame);
  
          //write previous and current frame timestamp to console
          cout &lt;&lt; nextFrameTimestamp &lt;&lt; " " &lt;&lt; currentFrameTimestamp &lt;&lt; " ";
  
          // add 1second/framerate time for next loop pause
          nextFrameTimestamp = nextFrameTimestamp + microsec(1000000/framerate);
  
          // reset time_duration so while loop engages
          td = (currentFrameTimestamp - nextFrameTimestamp);
  
          //determine and print out delay in ms, should be less than 1000/FPS
          //occasionally, if delay is larger than said value, correction will occur
          //if delay is consistently larger than said value, then CPU is not powerful
          // enough to capture/decompress/record/compress that fast.
          finalLoopTimestamp = microsec_clock::local_time();
          td1 = (finalLoopTimestamp - initialLoopTimestamp);
          delayFound = td1.total_milliseconds();
          cout &lt;&lt; delayFound &lt;&lt; endl;
  
          //output will be in following format
          //[TIMESTAMP OF PREVIOUS FRAME] [TIMESTAMP OF NEW FRAME] [TIME DELAY OF WRITING]
          if(!q || cvWaitKey( 5 ) == 'q'){
              std::cout &lt;&lt; "C" &lt;&lt; std::endl;
              q=false;
              boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(0);
              captureThread.timed_join(timeout);
              break;
          }
      }
  
      // Exit
      return 0;
  }
  </code></pre>
  
  <p><img src="https://i.stack.imgur.com/JYsqm.png" alt="Video Source Dialog"></p>