3

私はビデオのフレームに取り組んでおり、あるフレームを他のフレームから差し引いて違いを見つけたいのですが、どうすればよいかわかりません。ビットマップ フレームをマットに変換してから減算しようとしましたが、機能しません。私はmat関数にopencv 2.4.3を使用しています。誰でもその方法を教えてもらえますか。可能であれば、コード スニペットで説明してください。

私はこのようなことを試しました

     Bitmap myBitmap1 = BitmapFactory.decodeFile("/mnt/sdcard/Frames/mpgFrames/image001.jpg");  
    Bitmap myBitmap2 = BitmapFactory.decodeFile("/mnt/sdcard/Frames/mpgFrames/image002.jpg");  

    int width = myBitmap1.getWidth();
    int height = myBitmap1.getHeight();

    Mat  imgToProcess1 = new Mat(height, width, CvType.CV_8UC4);
    Mat  imgToProcess2 = new Mat(height, width, CvType.CV_8UC4);
    Mat  imgToProcess = new Mat(height, width, CvType.CV_8UC4);

    Utils.bitmapToMat(myBitmap1, imgToProcess1); 
    Utils.bitmapToMat(myBitmap2, imgToProcess1);        
    imgToProcess = imgToProcess1-imgToProcess2;
4

1 に答える 1

4

あるフレームから別のフレームを減算すると、2 番目のフレームの値が最初のフレームよりも高い領域のみを含む画像になります。

違いを取得するには、次を使用する必要がありますabsdiff

absdiff(imgToProcess1, imgToProcess2, imgToProcess);

これにより、実際の違いのマトリックスが得られますが、違いの領域のマスクが必要な場合は、結果にしきい値を適用できます。

Mat mask(imgToProcess.rows, imgToProcess.cols, CV_8U);
cvtColor(imgToProcess, mask, CV_RGB2GRAY, 1); //your conversion specifier may vary
threshold(mask, mask, 0, 255, CV_THRESH_BINARY);

最小しきい値 (0上記) を調整できます。JPEG 画像を使用している場合は、エンコーディング ノイズを考慮するために少し増やす必要があるかもしれません。

于 2013-02-28T15:35:05.987 に答える