2015-10-07 220 views
0

我尽量让平均背景但蹊跷的是因为它的方式崩溃的应用程序OpenCV3断言失败上accumulateWeighted

cv::Mat firstFrame; 
cv::Mat averageBackground; 
int frameCounter=0; 

// this function is called for every frame of the camera 
- (void)processImage:(Mat&)image; { 

    cv::Mat diffFrame; 
    cv::Mat currentFrame; 
    cv::Mat colourCopy; 

    cvtColor(image, currentFrame, COLOR_BGR2GRAY); 

    averageBackground = cv::Mat::zeros(image.size(), CV_32FC3); 
    cv::accumulateWeighted(currentFrame, averageBackground, 0.01); 


    cvtColor(image, colourCopy, COLOR_BGR2RGB); 

我在崩溃日志中看到

OpenCV Error: Assertion failed (_src.sameSize(_dst) && dcn == scn) in accumulateWeighted, file /Volumes/Linux/builds/precommit_ios/opencv/modules/imgproc/src/accum.cpp, line 1108 

libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Volumes/Linux/builds/precommit_ios/opencv/modules/imgproc/src/accum.cpp:1108: error: (-215) _src.sameSize(_dst) && dcn == scn in function accumulateWeighted 

回答

0

cv::accumulateWeighted输入和输出图像必须具有相同数量的频道。在你的情况下,currentFrame只有一个频道,因为你之前做过COLOR_BGR2GRAY,而averageBackground有三个频道。

也请注意averageBackground = cv::Mat::zeros(image.size(), CV_32FC3);,因为使用这一行,您每次都初始化结果图像(因此您正在删除以前的图像值,以便计算平均值)。您只能在程序开始或任何地方初始化该图像一次。