250908 [ Day 45 ] - AI, OpenCV (1)

TaeHyun·2025년 9월 8일

TIL

목록 보기
47/182

시작하며

오늘부터 AI와 OpenCV 파트가 시작됐다. AI에 대한 기초적인 지식부터 OpenCV에 대한 기본적인 기능 등을 다뤄보았다. OpenCV가 macOS에서 최적화가 안 되어 있는지 초반 설치 및 설정 부분에서 에러가 많아서 시간을 많이 잡아먹었다. 수업을 진행하면서도 계속 에러가 발생해서 빨리 해결책을 찾아봐야 할 것 같다.

AI

  • AI > 머신러닝 > 딥러닝 > 인공 신경망

인공진능(AI)이란?

  • 인간의 지능을 모방한 기능을 갖춘 컴퓨터 시스템
  • 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현

인공지능의 활용

  • 대화형 인공지능
  • 생성형 AI
  • 휴머노이드 로봇

머신러닝

  • 컴퓨터 또는 기계가 데이터를 이용하여 직접 학습하는 알고리즘
  • 사람이 직접 프로그램을 만들어서 기계에 넣어 주는 것이 아니라, 기계가 스스로 문제를 해결하는 방법을 학습하는 것

딥 러닝

  • 사람의 뇌를 모방한 구조인 '인공 신경망'을 사용하여 데이터를 학습하고 문제를 해결하는 기술

인공 신경망

  • 사람의 두뇌의 뉴런을 기반으로 모델링 된 다층 구조 노드들의 네트워크
  • 인공 뉴런은 노드라고 하며, 여러 레이어로 클러스터화 되고 병렬로 작동
  • 다층 구조 (입력층, 은닉층, 출력층)
    • 입력층 : 데이터를 받아들이는 역할
    • 은닉층 : 입력층에서 들어온 데이터를 처리하고 패턴을 학습. 여러 신호로 바뀌어서 출력층까지 전달
    • 출력층 : 최종 결과를 출력(예측 값 생성)

인공 신경망과 데이터

  • 인공지능(AI)을 만들기 위해서는 데이터가 필수
  • 데이터 수가 많을수록 정확성 증가
  • 많은 양의 데이터와 고성능의 하드웨어가 필요
  • 데이터를 바탕으로 결과를 생성하기 위한 학습 과정이 필요

머신 비전

  • 컴퓨터나 기계가 시각적인 역할을 처리할 수 있도록 연구하는 분야
  • 시각 정보의 빛의 양을 숫자로 변환한 데이터를 처리

아날로그 / 디지털

  • 아날로그 : 연속적으로 변화하는 물리량
  • 디지털 : 데이터나 물리적인 양을 0과 1이라는 2진 부호의 숫자로 표현

디지털 변환

  • 샘플링 : Sample Rate
  • 양자화 : Quantization (bit)
  • 샘플링, 양자화를 거쳐 실제 장면이 픽셀(Pixel) 단위의 숫자로만 이루어진 영상 데이터(2차원 배열)로 변환

OpenCV

  • Open Source Computer Vision Library
  • Intel에서 최초 개발 (1999)
  • C/C++, C#, Python, Java 지원
  • 설치 : pip install opencv-python
  • 불러오기 : import cv2 as cv

이미지 입력, 출력, 쓰기

이미지 입출력

  • imread(path) : 이미지 입력
  • imshow(winame, img) : 이미지 출력
  • waitkey(ms) : ms초 만큼 키 입력을 기다림, 0의경우 무한대기
  • destroyAllWindows() : 열려 있는 모든 창을 종료
    • 맥 os 에서는 destroyAllWindows() 아래에 waitkey(1) 추가
# 상수 변수 = 대문자 스네이크 케이스 사용
DOG_PATH = "../images/dog.jpg"

img = cv.imread(DOG_PATH)

cv.imshow("DOG", img)

key = cv.waitKey(0)
cv.destroyAllWindows()
cv.waitKey(1)
  • ord(key) : 문자의 아스키 코드 획득
  • chr(key) : 아스키 코드를 문자로 변경

이미지 불러오기

  • cv2.IMREAD_COLOR : 이미지를 컬러로 불러옴(기본값), 투명배경 무시
  • cv2.IMREAD_GRAYSCALE : 이미지를 흑백으로 불러옴
  • cv2.IMREAD_UNCHANGED : 이미지를 컬러로 불러옴, 투명배경 인식(alpha값 포함)
    • alpha값 : 이미지의 투명도 정보를 제공
img_default = cv.imread(DOG_PNG_PATH, cv.IMREAD_COLOR)
img_gray = cv.imread(DOG_PNG_PATH, cv.IMREAD_GRAYSCALE)
img_unchanged = cv.imread(DOG_PNG_PATH, cv.IMREAD_UNCHANGED)

cv.imshow("Default", img_default)
cv.imshow("Grayscale", img_gray)
cv.imshow("Unchanged", img_unchanged)

cv.waitKey(0)
cv.destroyAllWindows()
cv.waitKey(1)

이미지 Shape

  • 이미지의 구조(세로, 가로, 채널)를 출력
img_default = cv.imread(DOG_PNG_PATH, cv.IMREAD_COLOR)
img_gray = cv.imread(DOG_PNG_PATH, cv.IMREAD_GRAYSCALE)
img_unchanged = cv.imread(DOG_PNG_PATH, cv.IMREAD_UNCHANGED)

