私はエントロピーに取り組んでいます.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);
}
これは、現在の画像である1つの画像のみのエントロピーをカウントしており、私のページの作業が私に言った限り、次の画像が処理されると前の画像になります。このように使用するとlog2でエラーが発生しますentropy -= binEntry * log2(binEntry);
。エントロピーがゼロのときにフレームを無視する方法を教えてください.mp4が実行を継続し、cvwaitkey(2)
2後に.mp4をチェックするために使用する必要があります秒、平均 .mp4is が実行されていますが、フレームを無視しています
前のフレームから現在のフレームを減算し、エントロピーが 0 の場合は平均を無視し、前のフレームよりも前のまま、現在は前にならず、前は次の現在の画像を 2 秒間待機し、それに対してタスクを実行します。