我正在研究熵,我从.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秒为下一个当前图像,而不是执行任务就此
答案 0 :(得分:1)
要忽略一定数量的帧,只需从流中读取它们。
for(int i=0; i<60; i++)
capture >> current_frame;
如果您的视频有30fps,则会跳过2秒的视频。
如果您的熵大于某个阈值,您需要添加以下内容:
if ( entropy > 1.0 )
{
// do something
}
我使用了阈值,因为由于噪声,不同帧之间的熵可能永远不会为零。
如果您的编译器没有为您提供log2
功能,您只需按照here所述模拟它。