오늘보다 더 나은 내일의 나에게_

비전공자의 IoT 국비 교육 수강일지 Day_86 본문

비전공자의 코딩일지

비전공자의 IoT 국비 교육 수강일지 Day_86

chan_96 2022. 4. 20. 12:52
728x90

머신러닝

특정색상 검출
import cv2

fruits_img = cv2.imread("./fruits.jpg")
fruits_img_HSV = cv2.cvtColor(fruits_img,cv2.COLOR_BGR2HSV)

# 빨간색 영역 검출 (0~5와 170~179 영역을 병합)
lower_red = cv2.inRange(fruits_img_HSV, (0, 100, 100), (5, 255, 255))
upper_red = cv2.inRange(fruits_img_HSV, (170, 100, 100), (180, 255, 255))
added_red = cv2.addWeighted(lower_red, 1.0, upper_red, 1.0, 0.0)

cv2.imshow("origin",fruits_img)
cv2.imshow("HSV",fruits_img_HSV)
cv2.imshow("red_HSV",added_red)
cv2.waitKey(0)
cv2.destroyAllWindows()

노란색 영역 추출
yellow = cv2.inRange(fruits_img_HSV, (25, 100, 100), (28, 255, 255))
result = cv2.bitwise_and(fruits_img,fruits_img,mask=yellow)

cv2.imshow("binary_yellow",yellow)
cv2.imshow("origin_yellow",result)
cv2.waitKey(0)
cv2.destroyAllWindows()​

이미지 처리 방법

  1. 픽셀 기반 처리 : 픽셀값을 직접 처리
  2. 영역 기반 처리 : 픽셀을 그룹화해서 처리 -> 히스토그램 -> 분포의 확률
  3. 주파수 기반 처리 : 픽셀값을 주파수로 변환하여 처리 -> 푸리에 변환
    • 주파수라는 것은 파동의 떨림이 얼마나 자주 일어나는가를 정의

픽셀기반처리(ROI : Region of Image 영역 검출)

dog_img =cv2.imread("./dog/2.png")
print(dog_img.shape)

dog_face_img = dog_img[40:130, 70:150] # 행, 열

cv2.imshow("dog",dog_img)
cv2.imshow("dog_face_img",dog_face_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
자른 사진 결과

ROI 영역에 그리기 함수 사용

  • cv2.line(이미지, 시작점 좌표, 끝점 좌표, 색상, 두께) : 선 그리기
  • cv2.circle(이미지, 중심 좌표, 반지름, 색상, 두께) : 원 그리기
  • cv2.rectangle(이미지, 좌상단 좌표, 우하단 좌표, 색상, 두께) : 사각형 그리기
  • cv2.eilipse(이미지, 중심좌표, 장축길이/단축길이, 시작각도, 끝각도, 색상, 두께) : 타원그리기
  • cv2.putText(이미지, 출력내용, 시작좌표, 폰트, 크기, 색상, 굵기) : 텍스트 출력
dog_img =cv2.imread("./dog/2.png")

# ROI영역에 사각형 그리기
cv2.rectangle(dog_img,(70,40),(150,130),(255,0,0),2)
cv2.circle(dog_img,(110,85),50,(0,0,255),2)

# 글자 출력하기
cv2.putText(dog_img,'face',(40,150),cv2.FONT_HERSHEY_COMPLEX,1,
           (0,255,0),1)

cv2.imshow("dog",dog_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

도형 띄우기

글자 띄우기

얼굴 검출

  • 머신러닝 기반의 얼굴검출모델 활용
  • haar casecade 기반의 알고리즘
cv2.data.haarcascades
# => 'C:\\Users\\smhrd\\anaconda3\\envs\\animal_deep\\lib\\site-packages\\cv2\\data\\'
# 얼굴검출 모델 사용하기
face_model = cv2.CascadeClassifier(cv2.data.haarcascades+"haarcascade_frontalface_default.xml")

face_img = cv2.imread('./face.png')

# 얼굴 검출 : 사진이 그레이스케일 이미지여야한다.(현재는 함수 내부적으로 처리)
# detectMultiScale(이미지, 스케일, 최소이웃값)
faces = face_model.detectMultiScale(face_img, 1.2,5)
print(len(faces))
#print(faces)
n = 0
for(x,y,w,h) in faces:
    cv2.rectangle(face_img,(x,y),(x+w,y+h),(0,0,255),2)
    # 관심영역 자르기 -> image[시작행:끝행,시작열,끝열]
    # imshow 호출
    tmp = face_img[y:y+h,x:x+w]
    n += 1
    cv2.imshow("face"+str(n),tmp)
    
cv2.imshow("face",face_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
얼굴에 사각형 표시
얼굴만 따로 잘라서 출력

동영상에서 얼굴검출하기

  • 얼굴영역 사각형 표시하기
# 얼굴검출 모델 사용하기
face_model = cv2.CascadeClassifier(cv2.data.haarcascades+"haarcascade_frontalface_default.xml")

#반복문 이용해서 영상 출력하기
try : 
    print("영상로딩을 시작합니다..")
    video_cap = cv2.VideoCapture("./movie4.mp4")
    #video_cap = cv2.VideoCapture(0) 0으로 작성시 컴퓨터와 연결된 카메라 연동
    
    while True:
        ret,frame = video_cap.read()
        
        if ret :
            # 얼굴검출 코드 추가
            faces = face_model.detectMultiScale(frame, 1.2,10)
            for(x,y,w,h) in faces:
                cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
            
            cv2.imshow("video",frame)
            k = cv2.waitKey(25) # 초당 프레임수를 맞추기 위함 : 1000/24
        else:
            break;
            
        if k == 27 : #27번은 ESC
            break;
            
    cv2.destroyAllWindows()
    video_cap.release()
except :
    print("영상로딩 실패")​
뮤비 영상 캡쳐

 

728x90
Comments