문제 설명
파란색에 대해 가능한 전체 Hue 범위를 지정했는데 inRange 함수가 파란색을 감지하지 못하는 이유는 무엇입니까? (Why isn't inRange function detecting blue color when I have given it the entire possible Hue range for the blue color?)
웹사이트 colorizer.org에서 HSV 범위는 H=0‑360, S=0입니다. ‑100, V=0‑100. 우리는 또한 OpenCV의 HSV 범위가 H=0‑180, S=0‑255, V=0‑255라는 것을 알고 있습니다.
나는 (우리가 인식하는) 모든 음영에 대한 범위를 선택하고 싶었습니다. as) blue color, 그래서 colorizer.org에서 blue Hue의 범위가 대략 170에서 270인 것을 보았습니다. 그래서 이 Hue 범위를 2로 나누어 OpenCV로 확장하여 85‑135가 되었습니다.
이제 웹사이트의 미리보기에서 [H=216, S=96, V=67]
색상의 다음 스크린샷을 가져왔습니다.
resulting in this mask:
The difference to your code is that I used CV_RGB2HSV
instead of CV_RGB2HSV_FULL
. Flag CV_RGB2HSV_FULL
uses the whole byte to store the hue values, so range 0 .. 360 degrees
will be scaled to 0 .. 255
instead of 0 .. 180
as in CV_RGB2HSV
I could verify this by using this part of the code:
// use _FULL flag:
cv::cvtColor(input,hsv,CV_RGB2HSV_FULL);
// but scale the hue values accordingly:
double hueScale = 2.0/1.41176470588;
cv::Mat mask;
// scale hue values:
inRange(hsv, cv::Scalar(hueScale*85, 50, 40), cv::Scalar(hueScale*135, 255, 255), mask);
giving this result:
For anyone who wants to test with the "right" image:
Here's the input converted to BGR: If you want to use that directly you have to switch conversion from RGB2HSV to BGR2HSV. But I thought it would be better to show the BGR version of the input, too...