2013-12-13 2 views
2

Я обрабатываю видео с использованием OpenCV 2.4.6. Когда я запускаю свои алгоритмы обработки видео, видео обрабатывается должным образом, однако при отображении каждого кадра после обработки происходит значительная задержка. Например, 10 секундное видео становится 18 секунд после добавления обработки. Мне нужна эта обработка для реального времени, как я могу улучшить процесс? ThanksОбработка видео с помощью OpenCV Частота кадров

Mat preProcess(Mat source){ 
    Mat grad_x, grad_y, grad_dif; 
    Mat abs_grad_x, abs_grad_y; 
    Mat src_gray, float_gray; 
    Mat temp; 

    GaussianBlur(source, grad_x, Size(1,1),0,0,BORDER_DEFAULT); 
    GaussianBlur(source, grad_y, Size(3,3),0,0,BORDER_DEFAULT); 
    grad_dif = grad_x - grad_y; 
    cvtColor(grad_dif, src_gray, CV_RGB2GRAY); 

    src_gray.convertTo(float_gray, CV_32F, 1.0/255.0); 

    GaussianBlur(float_gray, grad_x, Size(0,0), 2, 2); 
    abs_grad_x = float_gray - grad_x; 

    GaussianBlur(abs_grad_x.mul(abs_grad_x), grad_x, Size(0,0), 10, 10); 
    pow(grad_x, 0.5, grad_y); 

    float_gray = grad_x/grad_y; 
    normalize(float_gray, temp, 0, 255, NORM_MINMAX, CV_8UC1); 
    threshold(temp,temp,13,255,3); 

    return temp; 
} 

/** @function main */ 
int main(int argc, char** argv) 
{ 
    VideoCapture cap("ijv4.mp4"); // open the video file for reading 
    Rect myROI(160,20,350,380); 

    if (!cap.isOpened()) // if not success, exit program 
    { 
     cout << "Cannot open the video file" << endl; 
     return -1; 
    } 

    double fps = cap.get(CV_CAP_PROP_FPS); //get the frames per seconds of the video 

    cout << "Frame per seconds : " << fps << endl; 

    namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo" 
    Mat frame; 
    bool bSuccess; 

    while(1) 
    { 

     bSuccess = cap.read(frame); // read a new frame from video 

     if (!bSuccess) //if not success, break loop 
     { 
      cout << "Cannot read the frame from video file" << endl; 
      break; 
     } 


     grad = preProcess(frame(myROI)); 
     imshow("MyVideo", frame); //show the frame in "MyVideo" window 
     imshow("processed",grad); 

     if(waitKey(30) == 27) 
     { 
      cout << "esc key is pressed by user" << endl; 
      break; 
     } 
    } 

    return 0; 
} 

ответ

3

Почему вы делаете waitKey(30)? Этот вызов будет заблокирован для не менее 30 мс, остальная часть вашей обработки будет выполнена в 3 мс (при условии 30 кадров в секунду). Вы пытались понизить это значение или просто удалить его?

+0

спасибо. Если я удалю значение, видео не будет отображаться в окне. Он показывает пустое окно (я думаю, что изменение слишком быстро, чтобы правильно отображать его, если оно удалено). Если я уменьшу значение, в общем случае все еще немного отставание, хотя оно намного лучше, чем раньше. – mohikhsan

+1

waitkey должен считать некоторое значение, поэтому waitkey (1) сделает его быстрым. – alternatefaraz

-1

пытается занять от 10 до 15 кадров в секунду для обработки это увеличит скорость обработки данных

0

Мы всегда можем разделив его на потоки. Один для визуализации и один для препроцесса, который вы делаете. Я порекомендую библиотеку BOOST, но вы также можете использовать pthreads. Поскольку вы обрабатываете кадр в другом потоке, вы можете продолжить его, а графический интерфейс opencv отображает обработанный кадр в окне. Таким образом вы избегаете «потери» времени с помощью waitKey().

Смежные вопросы