파란색에 대해 가능한 전체 Hue 범위를 지정했는데 inRange 함수가 파란색을 감지하지 못하는 이유는 무엇입니까? (Why isn't inRange function detecting blue color when I have given it the entire possible Hue range for the blue color?)


문제 설명

파란색에 대해 가능한 전체 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] 색상의 다음 스크린샷을 가져왔습니다.

 strong>중요:</strong> 첫 번째 원본 이미지를 제외하고 모든 이미지는 <code>Highgui.imwrite</code> 기능을 사용하여 sdcard에 저장되었으므로 Stackoverflow에 업로드하기 위해 내 컴퓨터로 이동할 수 있습니다. . 첫 번째 원본 스크린샷의 파란색이 두 번째 이미지에서 빨간색으로 변환된 것을 눈치채셨을 것입니다. 그 이유는 카메라로 캡처한 프레임(즉, 휴대폰 카메라로 캡처한 첫 번째 스크린샷의 사진/프레임)이 RGBA 이미지이기 때문입니다. 그러나 OpenCV는 모든 이미지를 sdcard에 저장할 때 기본적으로 모든 이미지를 BRG로 변환합니다. 따라서 원본 이미지는 RGBA이며 sdcard에 저장하기 위해 OpenCV에 의해 내부적으로만 BGR로 변환됩니다. 이것이 빨간색이 파란색으로 나타나는 이유입니다.</p> 모든 이미지는 <code>Highgui.imwrite</code> 기능을 사용하여 sdcard에 저장되었으므로 Stackoverflow에 업로드하기 위해 내 컴퓨터로 이동할 수 있습니다. 첫 번째 원본 스크린샷의 파란색이 두 번째 이미지에서 빨간색으로 변환된 것을 눈치채셨을 것입니다. 그 이유는 카메라로 캡처한 프레임(즉, 휴대폰 카메라로 캡처한 첫 번째 스크린샷의 사진/프레임)이 RGBA 이미지이기 때문입니다. 그러나 OpenCV는 모든 이미지를 sdcard에 저장할 때 기본적으로 모든 이미지를 BRG로 변환합니다. 따라서 원본 이미지는 RGBA이며 sdcard에 저장하기 위해 OpenCV에 의해 내부적으로만 BGR로 변환됩니다. 이것이 빨간색이 파란색으로 나타나는 이유입니다.</p> 모든 이미지는 <code>Highgui.imwrite</code> 기능을 사용하여 sdcard에 저장되었으므로 Stackoverflow에 업로드하기 위해 내 컴퓨터로 이동할 수 있습니다. 첫 번째 원본 스크린샷의 파란색이 두 번째 이미지에서 빨간색으로 변환된 것을 눈치채셨을 것입니다. 그 이유는 카메라로 캡처한 프레임(즉, 휴대폰 카메라로 캡처한 첫 번째 스크린샷의 사진/프레임)이 RGBA 이미지이기 때문입니다. 그러나 OpenCV는 모든 이미지를 sdcard에 저장할 때 기본적으로 모든 이미지를 BRG로 변환합니다. 따라서 원본 이미지는 RGBA이며 sdcard에 저장하기 위해 OpenCV에 의해 내부적으로만 BGR로 변환됩니다. 이것이 빨간색이 파란색으로 나타나는 이유입니다.</p> Stackoverflow에 업로드하기 위해 내 컴퓨터로 이동할 수 있도록. 첫 번째 원본 스크린샷의 파란색이 두 번째 이미지에서 빨간색으로 변환된 것을 눈치채셨을 것입니다. 그 이유는 카메라로 캡처한 프레임(즉, 휴대폰 카메라로 캡처한 첫 번째 스크린샷의 사진/프레임)이 RGBA 이미지이기 때문입니다. 그러나 OpenCV는 모든 이미지를 sdcard에 저장할 때 기본적으로 모든 이미지를 BRG로 변환합니다. 따라서 원본 이미지는 RGBA이며 sdcard에 저장하기 위해 OpenCV에 의해 내부적으로만 BGR로 변환됩니다. 이것이 빨간색이 파란색으로 나타나는 이유입니다.</p> Stackoverflow에 업로드하기 위해 내 컴퓨터로 이동할 수 있도록. 첫 번째 원본 스크린샷의 파란색이 두 번째 이미지에서 빨간색으로 변환된 것을 눈치채셨을 것입니다. 그 이유는 카메라로 캡처한 프레임(즉, 휴대폰 카메라로 캡처한 첫 번째 스크린샷의 사진/프레임)이 RGBA 이미지이기 때문입니다. 그러나 OpenCV는 모든 이미지를 sdcard에 저장할 때 기본적으로 모든 이미지를 BRG로 변환합니다. 따라서 원본 이미지는 RGBA이며 sdcard에 저장하기 위해 OpenCV에 의해 내부적으로만 BGR로 변환됩니다. 이것이 빨간색이 파란색으로 나타나는 이유입니다.</p> 그 이유는 카메라로 캡처한 프레임(즉, 휴대폰 카메라로 캡처한 첫 번째 스크린샷의 사진/프레임)이 RGBA 이미지이기 때문입니다. 그러나 OpenCV는 모든 이미지를 sdcard에 저장할 때 기본적으로 모든 이미지를 BRG로 변환합니다. 따라서 원본 이미지는 RGBA이며 sdcard에 저장하기 위해 OpenCV에 의해 내부적으로만 BGR로 변환됩니다. 이것이 빨간색이 파란색으로 나타나는 이유입니다.</p> 그 이유는 카메라로 캡처한 프레임(즉, 휴대폰 카메라로 캡처한 첫 번째 스크린샷의 사진/프레임)이 RGBA 이미지이기 때문입니다. 그러나 OpenCV는 모든 이미지를 sdcard에 저장할 때 기본적으로 모든 이미지를 BRG로 변환합니다. 따라서 원본 이미지는 RGBA이며 sdcard에 저장하기 위해 OpenCV에 의해 내부적으로만 BGR로 변환됩니다. 이것이 빨간색이 파란색으로 나타나는 이유입니다.</p><hr>




