次の画像があります。
cv::inRange
メソッドとHSV色空間を使用して赤い長方形を検出したいと思います。
int H_MIN = 0;
int H_MAX = 10;
int S_MIN = 70;
int S_MAX = 255;
int V_MIN = 50;
int V_MAX = 255;
cv::cvtColor( input, imageHSV, cv::COLOR_BGR2HSV );
cv::inRange( imageHSV, cv::Scalar( H_MIN, S_MIN, V_MIN ), cv::Scalar( H_MAX, S_MAX, V_MAX ), imgThreshold0 );
HSVの値を変更するために、既にダイナミックトラックバーを作成しましたが、目的の結果を得ることができません。
使用する最適な値(およびフィルター)の提案はありますか?
HSV空間では、赤色は180をラップします。したがって、[0,10]と[0,10]の両方であるH
値が必要です。 [170、180]。
これを試して:
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat3b bgr = imread("path_to_image");
Mat3b hsv;
cvtColor(bgr, hsv, COLOR_BGR2HSV);
Mat1b mask1, mask2;
inRange(hsv, Scalar(0, 70, 50), Scalar(10, 255, 255), mask1);
inRange(hsv, Scalar(170, 70, 50), Scalar(180, 255, 255), mask2);
Mat1b mask = mask1 | mask2;
imshow("Mask", mask);
waitKey();
return 0;
}
前の結果:
結果の追加範囲[170、180]:
単一の範囲のみをチェックする必要がある別の興味深いアプローチは次のとおりです。
このアイデアは fmw42 によって提案され、 Mark Setchell によって親切に指摘されました。どうもありがとうございます。
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat3b bgr = imread("path_to_image");
Mat3b bgr_inv = ~bgr;
Mat3b hsv_inv;
cvtColor(bgr_inv, hsv_inv, COLOR_BGR2HSV);
Mat1b mask;
inRange(hsv_inv, Scalar(90 - 10, 70, 50), Scalar(90 + 10, 255, 255), mask); // Cyan is 90
imshow("Mask", mask);
waitKey();
return 0;
}