如何处理来自.mp4的两幅图像的熵

时间:2013-09-02 17:18:36

标签: image opencv image-processing computer-vision entropy

我正在研究熵,我从.mp4文件中获取连续帧,我想计算当前帧与前一帧的熵,如果它们之间的熵不是零则应该检查帧,否则它应该忽略帧,它应该保存前一帧并在2秒后取当前帧,如果entropy为零,它应该忽略它而不是再等待2秒这是我的代码:

capture.open("recog.mp4");
if (!capture.isOpened()) {
    cerr << "can not open camera or video file" << endl;
}

while(1)
{
    capture >> current_frame;
    if (current_frame.empty())
        break;
    if (! previous_frame.empty())  {
       subtract(current_frame, previous_frame, pre_img);
       Mat hist;
       int channels[] = {0};
       int histSize[] = {32};
       float range[] = { 0, 256 };
       const float* ranges[] = { range };

       calcHist( &pre_img, 1, channels, Mat(), // do not use mask
                 hist, 1, histSize, ranges,
                 true, // the histogram is uniform
                 false );

       Mat histNorm = hist / (pre_img.rows * pre_img.cols);
       double entropy = 0.0;
       for (int i=0; i<histNorm.rows; i++)
       {
          float binEntry = histNorm.at<float>(i,0);
          if (binEntry != 0.0)
          {
            entropy -= binEntry * log(binEntry);
          }
          else
          {
            //ignore the frame andgo for next , but how to code it ? is any function with ignore ?
          }
waitKey(10);
current_frame.copyTo(previous_frame); 
}

这是计算当前图像的一个图像的熵,并且当下一个图像进入处理时它就变成了前一个图像,就像我的页面工作告诉我的那样。当我像entropy -= binEntry * log2(binEntry);一样使用它时,它会给我log2中的错误,你可以帮我告诉你当熵为零时如何忽略帧,这样.mp4继续运行,我应该使用{ {1}}在2秒后检查.mp4,意味着.mp4正在运行,但我忽略了框架

当它从前一个帧中减去当前帧并且熵为0时忽略均值,比前一个帧保持前一个,当前没有变为前一个,并且前一个等待2秒为下一个当前图像,而不是执行任务就此

1 个答案:

答案 0 :(得分:1)

要忽略一定数量的帧,只需从流中读取它们。

for(int i=0; i<60; i++)
    capture >> current_frame;

如果您的视频有30fps,则会跳过2秒的视频。

如果您的熵大于某个阈值,您需要添加以下内容:

if ( entropy > 1.0 )
{
    // do something
}

我使用了阈值,因为由于噪声,不同帧之间的熵可能永远不会为零。

如果您的编译器没有为您提供log2功能,您只需按照here所述模拟它。