Opencv VideoCapture set CV_CAP_PROP_POS_FRAMES not working

后端 未结 4 1842
醉酒成梦
醉酒成梦 2020-12-09 12:41

I am using opencv to read frames from a video output from a Vivotek Camera using the mpeg compression. I am trying to use the function to start the video from a particular

4条回答
  •  抹茶落季
    2020-12-09 13:08

    A bit too late but searching on same topic (not specific to Vivotek Camera but more on mpeg problem with openCV) :

    • Video is encoded
    • OpenCV uses FFMPEG
    • Encoding use key frames
    • When skipping some frames encoding can't give you the exact frame you want

    see similar question :

    • Getting individual frames using CV_CAP_PROP_POS_FRAMES in cvSetCaptureProperty

    • How can I get one single frame from a video file?

    • Problem with CV_CAP_PROP_POS_FRAMES setting next frame number

      desired position        key frame (this is where the cursor will stop)
       |   |                       |                    |
       |   >                       |                    |
       |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
      

      Sample code using openCV 2.4.8 / VS2013 with trackbar :

    • tested with AVI format [MPEG4 Video (H264)] : setting frame position works fine
    • tested with MPG format [MPEG1/MPEG2] : setting frame position works fine

      double currentPos = capture.get(CV_CAP_PROP_POS_FRAMES);
      std::cout << "CV_CAP_PROP_POS_FRAMES = " << currentPos << std::endl;
      
      // position_slider 0 - 100
      double noFrame = position_slider*nbFrames / 100;
      
      // solution 1
      bool success = capture.set(CV_CAP_PROP_POS_FRAMES, noFrame);
      // solution 2
      double frameRate = capture.get(CV_CAP_PROP_FPS);
      double frameTime = 1000.0 * noFrame / frameRate;
      bool success = capture.set(CV_CAP_PROP_POS_MSEC, frameTime);
      
      if (!success) {
          std::cout << "Cannot set frame position from video file at " << noFrame << std::endl;       
          return;
      }
      
      currentPos = capture.get(CV_CAP_PROP_POS_FRAMES);
      if (currentPos != noFrame) {
          std::cout << "Requesting frame " << noFrame << " but current position == " << currentPos << std::endl;
      }
      
      success = capture.read(frame_aux);
      if (!success) {
          std::cout << "Cannot get frame from video file " << std::endl;
          return;
      }
      imshow("test", frame_aux);
      

提交回复
热议问题