728x90
반응형
저번 포스팅에 이제 화면에 나오는 물체의 윤곽선을 만드는 코드를 구현해 보았으니 이번에는 특정 객체를 쫓는 객체 탐지를 구현해 봅시다.
일단 그러기 전에 HSV와 마스크생성하는 방법을 알아야 합니다.
HSV의 이해
- HSV 색상 공간 이란? 색상(Hue), 채도(Saturation), 명도(Value)로 표현되는 색 공간
- Hue(색상) : 색상의 종류를 나타내며, 각 색상은 0˚에서 360˚로 표현됨, OpenCV에서는 0~179의 값으로 정규화
- Saturation(채도) : 색의 선명도 또는 탁도를 나타내며 값이 0에 가까울수록 회색에 가까워지고, 값이 클수록 원색에 가까워짐(범위: 0~ 255)
- Value(명도) : 색의 밝기를 나타내며 0에 가까울수록 어둡고, 255에 가까울수록 밝아진다.
- 인간의 시각적 인식 특성상, RGB보다 HSV 공간에서 특정 색상을 정의하는 것이 용이함, 예를 들어, 특정 색 범위를 설정하여 원하는 색상의 물체를 추적할 수 있음
마스크 생성
- inRange() : OpenCV에서 특정 색생 범위를 이용한 마스크를 생성
- inRange(이미지, lowerb, upperb)
- src : HSV 또는 BGR로 변환된 이미지
- lowerb : 색상의 하한 값(예 : np.array([H_lower, S_lower, V_lower]))
- upperb : 색상의 상한 값(예 : np.array([H_upper, S_upper, V_upper]))
- 마스크의 역활 : 이미지를 읽어 픽셀 단위로 lowerb와 upperb 사이에 있는 값이면 흰색(255), 아니면 검은색(0)으로 마스크 이미지를 생성, 이 마스크를 이용해 원본 이미지에서 특정 색상에 해당하는 영역만 추출할 수 있음
그럼 간단히 알아 보았으니 실습을 해봅시다.
실습. 원본이미지에 마스크 적용
- BGR 이미지를 HSV로 변환 합니다. (img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
- 색상범위를 설정 해줍니다. (저는 빨간색으로 설정했습니다.)
- 마스크를 생성 해줍니다.
- 원본 이미지에 마스크를 적용합니다.
- 출력할 때는 plt명령어를 사용하여 BGR2RGB로 변경하여 imshow 합니다.
여기에 추가적인 메서드가 있으나, 저는 언급만 하고 넘어가도 록 하겠습니다.
메서드
- bitwise_and(src1, src2, [dst], [mask]) : 두 이미지 간의 비트 연산(AND)을 수행하는 OpenCV함수로, 주로 이미지에서 특정 영역을 추출하거나 마스크를 적용할 때 사용됨
- src1 : 첫 번째 입력 이미지 (배열 형식), 주로 원본 이미지가 사용
- src2 : 두 번째 입력 이미지 (배열 형식), 일반적으로 마스크로 사용되며, 원본 이미지와 크기와 채널 수가 같아야 함
- dst (선택 사항) : 출력 결과를 저장할 배열, 지정하지 않으면 새 배열에 결과를 반환
- mask (선택 사항) : 비트 연산을 적용할 특정 영역을 지정하는 마스크 (배열 형식), 이 마스크가 있을 경우, 지정된 마스크 영역에만 연산이 수행
- erode() : 이미지에서 밝은 영역(흰색)이나 객체를 축소(침식), 주로 객체의 경계에서 노이즈를 제거하거나 구멍을 메우는 데 사용됨
- 매개변수 :
- src : 입력 이미지 (그레이스케일 또는 바이너리 이미지)
- kernel : 구조적 요소(커널), 연산에 사용되는 행렬로, 기본값은 None이며, 사용자 정의 또는 cv2.getStructuringElement()로 생성 가능
- iterations (선택 사항) : 침식을 반복 수행할 횟수, 기본값은 1
- 동작 원리:
- 커널이 이미지 위를 슬라이딩하며, 커널 내부의 최소값을 출력 픽셀로 설정, 흰색(밝은 영역)이 줄어듬
- dilate() : 이미지에서 밝은 영역(흰색)이나 객체를 확장(팽창)합니다. 주로 객체를 강조하거나 구멍을 메우는 데 사용됨
- 매개변수 :
- src : 입력 이미지 (그레이스케일 또는 바이너리 이미지)
- kernel : 구조적 요소(커널), 침식과 동일하게 사용되며, 기본값은 None
- iterations (선택 사항) : 팽창을 반복 수행할 횟수, 기본값은 1
- 동작 원리 :
- 커널이 이미지 위를 슬라이딩하며, 커널 내부의 최대값을 출력 픽셀로 설정합니다. 흰색(밝은 영역)이 확장됨
자 이제 본론으로 들어가 봅시다 영상을 통한 얼굴인식 해봅시다!!!
얼굴 인식
- Haar Cascade
- OpenCV에서 기본 라이브러리로 제공하는 Haar Cascade는 기계학습을 이용한 객체 탐지 알고리즘
- CNN이나 RSTM 등의 신경망이 아닌, 하르 특징 (Haar Features) 계산을 통해 객체를 찾음
- 사전 학습된 분류기 (haarcascade_frontalface_alt.xml) 를 로드한 뒤, cv2를 통해 분류기를 생성
OpenCV DNN
- OpenCV의 DNN(Deep Neural Network) 모듈은 사전 학습된 딥러닝 모델(Caffe, TensorFlow, Darknet, ONNX 등)을 불러와 추론을 수행 할 수 있음
- Haar Cascade를 활용한 얼굴 검출 및 눈/입 탐지
- YOLO 모델을 이용한 객체 탐지
Haar Cascade
- Haar Cascades는 기계학습 기반의 검출기, OpenCV에서 사전 학습된 Haar Cascade XML 파일 제공
- CascadeClassifier('haarcascade_frontalface_default.xml')
- detectMultiScale(image, scaleFactor, minNeighbors, minSize)
- scaleFactor : 이미지 스케일리 비율
- minNeighbors : 검출 후 이웃하는 사각형 수(값이 높을수록 정확성 증가)
- minSize : 검출 최소 크기
- 얼굴 검출 후, 얼굴 ROI(Region of Interest) 내에서 눈이나 입에 대한 또 다른 Cascade를 적용 가능
참 얼굴 인식 한번 하기 힘들죠;;
그래도 이제 실습을 통해서 얼굴 인식을 할 수있습니다!!
실습. 얼굴인식
- Haar cascade 불러와서 저장합니다. (cv2.CascadeClassifier(cv2.data.haarcascades + ' haarcascade_frontalface_default.xml ')
- 웹 캠이나 캠을 연결합니다.
- 그레이 스케일로 변환합니다.
- 얼굴 탐지를 위해 detectMutiScale을 이용합니다.
- 탐지된 얼굴에 사각형 그리기 위해서 다음 반복문을 사용해 줍니다
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
- 실행 하여서 제대로 객체 탐지가 되는지 확인합니다.
오늘도 같이 공부하시느라 수고 많으셨습니다!!!!!!

반응형
'python 시작하기' 카테고리의 다른 글
python Folium (0) | 2025.01.10 |
---|---|
python YOLO (1) | 2025.01.10 |
python OpenCV 컨투어 탐지 (0) | 2025.01.09 |
python OPEN CV를 더욱 깔끔하게 전 처리 해보자! (1) | 2025.01.08 |
python OPEN CV를 활용하여 이미지를 저장해보자! (0) | 2025.01.08 |