print("Default shape", img_default.shape)
print("Grayscale shape", img_gray.shape)
print("Unchanged shape", img_unchanged.shape)
# Default shape (476, 320, 3)
# Grayscale shape (476, 320)
# Unchanged shape (476, 320, 4)

이미지 쓰기

  • imwrite(path, img) : 불러온 이미지를 파일로 생성
img = cv.imread(DOG_PATH)
cv.imwrite("../output/dog_copy.jpg", img)

비디오 입력, 출력, 쓰기

  • Video : 연속된 이미지를 재생하는 것
  • frame : 연속된 이미지 중 하나
  • fps : frame per second -> 1초에 몇 프레임을 재생할건지

비디오 파일 입출력

  • cv2.VideoCapture(path) : path의 파일을 불러옴
    • path에 int index 사용시 연결되어있는 디바이스에 접근 (기본 카메라의 경우는 0)
  • VideoCapture.isOpened() : 파일이 열렸는지를 확인 (True/False)
  • VideoCapture.read() : 파일을 읽어서 frame을 반환
    • ret : 프레임이 존재하는지 체크 (True/False)
    • frame : 불러온 이미지
  • VideoCapture.release() : 영상 객체를 해제
# 비디오 출력시 반복문 활용
cap = cv.VideoCapture(DOG_VIDEO_PATH)

while cap.isOpened():
    ret, frame = cap.read()

    if not ret:
        break
    cv.imshow("Video", frame)
    
    if cv.waitKey(10) == ord("q"):
        break

cap.release()
cv.destroyAllWindows()
cv.waitKey(1)

영상의 프레임 불러오기

  • VideoCapture.get(cv2.CAP_PROP_FPS) : 영상의 fps 값 불러오기
  • 1000 / fps = frame
cap = cv.VideoCapture(DOG_VIDEO_PATH)
fps = cap.get(cv.CAP_PROP_FPS)

while cap.isOpened():
    ret, frame = cap.read()

    if not ret:
        break
    cv.imshow("Video", frame)
    
    if cv.waitKey(int(1000/fps)) == ord("q"):
        break

cap.release()
cv.destroyAllWindows()
cv.waitKey(1)

카메라 입출력

  • if cv.waitKey(1) != -1 : 어떤 입력이든 주어지면
  • 카메라 화면 크기 조절
    • cap.set(cv.CAP_PROP_FRAME_WIDTH, Size)
    • cap.set(cv.CAP_PROP_FRAME_HEIGHT, Size)
cap = cv.VideoCapture(0)

while cap.isOpened():
    ret, frame = cap.read()

    if not ret:
        break
    
    cv.imshow("Camera", frame)

    if cv.waitKey(1) != -1:
        break

cap.release()
cv.destroyAllWindows()
cv.waitKey(1)

  • 카메라 화면 캡쳐하기
cap = cv.VideoCapture(0)
count = 1

while cap.isOpened():
    ret, frame = cap.read()

    if not ret:
        break
    
    cv.imshow("Camera", frame)

    key = cv.waitKey(1)

    if key == ord("c"):
        filename = f"../output/capture_{count}.png"
        cv.imwrite(filename, frame)
        print(f"{filename.split("/")[2]} 저장!")
        count += 1
    elif key == ord("q"):
        break

cap.release()
cv.destroyAllWindows()
cv.waitKey(1)

비디오 쓰기

  • cv2.VideoWriter(path, fourcc, fps, (width, height)) : 영상을 파일로 쓰기위한 객체 생성
  • cv2.VideoWriter_fourcc(fourcc) : 영상을 쓰기위한 인코딩 생성
    • fourcc : 영상의 인코딩 ex) H.264
cap = cv.VideoCapture(DOG_VIDEO_PATH)

fourcc = cv.VideoWriter_fourcc(*"H264")
fps = cap.get(cv.CAP_PROP_FPS)
width = round(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = round(cap.get(cv.CAP_PROP_FRAME_HEIGHT))

out = cv.VideoWriter("../output/dog_copy.mp4", fourcc, fps, (width, height))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    cv.imshow("Video", frame)
    out.write(frame)

    if cv.waitKey(int(1000/fps)) == ord("q"):
        break

out.release()
cap.release()
cv.destroyAllWindows()
cv.waitKey(1)

이미지 기본 조작

빈 화면 만들기

  • Numpy 배열로 이미지를 출력할 수 있음
  • 데이터 타입을 uint8로 설정
    • uint = Unsinged Integer -> 부호가 없는 정수 = 0, 양수
    • 0 ~ 255까지 표현할 수 있는 수
img = np.zeros((460, 640, 3), dtype=np.uint8)

cv.imshow("Black", img)

cv.waitKey(0)
cv.destroyAllWindows()
cv.waitKey(1)

마치며

걱정했던 것에 비해서는 첫날은 순조롭게 지나갔다. 약 2주간 진행되는 AI와 OpenCV 파트이다. 지금부터 복습을 철저하게 해서 2주 뒤에 AI와 OpenCV에 대해서 만족스러운 지식을 쌓을 수 있으면 좋겠다.

NOTION

MY NOTION (AI)

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글