2016-08-14 2 views
0

Я работаю над обработкой изображений (OpenCC 3.0, C++).Запись видео определенного времени с использованием OpenCV в C++

На самом деле, что я пытаюсь сделать, это:

  1. Запись видео в 1 минуту (это мой вопрос)
  2. После записи видео, чтение записанного видео (я сделаю этот шаг после первого шага решается)
  3. Необходимый процесс обработки изображения (я уже сделал этот шаг)
  4. Вернитесь в состояние 1 и выполните тот же процесс, пока не дойдете до конечного порядка.

У меня есть код для state 1. (Этот код записывает видео и записывает файл до нажатия клавиши ESC.)

Не могли бы вы помочь мне, как я могу записывать видео в течение 1 минуты или 10 минут или в любое конкретное время?

Я хочу записывать видео в течение 1 минуты.

#include "opencv2/opencv.hpp" 
#include <iostream> 

using namespace std; 
using namespace cv; 

int main() { 

    VideoCapture vcap(0); 
    if (!vcap.isOpened()) { 
     cout << "Error opening video stream or file" << endl; 
     return -1; 
    } 

    int frame_width = vcap.get(CV_CAP_PROP_FRAME_WIDTH); 
    int frame_height = vcap.get(CV_CAP_PROP_FRAME_HEIGHT); 
    VideoWriter video("/MyVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 10, Size(frame_width, frame_height), true); 

    for (;;) { 

     Mat frame; 
     vcap >> frame; 
     video.write(frame); 
     imshow("Frame", frame); 
     char c = (char)waitKey(33); 
     if (c == 27) break; 
    } 
    return 0; 
}` 

Это работает.

Вот мой код. Я пытался получить 10 секунд видео в моем последнем коде, но я получил 16 секунд видео. Можете ли вы объяснить, почему это так?

#include "opencv2/opencv.hpp" 
#include <iostream> 
#include <ctime> 
#include <cstdio> 
#include <time.h> 
#include <stdio.h> 

    using namespace std; 
    using namespace cv; 

    int main() { 

     //////////////////// Added Part 
     time_t start, end; 
     //////////////////// Added Part 
     VideoCapture vcap(0); 
     if (!vcap.isOpened()) { 
      cout << "Error opening video stream or file" << endl; 
      return -1; 
     } 
     int frame_width = vcap.get(CV_CAP_PROP_FRAME_WIDTH); 
     int frame_height = vcap.get(CV_CAP_PROP_FRAME_HEIGHT); 
     VideoWriter video("C:\\Users\\lenovo\\Desktop\\OpenCV Webcam Video Record With R Key\\WebcamRecorder\\WebcamRecorder\\data\\MyVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 10, Size(frame_width, frame_height), true); 

     //////////////////// Added Part 
     time(&start); 
     //////////////////// Added Part 

     for (;;) { 

      Mat frame; 
      vcap >> frame; 
      video.write(frame); 
      imshow("Frame", frame); 
      char c = (char)waitKey(33); 
      if (c == 27) break; 

      //////////////////// Added Part 
      time(&end); 
      double dif = difftime(end, start); 
      printf("Elasped time is %.2lf seconds.", dif); 
      if (dif==10) 
      { 
       std::cout << "DONE" << dif<< std::endl; 
       break; 
      } 
      //////////////////// Added Part 
     } 
     return 0; 
    } 
+0

Это не очень понятно, что вы просите.Можете ли вы изменить свой вопрос, чтобы сделать его более понятным? –

+0

Я редактировал моего друга. Надеюсь, теперь вы можете понять. –

ответ

0

как я могу записывать видео 1 мин или 10 мин или любое определенное время?

Непосредственно перед цикл начать часы, чтобы получить текущее время и сохранить его в переменной с именем start_time.

Чуть ниже этого кода внутри цикл

char c = (char)waitKey(33); 
     if (c == 27) break; 

Используйте другую переменную, чтобы получить текущее время, имя его cur_time.

Вычесть start_time из cur_time получить истекшее время. Если вы видите, что он достигает время с помощью если условие тогда разрывапетли.

Не объявлять cur_time переменную внутри цикл, объявить его раньше.

Вы можете использовать эту ссылку Easily measure elapsed time

+0

думаю, я сделал. Это работа. –