cv::inRange(OpenCV)를 사용하여 색상 감지를 위한 올바른 상한 및 하한 HSV 경계 선택
OpenCV의 cv::inRange 함수에서는 HSV(Hue, 채도, 명도) 색 공간. 이렇게 하면 정확한 색상 감지가 보장되고 효율적인 분할이 가능해집니다.
문제:
커피 캔에 주황색 뚜껑이 있는 이미지가 있다고 가정해 보겠습니다. gcolor2 유틸리티를 사용하여 얻은 뚜껑 중앙의 HSV 값은 (22, 59, 100)입니다. min = (18, 40, 90) 및 max = (27, 255, 255)로 정의된 초기 경계를 사용하면 예상치 못한 탐지 결과가 발생했습니다.
해결책:
문제 1: HSV 범위 변형
다른 애플리케이션에서는 HSV 값에 대해 다른 척도를 사용하는 경우가 많습니다. 예를 들어 GIMP는 H: 0-360, S: 0-100, V: 0-100의 척도를 사용하는 반면 OpenCV는 H: 0-179, S: 0-255, V: 0-255를 사용합니다. 이 경우 김프의 색상 값 22를 OpenCV에서는 그 값의 절반을 빼서 11로 변환해야 합니다. 따라서 수정된 경계는 (5, 50, 50) - (15, 255, 255)가 됩니다.
문제 2: 색 공간 호환성
OpenCV는 BGR을 사용합니다. (청색-녹색-적색) 색상 형식이며 RGB가 아닙니다. 호환성을 보장하려면 RGB를 HSV로 변환하는 코드를 다음과 같이 수정해야 합니다.
cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)
업데이트된 코드:
import cv in_image = 'kaffee.png' out_image = 'kaffee_out.png' out_image_thr = 'kaffee_thr.png' ORANGE_MIN = cv.Scalar(5, 50, 50) ORANGE_MAX = cv.Scalar(15, 255, 255) COLOR_MIN = ORANGE_MIN COLOR_MAX = ORANGE_MAX def test1(): frame = cv.LoadImage(in_image) frameHSV = cv.CreateImage(cv.GetSize(frame), 8, 3) cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV) frame_threshed = cv.CreateImage(cv.GetSize(frameHSV), 8, 1) cv.InRangeS(frameHSV, COLOR_MIN, COLOR_MAX, frame_threshed) cv.SaveImage(out_image_thr, frame_threshed) if __name__ == '__main__': test1()
결과:
업데이트된 코드를 실행하면 주황색이 더 정확하게 분할됩니다.
참고:
배경의 비슷한 색상으로 인해 약간의 잘못된 감지가 있을 수 있습니다. 이 문제를 해결하려면 윤곽 분석과 같은 추가 처리를 적용하여 뚜껑에 해당하는 가장 큰 윤곽을 분리할 수 있습니다.
위 내용은 OpenCV에서 정확한 색상 감지를 위해 올바른 HSV 상한 및 하한 경계를 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!