0

ビデオ フレームを RGBA 形式にキャプチャし、それを HSV に変換して (しきい値処理を容易にするため)、画像のしきい値処理を行うアプリケーションを作成しました。(本質的に、カメラが指定された色を「認識する」場合、それらの要素は白に変わり、そうでない場合はそれらの要素が黒になります。)

私がやりたいのは、画像の何パーセントが指定された色の範囲内にあるかを判断することです。私の最初のアイデアは、しきい値処理されたマットの個々の要素をスキャンし、白い要素の数を数えて、色が検出された場所を確認することです。2 つの質問があります。まず、これはこの問題に対する効率的な解決策ですか? それとも、明らかな何かが欠けていますか?次に、Mat の要素にアクセスするにはどうすればよいでしょうか (これが最も効率的なソリューションである場合)。私は Mat のドキュメントと一緒にいくつかの質問を見てきましたが、それは私の頭を少し超えています。

これは、画像内の白い要素の数を決定するために私が現在持っている疑似コードです。

// Loop through height
   // Loop through width 
       // If Mat element (height, width) is white, add 1 to the total 

// Compare total to the total number of elements in the image (height * width)

編集:マットの個々の要素にアクセスする方法を見つけました(考えすぎて、見つけたチュートリアルの無関係な情報を見て混乱していました。以下にその方法を含めますが、これを行うためのより効率的な方法についてのアイデア、または私が可能な限り効率的にこれを既に行っているという知識を歓迎します!ありがとう!

for(int h=0; h<mHSVThreshed.height(); h++){
    for(int w=0; w<mHSVThreshed.width(); w++) {
        double element = mHSVThreshed.get(h, w)[0]; 
        }
}

複数のチャンネルを持つマットにアクセスするには、mHSV.get(h, w)[1] mHSV.get(h, w)[2]etc を使用します。

4

1 に答える 1

1

私はスピードのためにこのようにします。

unsigned int accumulator=0;
for(int i=0;i<yourMat.rows;i++){
    unsigned char *row=yourMat.ptr(i);
    for(int j=0;j<yourMat.cols;j++)
        accumulator+=row[j];
}
accumulator/=(yourMat.cols*yourMat.rows);

これは、しきい値を 255 などではなく 1 に設定したことを前提としています。Mat::get()行ごとに1回だけ幅のステップを気にするだけなので、関数よりもはるかに高速になるはずです。

于 2012-04-04T19:33:19.910 に答える