3

次のBGR画像(車のフロント)があり、その色を認識したい

ここに画像の説明を入力

私はそれをHSVに変換しました(imshow()がHSVを理解せず、BGRとして出力することは知っています) ここに画像の説明を入力

1 : 色相値を取得し、色を認識する範囲を知りたい

  • 色相の数または値を計算する方法は?
  • 範囲を指定するには?スカラーメソッドを使用すると、bgr 範囲が表示されます

コード

int main()
{
    Mat image;
    image = imread("carcolor.png", CV_LOAD_IMAGE_COLOR);

    if (!image.data)
    {
        cout << "Could not open or find the image" << std::endl;
        return -1;
    }

    // Create a new matrix to hold the HSV image
    Mat HSV;

    // convert RGB image to HSV
    cvtColor(image, HSV, CV_BGR2HSV);

    namedWindow("Display window", CV_WINDOW_AUTOSIZE);
    imshow("Display window", image);

    namedWindow("Result window", CV_WINDOW_AUTOSIZE);
    imshow("Result window", HSV);


    vector<Mat> hsv_planes;
    split(HSV, hsv_planes);
    Mat h = hsv_planes[0]; // H channel
    Mat s = hsv_planes[1]; // S channel
    Mat v = hsv_planes[2]; // V channel

    namedWindow("hue", CV_WINDOW_AUTOSIZE);
    imshow("hue", h);
    namedWindow("saturation", CV_WINDOW_AUTOSIZE);
    imshow("saturation", s);
    namedWindow("value", CV_WINDOW_AUTOSIZE);
    imshow("value", v);



    //// red color range
    Scalar hsv_l(170, 150, 150);
    Scalar hsv_h(180, 255, 255);
    Mat bw;
    inRange(HSV, hsv_l, hsv_h, bw);
    imshow("Specific Colour", bw);
    ////

    // hue value

    //define ranges

    waitKey(0);
    return 0;
}
4

1 に答える 1

2

色相は円形の範囲であり、赤はまさにその円の始点/終点にあるため、赤の色相値は と の 2 つの異なる範囲でカバーされ[0 .. n]ます[360-n .. 360][0 .. 180]コードで使用したように、バイト カバレッジのため、openCV は範囲全体をさらに半分にします。

したがって、and に加えて、2 番目の範囲が必要にScalar hsv_l(170, 150, 150);なりScalar hsv_h(180, 255,255);ます。

範囲を見つけるための完全なコードは次のようになります。

//// red color rangeS
int redRange = 10;

Scalar hsv_upper_l(180-n, 150, 150);
Scalar hsv_upper_h(180, 255, 255);
Mat red_hue_upper;
inRange(HSV, hsv_upper_l, hsv_upper_h, red_hue_upper);

Scalar hsv_lower_l(0, 150, 150);
Scalar hsv_lower_h(0+n, 255, 255);
Mat red_hue_lower;
inRange(HSV, hsv_lower_l, hsv_lower_h, red_hue_lower);

cv::Mat whole_red_hue = red_hue_lower | red_hue_upper;

imshow("Specific Colour", whole_red_hue);

この入力から次の出力を生成します。

ここに画像の説明を入力 ここに画像の説明を入力

異なる色の場合は簡単です (円の始点/終点の周りに配置されていないため):

int hueCenter = ...; // any hue value of the color
int hueRange = 10; // or any other range
cv::Mat hueMask;
inRange(HSV, Scalar(hueCenter-hueRange, 150, 150), Scalar(hueCenter+hueRange, 255, 255), hueMask);

お役に立てれば。

于 2016-02-20T13:06:58.747 に答える