0

私は2つの画像の違いを見つけようとしています。

シナリオ: 2 つの画像があるとします。1 つは背景の画像で、もう 1 つは背景の前にいる人物の画像です。人の位置を取得できるように 2 つの画像を差し引きたいとします。つまり、プログラムは次のことができます。人が立っていた場所を検出し、減算された画像を出力として提供します。

私が思いついたコードは、カメラから2つの画像を取得してサイズを変更し、両方の画像をグレースケールに変換しています。この後どうするか知りたかった。OpenCV が提供する減算関数を確認しましたが、配列を入力として使用するため、進行方法がわかりません。

私が書いたコードは次のとおりです。

cap>>frame; //gets the first image
cv::cvtColor(frame,frame,CV_RGB2GRAY); //converts it to gray scale
cv::resize(frame,frame,Size(30,30));  //re-sizes it

cap>>frame2;//gets the second image
cv::cvtColor(frame2,frame2,CV_RGB2GRAY); //converts it to gray scale
cv::resize(frame2,frame2,Size(30,30)); //re-sizes it

今、私は単純に次のような減算関数を使用しますか?

cv::subtract(frame_gray,frame,frame);

または、最初にいくつかのフィルターを適用してから、減算機能を使用しますか?

4

2 に答える 2

1

他の人が気づいたように、これはトリッキーな問題です。時々機能するハックを思いつくのは簡単ですが、人間の介入を最小限に抑えてほとんどの場合機能するソリューションを考え出すのは難しいです。また、背景のマテリアルと照明を厳密に制御できると、はるかに簡単に実行できます。専門的なアプリケーションは、「クロマキーイング」(特にテレビ業界)、「ブルースクリーン」、「マット」または「トラベリングマット」(映画撮影)、コンピュータービジョンの「背景除去」としてさまざまに知られています。

準均一な背景をつや消しにする画期的な作業は、何年も前にPetro Vlahosによって行われました。その基本的なアルゴリズムの特許はすでに期限切れになっているので、それらを持って町に行くことができます (そして、さまざまな品質のオープン ソースの実装を見つけることができます)。言うまでもなく、IANAL さん、特許に関する宿題をやってください。

より複雑な背景をマット化することは、特に 3D 情報が利用できない場合に、依然として活発な研究分野です。半年前に MS Research から発表されたいくつかの研究論文を参照することをお勧めします (A. Criminisi はその分野でいくつかの研究を行いました)。

于 2012-07-10T12:23:56.397 に答える
0

減算を使用すると、一部の値が負になる可能性があり、違いがあるかどうか (ブール値の true/false) を確認しようとしている場合にのみ機能するため、適切ではありません。

異なるピクセルを取得する必要がある場合は、次のようにピクセルごとに比較する必要があります。

int rows = frame.rows;
int cols = frame.cols;
cv::Mat diffImage = cv::Mat::zeros(rows, cols, CV_8UC1);
for(int i = 0; i < rows; ++i)
{
    for(int j = 0; j < cols; ++j)
    {

        if(frame.at<uchar>(i,j) != frame2.at<uchar>(i,j))
            diffImage.at<uchar>(i, j) = 255;
    }
}

これで、diffImage を表示または保存できます。異なるすべてのピクセルは白になり、同様のピクセルは黒になります

于 2012-07-10T10:30:13.070 に答える