KG_KAIROS/Python

🖥️ [KG_KAIROS] 영상 처리 평가 - 색상 추출 및 윤곽선 표시

projectlim 2024. 7. 10. 16:51
728x90
반응형
SMALL

오늘은...문열었더니 갑자기 폭염이래여.

더운데 오늘도 할건 해야죠,,,

어제 밤에 알바 끝나고 들어가서 잠깐 잣는데 6시간 흘렀네요...

바로 시험보러 갑니다.

아침에 나

🖥️ 영상 처리 평가 - 색상 추출 및 윤곽선 표시

오늘은 영상 처리 평가를 진행한 날입니다.

평가에서는 주어진 조건을 바탕으로, 색상 모델 변환, 색상 영역 추출, 윤곽선 추출 및 표시, 결과 표시를 처리해야 했습니다. 👨‍💻


🛠️ 문제 설명 및 평가 기준

문제:

  • 3x3 큐브의 단면을 회전시키면서 비추어 색깔을 판별합니다.
  • 빨간색과 유사한 주황색도 판별 가능하도록 해야 했습니다.
  • 결과: 터미널에 빨간색 픽셀의 갯수를 출력합니다.

평가 시 유의사항

  • 코드 가독성
  • 유지 보수성
  • 예외 처리 및 오류 처리
  • 코드 최적화
  • 외부 라이브러리 및 모듈 효과적 사용

📝 제작한 코드

'''

<테스트 방법>
3*3 큐브의 단면을 돌려가며 비추어 색깔을 판별.
빨간색과 유사한 주황색과도 비교하여 판별이 가능.

<결과>
터미널에 빨간색 픽셀의 갯수를 표시함.

'''
import cv2          #외부 라이브러리 사용
import numpy as np  
from threading import Thread        #스레드 사용

class VideoCapture(Thread):             
    def __init__(self):
        Thread.__init__(self)


        self.cap = cv2.VideoCapture(0)
        self.cap.set(3, 320)
        self.cap.set(4,240)
        self.cx = 0
        self.cy = 0

    def run(self):          #run함수를 이용한 모듈 활용
        while (self.cap.isOpened()) :
            ret, img = self.cap.read()
            img_roi = img[120:240,0:320]                       #영역 추출
            img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)   #색상 변환
            img_cvt = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
            img_mask1 = cv2.inRange(img_cvt, np.array([0, 100, 100]), np.array([40,255,255]))   #특정색 추출 
            img_mask2 = cv2.inRange(img_cvt, np.array([160,100,100]), np.array([255,255,255]))  #특정색 추출
            img_mask = img_mask1 + img_mask2    # 병합하여 마스킹 처리
            cont_list, hi_ = cv2.findContours(img_mask, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)    #contours를 사용

            #예외처리 및 오류처리
            try :
                cv2.drawContours(img, cont_list, -1, (0, 255, 0), 3)  # 윤곽선 추출 및 표시 두께는 3으로 지정.
            except Exception as e:
                print('외곽선을 그리는 동안 오류가 발생했습니다:', e)
            
            cv2.imshow('img_gray',img_gray)
            cv2.imshow('mask1', img_mask1)
            cv2.imshow('mask2', img_mask2)          #red만 인식
            cv2.imshow('mask', img_mask)
            cv2.imshow('con', img)
            cv2.imshow('roi',img_roi)

            red_pixel_count = cv2.countNonZero(img_mask2)                           # img_mask2에서의 빨간색 픽셀 추출
            print(f'red값 검출: {red_pixel_count}개의 빨간색 픽셀이 검출되었습니다.')

            key = cv2.waitKey(1)
            if key == 27 :              #esc break
                break

        self.cap.release()

if __name__ == '__main__':      #최적화를 위한 필요 코드만 동작
    vc=VideoCapture()
    vc.start()
    cv2.destroyAllWindows()

얼굴 모자이크!!

🎨 코드 설명

  1. 영상 캡처:
    OpenCV를 사용하여 웹캠에서 실시간으로 이미지를 캡처합니다. 각 이미지에서 특정 영역을 추출하고, 그레이스케일과 HSV 색상 모델로 변환하여 색상을 추출합니다.
  2. 색상 추출:
    cv2.inRange()를 사용하여 빨간색 범위에 해당하는 픽셀을 추출합니다. 빨간색과 그 주황색을 구분하기 위해, 두 개의 마스크(img_mask1, img_mask2)를 사용해 해당 영역을 추출한 뒤 병합합니다.
  3. 윤곽선 추출:
    cv2.findContours()와 cv2.drawContours()로 마스크에서 윤곽선을 추출하고 이를 표시합니다. 오류 처리도 추가하여 예외 발생 시 메시지를 출력합니다.
  4. 결과 표시:
    cv2.countNonZero()를 사용하여 빨간색 픽셀의 개수를 계산하고 이를 터미널에 출력합니다.
  5. 스레딩:
    영상 캡처와 처리를 별도의 스레드에서 수행하여, 실시간 처리를 효율적으로 구현합니다.

🏆 코드 최적화 및 예외 처리

  • 최적화:
    • 여러 마스크를 합쳐서 한 번에 색상 추출을 처리하여 속도를 최적화했습니다.
    • 윤곽선 추출 및 그리기 작업을 효율적으로 처리하기 위해 예외 처리로 안정성을 강화했습니다.
  • 예외 처리:
    • try-except 블록을 사용하여 윤곽선을 그리는 도중 오류가 발생할 경우 오류 메시지를 출력합니다.

💡 결과

이 코드는 실시간으로 웹캠에서 빨간색 픽셀의 개수를 추출하여 터미널에 출력하는 기능을 합니다. 빨간색 영역이 얼마나 검출되었는지 숫자로 확인할 수 있습니다.

 

💬 느낀 점

오늘 하루는 꽤나 힘들었지만, 문제를 해결하는 과정에서 많은 걸 배웠습니다. 😅
영상 처리와 관련된 기본적인 기능을 구현했으며, 예외 처리와 최적화, 그리고 코드 가독성 등을 고려한 점이 중요한 평가 요소였네요. 내일은 더 나은 코드로 보답할 수 있도록 최선을 다할 것입니다! ✨

 


🔧 사용된 라이브러리

  • cv2 (OpenCV): 이미지 처리 및 색상 추출
  • numpy: 배열 및 마스크 처리
  • threading: 실시간 영상 캡처를 위한 스레딩

이렇게 코드를 작성하여 문제를 해결했습니다.

평가 결과에 따라 더 발전된 코드로 개선할 수 있기를 기대합니다.

여러분도 코드 최적화와 예외 처리를 잊지 마세요! 😊

728x90
반응형
LIST