0

カムからフレームの実行中の平均を取得しようとしていますが、数秒後に平均化されたフレームの画像がどんどん明るくなり、白よりも明るくなります。

私のカムは、3 チャンネルのグレースケールの画像を提供します。私はWindows 7、Visualstudio 2012、opencv 243を使用しています

#include<opencv2\opencv.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc, char* argv[])
{
    VideoCapture cap(0);
    Mat frame1;
    cap.read(frame1);
    Mat acc = Mat::zeros(frame1.size(), CV_32FC1);

    while(1){
        Mat frame;
        Mat gray;
        cap.read(frame);
        cvtColor(frame ,gray ,CV_BGR2GRAY,0);
        accumulateWeighted(gray, acc,0.005);
        imshow("gray", gray);
        imshow("acc", acc);
        waitKey(1); //don't know why I need it but without it the windows freezes
    }
}

誰が私が間違ったことを教えてもらえますか? ありがとう!

4

2 に答える 2

2

ここでの問題は、 imshow がマトリックス値をピクセル値にマップする方法にあります。通常、カムからの生データは、通常 [0, 255] の範囲の整数データ型として取得されます。calculateWeighted 関数は期待通りの動作をし、フレームの移動平均を計算します。したがって、acc は [0, 255] のどこかに値を持つ浮動小数点行列です。

その行列を imshow に渡すと、行列の値を強度にマッピングする必要があります。データ型は浮動小数点型であるため、0 は黒にマップされ、1 は白にマップされ、その範囲外のすべてがクリップされます。したがって、画像の領域が非常に暗く、そのままの状態が続く場合にのみ、移動平均が 1 未満に留まり、純粋な白以外の色にマッピングされます。

幸いなことに、修正は簡単です。

imshow("acc", acc/255);

于 2014-10-17T19:34:25.660 に答える
1

この質問に対するよりエレガントな解決策を見つけました。必要な関数は、OpenCV によって既に提供されています。これは、3 チャンネルのカラーまたは 1 チャンネルのグレースケール画像で機能します。

メソッドconvertScaleAbs

インライン ドキュメント

配列要素をスケーリングし、絶対値を計算して、結果を 8 ビットの符号なし整数に変換します: dst(i)=saturate_castabs(src(i)*alpha+beta)

サイン

convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)

サンプルコード

// Variables
Mat frame;
Mat accumulator;
Mat scaled;

// Initialize the accumulator matrix
accumulator = Mat::zeros(frame.size(), CV_32FC3);

while(1){
   // Capture frame
   capture >> frame;

   // Get 50% of the new frame and add it to 50% of the accumulator
   accumulateWeighted(frame, accumulator, 0.5);

   // Scale it to 8-bit unsigned
   convertScaleAbs(accumulator, scaled);

   imshow("Original", frame);

   imshow("Weighted Average", scaled);

   waitKey(1);
}
于 2015-02-08T23:46:08.313 に答える