<h2>참조 솔루션</h2><p><h4>방법 1:</h4> <p>using this code does work for me (C++):</p></p>
<pre><code>    cv::Mat input = cv::imread(

I used this input image (saved and loaded in BGR format although it in fact is a RGB image, that's why we have to use RGB2HSV instead of BGR2HSV):

enter image description here

resulting in this mask:

enter image description here

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:

enter image description here

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...

enter image description here

(by SolaceMicka)

참조 문서

  1. Why isn't inRange function detecting blue color when I have given it the entire possible Hue range for the blue color? (CC BY‑SA 2.5/3.0/4.0)

#opencv4android #hsv #OpenCV #opencv3.0 #Android






관련 질문

사용 가능한 모든 기기를 지원하는 Android NDK 빌드 (Android NDK build to support all available devices)

안드로이드에서 버튼 클릭시 커스텀 카메라 실행 (custom camera launch on button click in android)

나중에 Android에서 실행해야 하는 데스크탑용 OpenCV 애플리케이션 개발 및 테스트 (Developing and testing an OpenCV application on desktop which should later run on Android)

OpenCV4Android를 사용하여 HSV 이미지의 Value 구성 요소를 해제하여 알고리즘이 조명 조건에 덜 민감해지도록 하려면 어떻게 해야 합니까? (Using OpenCV4Android, how do I dismiss the Value component of an HSV image, so that algorithms become less sensitive to light conditions?)

Hue, Saturation, Value의 수치가 주어지면 색상환을 사용하여 색상의 이름을 말하는 방법 (Given the numerical value of Hue, Saturation and Value, how to tell the name of color using a color wheel)

이 OpenCV4Android 샘플 애플리케이션에서 이 코드는 무엇을 합니까? (What does this piece of code do in this OpenCV4Android sample application?)

opencv를 사용하여 이미지에서 파란색을 감지하려고 시도하고 예기치 않은 결과를 얻습니다. (Trying to detect blue color from image using opencv, and getting unexpected result)

rgba() 메서드에서 반환된 이 Mat가 RGBA 형식이 아닌 BGR 형식으로 나타나는 이유는 무엇입니까? (Why does this Mat returned by rgba() method appear to have BGR format rather than RGBA format?)

파란색에 대해 가능한 전체 Hue 범위를 지정했는데 inRange 함수가 파란색을 감지하지 못하는 이유는 무엇입니까? (Why isn't inRange function detecting blue color when I have given it the entire possible Hue range for the blue color?)

OpenCV는 YUV_420_888 평면에서 3개의 매트 개체를 만듭니다. (OpenCV create 3 mat objects from YUV_420_888 planes)

Bazel을 사용하는 프로젝트에 OpenCV android-sdk를 가져오는 방법은 무엇입니까? (How to import OpenCV android-sdk to my project which is using Bazel?)

Android 애플리케이션의 특정 프레임 내 자동 촬영 기능 (Auto picturing feature within specific frame in Android application)







코멘트