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()
🎨 코드 설명
- 영상 캡처:
OpenCV를 사용하여 웹캠에서 실시간으로 이미지를 캡처합니다. 각 이미지에서 특정 영역을 추출하고, 그레이스케일과 HSV 색상 모델로 변환하여 색상을 추출합니다. - 색상 추출:
cv2.inRange()를 사용하여 빨간색 범위에 해당하는 픽셀을 추출합니다. 빨간색과 그 주황색을 구분하기 위해, 두 개의 마스크(img_mask1, img_mask2)를 사용해 해당 영역을 추출한 뒤 병합합니다. - 윤곽선 추출:
cv2.findContours()와 cv2.drawContours()로 마스크에서 윤곽선을 추출하고 이를 표시합니다. 오류 처리도 추가하여 예외 발생 시 메시지를 출력합니다. - 결과 표시:
cv2.countNonZero()를 사용하여 빨간색 픽셀의 개수를 계산하고 이를 터미널에 출력합니다. - 스레딩:
영상 캡처와 처리를 별도의 스레드에서 수행하여, 실시간 처리를 효율적으로 구현합니다.
🏆 코드 최적화 및 예외 처리
- 최적화:
- 여러 마스크를 합쳐서 한 번에 색상 추출을 처리하여 속도를 최적화했습니다.
- 윤곽선 추출 및 그리기 작업을 효율적으로 처리하기 위해 예외 처리로 안정성을 강화했습니다.
- 예외 처리:
- try-except 블록을 사용하여 윤곽선을 그리는 도중 오류가 발생할 경우 오류 메시지를 출력합니다.
💡 결과
이 코드는 실시간으로 웹캠에서 빨간색 픽셀의 개수를 추출하여 터미널에 출력하는 기능을 합니다. 빨간색 영역이 얼마나 검출되었는지 숫자로 확인할 수 있습니다.
💬 느낀 점
오늘 하루는 꽤나 힘들었지만, 문제를 해결하는 과정에서 많은 걸 배웠습니다. 😅
영상 처리와 관련된 기본적인 기능을 구현했으며, 예외 처리와 최적화, 그리고 코드 가독성 등을 고려한 점이 중요한 평가 요소였네요. 내일은 더 나은 코드로 보답할 수 있도록 최선을 다할 것입니다! ✨
🔧 사용된 라이브러리
- cv2 (OpenCV): 이미지 처리 및 색상 추출
- numpy: 배열 및 마스크 처리
- threading: 실시간 영상 캡처를 위한 스레딩
이렇게 코드를 작성하여 문제를 해결했습니다.
평가 결과에 따라 더 발전된 코드로 개선할 수 있기를 기대합니다.
여러분도 코드 최적화와 예외 처리를 잊지 마세요! 😊
728x90
반응형
LIST
'KG_KAIROS > Python' 카테고리의 다른 글
🛜[KG_KAIROS] 파이썬_7 (Flask, Socket 통신) (0) | 2024.07.09 |
---|---|
[KG_KAIROS] 파이썬 강의_6 (Pyqt5) (0) | 2024.07.08 |
[KG_KAIROS] 파이썬 강의_5 (Open CV) (0) | 2024.07.04 |
[KG_KAIROS] 파이썬 강의_4 (PIL, Matplotlib) (2) | 2024.07.03 |
[KG_KAIROS] 파이썬 강의_3(numpy) (2) | 2024.07.02 |