我尝试制作平均背景但有些不对劲,因为它会让应用程序崩溃
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 :(得分:0)
在cv::accumulateWeighted
中,输入和输出图像必须具有相同数量的通道。在您的情况下,currentFrame
只有一个频道,因为您之前使用COLOR_BGR2GRAY
,averageBackground
有三个频道。
另外请注意averageBackground = cv::Mat::zeros(image.size(), CV_32FC3);
,因为使用此行每次都会初始化结果图像(因此您要删除以前允许计算平均值的图像值)。您必须在程序开头或任何地方初始化此图像一次。