머신러닝_OpenCV 2

홍성채·2022년 4월 20일
0

머신러닝

목록 보기
10/15

특정색상 검출하기

  • 사진은 읽어온 후 사이즈 조절, 컬러 색상으로 변경하기
      fruits_imgs = cv2.imread("./fruit.png")
      fruits_img = cv2.resize(fruits_imgs, dsize=(400,400))
      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)
  • 영역 구분 후 출력하기

    result = cv2.bitwise_and(fruits_img,fruits_img, mask=added_red)
    
    cv2.imshow("origin",fruits_img)
    cv2.imshow("HSV",fruits_img_HSV)
    cv2.imshow("red_HSV",added_red)
    cv2.imshow("origin_red",result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    mask : 계산할 영역을 지정해주는 역할

노랑색 구분하기

yellow = cv2.inRange(fruits_img_HSV,(22,100,100),(45,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 영역 검출)
    egg_img = cv2.imread("./egg/25.png")
    print(egg_img.shape)
    egg_face_img = egg_img[30:120, 55:200] 
    cv2.imshow('egg',egg_img)
    cv2.imshow('egg_face',egg_face_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    egg_img[30:120, 55:200](행, 열) 자를 영역을 설정한다.
    • 실행결과

ROI 영역에 그리기 함수 사용하기

  • cv2.line(이미지, 시작점 좌표, 끝점 좌표, 색상, 두께) : 선 그리기

  • cv2.circle(이미지, 중심 좌표, 반지름, 색상, 두께) : 원 그리기

  • cv2.rectangle(이미지, 좌상단 좌표, 우하단 좌표, 색상, 두께) : 사각형 그리기

  • cv2.eilipse(이미지, 중심좌표, 장축길이/단축길이, 시작각도, 끝각도, 색상, 두께) : 타원그리기

  • cv2.putText(이미지, 출력내용, 시작좌표, 폰트, 크기, 색상, 굵기) : 텍스트 출력

    • rectangle, 문구 출력하기

      egg_img = cv2.imread("./egg/25.png")
      print(egg_img.shape)
      #ROI영역에 사각형 그리기
      cv2.rectangle(egg_img,(50,100),(150,30),(255,0,0),2)
      #글자 출력하기
      cv2.putText(egg_img,'egg',(70,140),cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),1)
      cv2.imshow('egg',egg_img)
      
      cv2.waitKey(0)
      cv2.destroyAllWindows()
      • 실행화면
    • circle, 문구 사용하기

      egg_img = cv2.imread("./egg/25.png")
      print(egg_img.shape)
      #ROI영역에 사각형 그리기
      
      cv2.circle(egg_img,(100,65),50,(255,0,0),2)
      #글자 출력하기
      cv2.putText(egg_img,'egg',(70,140),cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),1)
      cv2.imshow('egg',egg_img)
      
      cv2.waitKey(0)
      cv2.destroyAllWindows()
      • 실행화면

얼굴 검출

  • 머신러닝 기반의 얼굴 검출 모델활용

  • haar casecade 기반의 알고리즘

    • 파일 설치하기
       cv2.data.haarcascades
    • 얼굴 검출 소스
      #얼굴 검출 모델 사용하기
      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) #얼굴이라 예측되는 좌표를 알려줌
      for(x,y,w,h) in faces : 
          cv2.rectangle(face_img,(x,y),(x+w,y+h),(0,0,255),2)
      
      cv2.imshow("face",face_img)
      cv2.waitKey(0)
      cv2.destroyAllWindows()
    • 얼굴 검출 소스 + 얼굴 인식하여 자른 후 출력
      #얼굴 검출 모델 사용하기
      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[시작행:끝행, 시작열:끝열]
          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("./jung.mp4")# 0은 실시간
          while True :
              ret, frame = video_cap.read()
              if ret :
                  #얼굴 검출 코드 추가
               
                  faces = face_model.detectMultiScale(frame,1.2,3)
                  for(x,y,w,h) in faces :
                      cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),3)
                  cv2.imshow("video",frame)
                  k = cv2.waitKey(38)#초당 프레임수를 맞추기 위함 : 1000/24
              else :
                  break;
               
              if k == 27: #27번은 ecs
                  break;
          cv2.destroyAllWindows()
          video_cap.release()
      except : 
         print("영상로딩 실패")
profile
초보 코딩

0개의 댓글