1

well my problem is, I need to find the sub matrix of a cv::Mat image which includes all white pixels. Therefore I want to iterate through all pixels, check if they are white and build a cv::Rect with that information.
I figured out how to iterate through all the pixels but I don't know how to get the pixels color out of it. The cv::Mat was previously converted to greyscale with CV_GRAY2BGR

for(int y = 0; y < outputFrame.rows; y++)
{
    for(int x = 0; x < outputFrame.cols; x++)
    {
        // I don't know which datatype I should use
        if (outputFrame.at<INSERT_DATATYPE_HERE>(x,y) == 255)
           //define area
    }
}

My final question is, which datatype should I insert in the code on the position INSERT_DATATYPE_HERE and is 255 the right value to compare with than?

Thanks alot

4

1 に答える 1

8

画像のチャンネルによって異なります。マットにはメソッドがありchannelsます。チャンネル数を返します。画像がグレーの場合は1 、画像がカラーの場合は3です (たとえば、RGB - 各カラー コンポーネントに 1 チャンネル)。

したがって、次のようにする必要があります。

if (outputFrame.channels() == 1) //image is grayscale - so you can use uchar (1 byte) for each pixel
{
    //...
    if (outputFrame.at<uchar>(x,y) == 255)
    {
        //do a check if this pixel is the most left, or the most right, or the most top, or the most bottom (this is needed to construct result rectangle)
    }
}
else
if (outputFrame.channels() == 3) //image is color, so type of each pixel if Vec3b
{
    //...
    // white color is when all values (R, G and B) are 255
    if (outputFrame.at<Vec3b>(x,y)[0] == 255 && outputFrame.at<Vec3b>(x,y)[1] == 255 && outputFrame.at<Vec3b>(x,y)[2] == 255)
    {
        //do a check if this pixel is the most left, or the most right, or the most top, or the most bottom (this is needed to construct result rectangle)
    }
}

しかし、実際には、画像上のすべての白いピクセルを含む長方形を取得するには、別の手法を使用できます。

  1. イメージをグレースケールに変換します。
  2. パラメータとして値 254 (または 255 に近い値) を使用してしきい値を設定します。
  3. image 上のすべての輪郭を見つけます
  4. これらすべての等高線を含む 1 つの等高線を作成します (各等高線のすべての点を 1 つの大きな等高線に追加するだけです)。
  5. 境界長方形関数を使用して、長方形に必要なものを見つけます。
于 2012-08-29T07:54:05.480 に答える