3

動画ファイルを作成する場合、そのサイズは重要です。新しいビデオファイルのサイズを小さくするために、フレーム全体ではなく、フレーム同士を JPEG 形式で保存したいと考えています。私は Aforge.Net Framework を使用しましたが、(Difference クラスを使用して) 違いの結果をうまく生成しますが、現在のフレームを生成するためにフレームを前のフレームとマージしたい場合、結果は必要ありません。以下の例を参照してください。

これは背景フレームです

これは背景フレームです

これは現在のフレームです

これは現在のフレームです

これが差分フレームです

これは差分フレームです

差を取得するためのコード:

AForge.Imaging.Filters.Difference sb = new AForge.Imaging.Filters.Difference(bmpDest);
            Bitmap result = sb.Apply(bmpSrc);
            result.Save(string.Format(address, 10002), ImageFormat.Jpeg);

ご存知のように、差分フレームを背景フレームとマージすると、現在のフレームを生成する必要がありますが、これは生成されたフレームです。 ここに画像の説明を入力 ソースコードは次のとおりです。

 AForge.Imaging.Filters.Merge mg = new AForge.Imaging.Filters.Merge(bmpSrc);
            Bitmap results = mg.Apply(new Bitmap(string.Format(address, 10002)));
            results.Save(string.Format(address, 1004), ImageFormat.Jpeg);

したがって、問題は明らかです。これらはスクリーンキャプチャですが、この操作を使用してカメラをキャプチャしたい場合、結果にも多くの問題があります。

この操作にもopenCVを使用しましたが、違いを得るために言及されている指示では、最初にフレームをグレースケール画像に変換する必要があり、AForgeのように画像のマージにも問題があります。

そして最後にアルゴリズムを使用しましたが、差分画像のサイズは元の画像よりも大きくなります!

この操作はどのようにすればよいですか?画像のサイズは非常に重要であり、JPEG ファイルを保存したい (圧縮用) ことを覚えておいてください。

上級者に感謝...

4

1 に答える 1

0

問題は、差分フィルターが絶対値を取ることです。その結果、マウス ポインターは画像から減算されるのではなく、画像に追加されます。これは、差分画像では負になるはずだからです。AForge.net でこれを修正する方法がわかりません。

opencv では、RGB/BGR イメージのデフォルトの CV_8UC3 の代わりに、CV_16SC3 のような符号付きの数値をサポートするイメージ タイプを使用してこれを解決します。CV_8SC3 は使用しないでください。8 ビットの 1 つが符号に使用されるため、+/-127 以外のピクセル値はクランプされます。

void imageDelta(cv::Mat& A, cv::Mat& B, cv::Mat& deltaOut)
{
    //Calculate B - A, preserving sign
    A.convertTo(A, CV_16SC3);
    B.convertTo(B, CV_16SC3);
    cv::subtract(B, A, deltaOut); //deltaOut is a CV_16SC3
}

void reconstructB(cv::Mat& A, cv::Mat& delta, cv::Mat& BOut)
{
   //Calculate B = A + delta
   cv::add(A, delta, BOut);
   BOut.convertTo(BOut, CV_8UC3); //Safe to go back to CV_8UC3 now.
}
于 2013-09-08T23:00:21.323 に答える