2015-04-19 2 views
0

Используя OpenCv с C++, я пытаюсь выполнить среднее время на кадрах видео для извлечения переднего плана. Но я не могу узнать, что не так с функцией accumulateWeighted. Программа прекращает работу, когда дело доходит до этой функции, что дает эту ошибку:accumulateНомерное утверждение функции не работает в OpenCV

Unhandled exception at 0x753b9617 in test.exe: Microsoft C++ exception: cv::Exception at memory location 0x0017f0d4..

Согласно OpenCV документации, я вижу, что SRC, как 1- или 3-канал, должен быть 8-битной или 32-бит с плавающей точкой , И ДСТ с тем же числом каналов, как SRC изображения, должно быть 32-битное или 64-битное число с плавающей точкой:

void accumulateWeighted(InputArray src, InputOutputArray dst, double alpha, InputArray mask=noArray()) 

Так я использовал CV_32F для них обоих. Я делаю это неправильно? Вот мой код:

#include <iostream> // for standard I/O 
#include <string> // for strings 
#include "stdafx.h" 
#include <opencv.hpp> 

#ifdef _DEBUG 
#pragma comment (lib, "opencv_highgui2410d.lib") 
#pragma comment (lib, "opencv_imgproc2410d.lib") 
#pragma comment (lib, "opencv_core2410d.lib") 
#else 
#pragma comment (lib, "opencv_highgui2410.lib") 
#pragma comment (lib, "opencv_imgproc2410.lib") 
#pragma comment (lib, "opencv_core2410.lib") 
#endif 

using namespace std; 
using namespace cv; 

int main(int argc, char* argv[]) 
{ 
//// Step 1 : Get ready to Capture Video 

    VideoCapture cap("768x576.avi"); // open the video 

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

//// Step 2 : Find video frame size 

    double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video 
    double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of   frames of the video 

//// Step 3 : Running Average 

    Mat sum=Mat::zeros(dHeight,dWidth,CV_32FC3); 
    for (int iii=0;iii<100;iii++) // for 100 frames 
    { 
     Mat frame_rgb,floatimg; 

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

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

     frame_rgb.convertTo(floatimg, CV_32FC3); 

     accumulateWeighted(floatimg,sum,0.03,NULL); 
    } 

    cap.release(); 

    return 0;  
} 
+0

Возможно, попробуйте удалить NULL в конце? Значение noArray() по умолчанию в подписи может не совпадать с NULL – mirosval

+0

Спасибо, это сработало :) –

+0

Отлично, я опубликовал его как реальный ответ. чтобы люди могли быстрее найти решение. – mirosval

ответ

1

Возможно, попробуйте удалить NULL в конце? Значение noArray() по умолчанию в сигнатуре не совпадает с NULL

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