获得帧序列的均值

时间:2013-11-24 13:39:13

标签: opencv element frames mean mat

我想通过添加它们来计算帧序列的平均值,然后除以帧的总数。问题是我无法访问图像中的像素。我用过这段代码。

for(i = 1; i <= N; i++){
 image = imread(fileName.c_str(),0);
 Mat Mean = Mat::zeros(width, height,image.type());
        for(w = 0; w < image.rows ; w++)
           for(h = 0; h < image.cols ; h++)
               Mean.row(w).col(h) += (image.at<unsigned float>(w,h) / N);
         }

我总是遇到Assertion Failed错误。 我也尝试过:

(float)image.at<uchar>(w,h)

image.row(w).col(h)[0]

image.row(w).col(h).val[0]

但徒劳无功。

这是工作代码......但我无法显示最终结果,因为它是浮动的。

Mat Mean   = Mat::zeros(width, height,CV_32F); 
for(i = 1; i <= framesToLearn ; i++){
        image = imread(fileName.c_str(),0);
        accumulate(image, Mean);
    }
    Mean = Mean /framesToLearn;
    imshow("mean",Mean);
    waitKey(0);

2 个答案:

答案 0 :(得分:5)

也许尝试使用其他方法:cv::accumulate

cv::Mat avgImg;
avgImg.create(width, height,CV_32FC3);

for(i = 1; i <= N; i++){
  image = imread(fileName.c_str(),0);
  cv::accumulate(image, avgImg);
}

avgImg = avgImg / N;

请注意,如果您需要显示结果图像,则必须将其转换为CV_8U或将其标准化,例如:

Mat Mean   = Mat::zeros(width, height,CV_32F); 
 for(i = 1; i <= framesToLearn ; i++){
      image = imread(fileName.c_str(),0);
      accumulate(image, Mean);
    }
 Mean = Mean /framesToLearn;
 Mean.convertTo(Mean,CV_8U);
 imshow("mean",Mean);
 waitKey(0);

答案 1 :(得分:0)

只是不要过度复杂化,避免内部循环:

Mat Mean = Mat::zeros(width, height,CV_32F);
for(i=0; i<N; i++) {
    Mean += imread(fileName.c_str(),0);
}
Mean /= N;

是的,如果你想访问单个像素,你使用:

image.at(R,C);