머신러닝 22일차

ParkJinYoung·2022년 11월 16일
0

이미지 색상 분포 균일화

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('data/histogram.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('original',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 이미지, 채널, 특정부분 마스크
hist= cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist)
plt.xlim([0,255])
plt.show()

img = cv2.equalizeHist(img)
cv2.imshow('equalize',img)
hist= cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist)
plt.xlim([0,255])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

이미지 원찾기


import cv2
import numpy as np

img=cv2.imread('data/signal_light.jpg')
img_gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

# 원 찾기
# 사용이미지, 찾는 방법, 변환 이미지 비율(1 추천), 원 중심간의 최소거리
circles = cv2.HoughCircles(img_gray, cv2.HOUGH_GRADIENT,1,10,
                          param1 = 60, # Canny 연산자의 최대값
                          param2 = 50, # 카운트값(작으면 많은 원을 찾음)
                          minRadius = 10, # 원의 최소 반지름
                          maxRadius = 100) # 원의 최대 반지름
print(circles)

# X중심점, Y중심점, 반지름
# 찾은 원 이미지에 표현하기
if circles is not None:
    circles= np.uint16(np.around(circles))
    
    # 원을 하나씩 그리기
    for circle in circles[0,:] :
        # 사용이미지, 중심 좌표, 반지름 , 원 색상, 선 두께 
        cv2.circle(img,(circle[0],circle[1]),circle[2],(255,0,0),4)
    
    cv2.imshow('circle',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

템플릿매칭

#이미지 안에서 원하는 이미지를 검색하는방법

import cv2
import numpy as np

img=cv2.imread('data/game.png')
img_gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
temp=cv2.imread('data/game_cut.png',cv2.IMREAD_GRAYSCALE)

#찾으려는 이미지 가로,세로크기저장
h,w=temp.shape

#배경이미지, 찾을이미지, 찾을방법
res=cv2.matchTemplate(img_gray, temp, cv2.TM_CCOEFF_NORMED)

# 각 픽셀에서 찾을 이미지와 배경이미지가 얼마나 유사한지 표현
# 0.6 ~ 0.7 정도 나와야 유사
# np.where : True 값의 위치(인덱스)를 반환
loc = np.where(res>=0.678)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0]+w, pt[1]+h),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

loc[::-1] # 순서를 역순으로 출력
arr = np.arange(10)
arr[::2] # 처음부터 끝까지 두 칸 간격으로 출력
arr[::-2] # 처음부터 끝까지 -2칸 간격으로 출력 (=역순, 두칸간격으로)
arr[1::2] # 1번 인덱스 부터 끝까지 두 칸 간격으로 출력
arr[1:6:2] # 1번 인덱스부터 5번 인덱스 까지 두 칸 간격으로 출력

Haar Cascade 분류기를 사용한 얼굴, 눈 검출

import cv2
# 얼굴 검출기 (얼굴 알고리즘)
face_cascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")
# 얼굴 안에 있는 눈 검출기 (눈 알고리즘)
eye_cascade = cv2.CascadeClassifier("data/haarcascade_eye.xml")

img= cv2.imread('data/face.jpg')
img_gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

# 얼굴 검출기 적용해서 얼굴좌표 가져오기(좌상단 x, 좌상단 y, 너비(w), 높이(h))
# 이미지, 스케일값, 최소이웃값
faces = face_cascade.detectMultiScale(img_gray,1.3,5)
faces

for (x,y,w,h) in faces:
    # 이미지 , 좌상단좌표, 우하단좌표, 색깔, 두께
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    # 눈 검출
    # 얼굴안에 눈이 있기 때문에 얼굴영역 안에서 진행
    # 얼굴 ROI(Region of Image) 저장
    roi_gray= img_gray[y:y+h,x:x+w]
    roi_color=img[y:y+h,x:x+w]
    
    #(좌상단 x, 좌상단 y, 너비(w), 높이(h))
    # 이미지, 스케일값, 최소이웃값
    eyes = eye_cascade.detectMultiScale(roi_gray,1.035,2)
    
    #눈 영역을 이미지에 표시하기
    for (ex, ey, ew, eh) in eyes :
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,0,255),2)
    
    
    
cv2.imshow('face',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

동영상 얼굴 검출

cap = cv2.VideoCapture('data/ellon.mp4')
# 얼굴 검출기 (얼굴 알고리즘)
face_cascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")
# 얼굴 안에 있는 눈 검출기 (눈 알고리즘)
eye_cascade = cv2.CascadeClassifier("data/haarcascade_eye.xml")

while True:
    ret, frame = cap.read()
    if not ret :
        print('동영상을 종료합니다.')
        cap.release()
        cv2.destraoyAllWindows()
        break
        
        
    img_gray=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
    faces = face_cascade.detectMultiScale(img_gray,1.3,5)
    for (x,y,w,h) in faces:
        # 이미지 , 좌상단좌표, 우하단좌표, 색깔, 두께
        cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
        # 눈 검출
        # 얼굴안에 눈이 있기 때문에 얼굴영역 안에서 진행
        # 얼굴 ROI(Region of Image) 저장
        roi_gray= img_gray[y:y+h,x:x+w]
        roi_color=frame[y:y+h,x:x+w]

        #(좌상단 x, 좌상단 y, 너비(w), 높이(h))
        # 이미지, 스케일값, 최소이웃값
        eyes = eye_cascade.detectMultiScale(roi_gray,1.035,1)

        #눈 영역을 이미지에 표시하기
        for (ex, ey, ew, eh) in eyes :
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,0,255),2)
            
    cv2.imshow('face',frame)
    k=cv2.waitKey(10)
    
    if k==49:
        cap.release()
        cv2.destroyAllWindows()
        break

mediapipe

import cv2
import mediapipe as mp

# 결과를 시각화하는 기능
mp_drawing = mp.solutions.drawing_utils

# 얼굴 메시 추출하는 기능
mp_face_mesh = mp.solutions.face_mesh

# 시각화 설정
#drawing_spec = mp_drawing.DrawingSpec(thickness = 1, circle_raduis=1)
drawing_spec= mp_drawing.DrawingSpec(thickness=1,circle_radius=1)

cap = cv2.VideoCapture('data/face3.mp4')

results=None

# 얼굴 메시 추출(최소 검출 정확도,최소 추적 정확도)

with  mp_face_mesh.FaceMesh(min_detection_confidence=0.5,
                           min_tracking_confidence=0.5) as face_mesh:
    while True:
        ret, frame = cap.read()
        if not ret:
            cap.release()
            cv2.destroyAllWindows()
            break
        # 이미지 쓰기 불가 설정
        # =>읽기만 한다 이미지를 읽어올때 수정을 거치지않아 조금더 빠르다
        frame.flags.writeable = False
        
        # 메시 검출 (랜드마크 검출)
        results = face_mesh.process(frame)
        
        frame.flags.writeable= True
        
        # 랜드마크를 연결
        # 랜드마크에서 점이 검출 되었다면
        if results.multi_face_landmarks:
            for face_landmark in results.multi_face_landmarks:
                mp_drawing.draw_landmarks(
                    # for문안에서 계속 그리는중
                    image = frame,
                    landmark_list= face_landmark,
                    # 얼굴 전체
                    connections = mp_face_mesh.FACEMESH_TESSELATION,
                    
                    # 그리기 설정
                    landmark_drawing_spec=drawing_spec,
                    connection_drawing_spec=drawing_spec
                )
        
        cv2.imshow('face',frame)
        
        k= cv2.waitKey(33)
        
        if k ==49:
            cap.release()
            cv2.destroyAllWindows()
            break
profile
꾸준히

0개의 댓글