【问题标题】:how to handle the entropy of two images from .mp4如何处理来自.mp4的两个图像的熵
【发布时间】:2024-01-20 22:34:01
【问题描述】:

我正在研究熵,我正在从 .mp4 文件中获取连续帧,我想计算当前帧与前一帧的熵,如果它们之间的熵不为零,则应该检查帧,否则应该忽略帧,它应该保存前一帧并在 2 秒后获取当前帧,如果熵为零,它应该忽略它,然后再次等待 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 继续运行,我是否需要使用 cvwaitkey(2)在 2 秒后检查 .mp4,意味着 .mp4 正在运行,但我忽略了帧

忽略意味着当它从前一帧中减去当前帧并且熵为0时,前一帧保持前一帧,当前未变为前一帧,前一帧等待下一个当前图像2秒,然后对其执行任务

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您的视频有 30fps,这将跳过 2 秒的视频。

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

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

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

    如果您的编译器没有为您提供log2 函数,您可以按照here 的描述简单地模拟它。

    【讨论】:

    • @soetschie 但主要问题仍然存在,如何处理 .mp4 视频中的 2 个连续帧,当我为当前帧分配熵值时,当前帧在下一次迭代中成为前一帧,值混合,那么如何为它们分配值,以便我可以减去当前帧和前一帧的两帧的值,我想从前一帧熵中减去当前帧熵
    • 您可以像处理帧一样处理它:使用两个变量 previous_entropy 和 current_entropy。但是您已经在计算两个图像差异的熵。那么你要监控变化的变化吗?
    • 两张图片的差异是为了减去背景,这个减法是为了检测帧的变化,如果帧更大,比如它包含的车辆比它应该处理的帧跨度>
    • 您确定公式使用 log2 吗?还是它的简单日志?因为我得到了不同的公式
    • @sietschie 您确定答案中的循环吗?