실시간 웹캠 스케치 변환

김성빈·2024년 5월 23일
0

Modern Computer Vision

목록 보기
44/117
post-thumbnail


이번 시간에는 jupyter를 사용해서 실습

이유는 예제의 코드가 jupyter 에서 테스트하는것이 편하기 떄문

설치는 생략하고

jupyter을 실행할때 토큰을 입력하라고 나오면 cmd 에서

jupyter notebook list

위 내용을 입력하면

\Users\SmileB>jupyter notebook list
Currently running servers:
http://localhost:8888/?token=37fa53454ee92edbfbae78e6e4bafe9fb17b83a340 :: C:\Windows\System32

이런 출력을 주는데 token= 뒤에있는 부분을 넣어주면된다.

웹캠 스트리밍

우선 기본적인 웹캠의 동작을 확인해야한다.

import cv2
import numpy as np

# 웹캠을 초기화합니다. cap은 VideoCapture 객체입니다.
cap = cv2.VideoCapture(0)

while True:
    # ret는 성공 여부를 나타내는 불리언 값입니다.
    # frame은 웹캠에서 수집한 이미지를 포함합니다.
    ret, frame = cap.read()
    
    # 'Our Webcam Video'라는 창에 프레임을 표시합니다.
    cv2.imshow('Our Webcam Video', frame)
    
    # Enter 키를 누르면 루프를 종료합니다. (13은 Enter 키의 ASCII 코드입니다.)
    if cv2.waitKey(1) == 13: 
        break
        
# 카메라를 해제하고 모든 창을 닫습니다.
cap.release()
cv2.destroyAllWindows()

코드를 실행했을때 웹캠이 실행되면되고

엔터를 누르면 카메라가 꺼진다.

실시간 웹캠 스케치

웹캠이 정상적으로 스트리밍 된것을 확인했으니,

이제 이미지의 가장자리를 추출하고 이진화를 시켜서 스케치한 느낌을 낸다.

따봉추

import cv2
import numpy as np

# 스케치 생성 함수
def sketch(image):
    # 이미지를 그레이스케일로 변환
    img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # Gaussian Blur를 사용하여 이미지 정리
    img_gray_blur = cv2.GaussianBlur(img_gray, (5,5), 0)
    
    # 가장자리 추출
    canny_edges = cv2.Canny(img_gray_blur, 10, 70)
    
    # 이진화된 이미지를 반전
    ret, mask = cv2.threshold(canny_edges, 70, 255, cv2.THRESH_BINARY_INV)
    return mask

# 웹캠을 초기화합니다. cap은 VideoCapture 객체입니다.
cap = cv2.VideoCapture(0)

while True:
    # ret는 성공 여부를 나타내는 불리언 값입니다.
    # frame은 웹캠에서 수집한 이미지를 포함합니다.
    ret, frame = cap.read()
    
    # 스케치 함수에 프레임을 전달하여 실시간으로 창에 표시합니다.
    cv2.imshow('Our Live Sketcher', sketch(frame))
    
    # Enter 키를 누르면 루프를 종료합니다. (13은 Enter 키의 ASCII 코드입니다.)
    if cv2.waitKey(1) == 13: 
        break

# 카메라를 해제하고 모든 창을 닫습니다.
cap.release()
cv2.destroyAllWindows()

코드를 보면 스케치에 해당하는 부분은

def sketch(image):
    # 이미지를 그레이스케일로 변환
    img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # Gaussian Blur를 사용하여 이미지 정리
    img_gray_blur = cv2.GaussianBlur(img_gray, (5,5), 0)
    
    # 가장자리 추출
    canny_edges = cv2.Canny(img_gray_blur, 10, 70)
    
    # 이진화된 이미지를 반전
    ret, mask = cv2.threshold(canny_edges, 70, 255, cv2.THRESH_BINARY_INV)
    return mask

이건데, 이미지를 계속 읽으면서 그레이스케일 > blur > 가장자리 추출 > 이진화(가장자리 나머지는 흰색)

색상을 반대로 하고싶으면

스케치 부분을 수정해주면 된다.
cv2.THRESH_BINARY_IN > cv2.THRESH_BINARY

    # 이진화된 이미지를 반전하지 않음 (기본 상태)
    ret, mask = cv2.threshold(canny_edges, 70, 255, cv2.THRESH_BINARY)
    return mask
profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글