1

私はエントロピーに取り組んでいます.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 秒間待機し、それに対してタスクを実行します。

4

1 に答える 1

1

一定量のフレームを無視するには、単にストリームからそれらを読み取ります。

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

動画が 30 fps の場合、動画が 2 秒スキップされます。

エントロピーが特定のしきい値よりも大きい場合に対処するには、次のようなものを追加する必要があります。

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

ノイズのために、異なるフレーム間でエントロピーがゼロになることはおそらくないため、しきい値を使用しました。

コンパイラが関数を提供しない場合は、ここでlog2説明されているように単純にエミュレートできます。

于 2013-09-02T20:47:34.377 に答える