ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5월 30일 TIL - 이미지/동영상 처리
    TIL(Today I Learned) 2023. 5. 30. 20:44

    ▷ 오늘의 일정

    09:10 ~ 10:10 [발제] 주특기 실전
    10:10 ~ 12:00 알고리즘 문제풀기
    12:00 ~ 13:00 점 심 식 사
    13:00 ~ 18:00 딥러닝을 통한 이미지처리 구현
    18:00 ~ 19:00 저 녁 식 사
    19:00 ~ 20:40 하루 공부 내용 정리 및 TIL
    20:40 ~ 21:00 하루 공부 내용 공유

     

    ▷ 오늘의 배움

     

    📖 이미지 처리 기초

    • 이미지 위에 사각형 / 원형 그리기
    import cv2
    
    # 이미지 불러오기
    img = cv2.imread('01.jpeg')
    
    # 사각형 그리기
    cv2.rectangle(img, pt1=(259, 89), pt2=(380,348), color=(255,0,0), thickness=2)
    # pt1은 왼쪽 위 꼭짓점, pt2는 오른쪽 아래 꼭짓점의 위치/ color는 보통 BGR
    
    # 원형 그리기
    cv2.circle(img, center=(320,220), radius=100, color=(0,0,255), thickness=3)
    • 이미지 자르기 / 크기 변경하기
    # 이미지 자르기
    cropped_img = img[89:348, 259:380] # 앞이 자르고 남겨둘 세로 위치, 뒤쪽이 가로(슬라이싱같은?!!)
    
    # 이미지 크기 변경
    resized_img = cv2.resize(img, (512, 256))
    • 이미지 컬러 시스템 변경
    # 이미지 컬러 시스템 변경하기 
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #BGR에서 RGB로 바꿔달라
    
    cv2.imshow('result', img_rgb) #이미지창 띄우기
    cv2.waitKey(0)

     

    📖 이미지 처리 심화

    • 배경 이미지 위에 다른 이미지 합성하기(Overlay)
      • 일반적으로 컴퓨터는 세가지 색상 채널을 이용해서 색을 표현한다. 하지만 합성을 할 때는 alpha 채널 즉 투명도를 나타내는 채널이 하나 더 추가 된다. 그래서 이 투명채널을 분리해주는 작업이 필요하다.
    # 이미지 로드하기
    img = cv2.imread('01.jpeg') # 배경 이미지
    overlay_img = cv2.imread('dices.png', cv2.IMREAD_UNCHANGED) # 위에 합성될 이미지, cv2.IMREAD_UNCHANGED-투명한 배경이 있는 png를 로드할 때 사용
    
    overlay_img = cv2.resize(overlay_img, dsize=(150, 150))
    
    # 이미지 투명도 값 조정해주기
    overlay_alpha = overlay_img[:, :, 3:] / 255.0 # 알파채널을 분리해 0~1사이의 값으로 나타내 물체만 보이게 하기
    background_alpha = 1.0 - overlay_alpha # 배경에 물체가 들어갈 부분의 투명도를 낮춰야하기 때문에 위 물체의 알파채널의 반전된 값을 구한다.
    
    # 주사위 이미지 위치
    x1 = 100
    y1 = 100
    x2 = x1 + 150
    y2 = y1 + 150
    
    # 이미지 합성하기
    img[y1:y2, x1:x2] = overlay_alpha * overlay_img[:, :, :3] + background_alpha * img[y1:y2, x1:x2]
    # 색상 채널에 알파채널을 곱해주면 투명도가 반영된다
    
    cv2.imshow('img',img)
    cv2.waitKey(0)

     

    📖 동영상 처리

    • 동영상 띄우기
    import cv2
    
    # 비디오 로드하기
    cap = cv2.VideoCapture('04.mp4')
    
    while True:
        # ret은 동영상이 끝났을 때는 False, 재생 중일 때는 True
        # 동영상은 이미지의 연속이기 때문에 불러와서 img라는 변수에 이미지 한장씩 저장
    	ret, img = cap.read()
        
        # 동영상이 끝났을 때 와일문을 빠져나와라
    	if ret == False:
    		break
    
    	cv2.imshow('result', img)
    	
        # 1millisecond만큼 기다리고 키보드 'q'를 눌르면 나오게끔 명령
        # waitKey 값에 따라 동영상 재생 속도 조절 가능
    	if cv2.waitKey(1) == ord('q'):
    		break

     

    • 영상 가지고 놀기
      • 이미지와 똑같이 와일문 안에 코드를 넣어 사각형 / 원형, 색상변경 등을 할 수 있다.
      • 캠을 이용해 얼굴 띄우기
    # 캠 로드하기
    cap = cv2.VideoCapture(0)
    
    # 이하동일

     

    ▷ 오늘의 시도

    ❗️이미지를 합성하는 과정에서 아래와 같은 에러가 발생하였다❗️

    Traceback (most recent call last):
      File "/Users/parkhyerin/Desktop/sparta_class/sparta_dl/week1/main3.py", line 20, in <module>
        img[y1:y2, x1:x2] = overlay_alpha * overlay_img[:, :, :3] + background_alpha * img[y1:y2, x1:x2]
    TypeError: 'NoneType' object is not subscriptable

    사실 논타입이라는게 뭘 의미하는 지 몰랐다. 그래서 구글링을 하니 대상이 없을 때를 의미하는 건가 싶었다. 근데 무슨 대상이 없는건지 어디서 잘몬된건지 위를 찬찬히 살펴보다가 설마,, 애초에 이미지 로드가 되지 않은 건가?? 싶었다. 그래서 이미지 로드하는 부분을 살펴보니 저장된 파일 형식은 .jpeg이지만 코드에서는 .jpg를 불러우게끔 되어있었다. 설마 하는 마음에 확장자명을 바꿔주니 말끔히 해결! 다음부터 이미지 로드할때 이름 절대 헷갈리지 말자☺️

     

    댓글

Designed by Tistory.