관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

[Spiring반] 기말시험 2 - 컴퓨터 비전 시험 및 문제 풀이 본문

개발 포트폴리오/수료증 및 시험

[Spiring반] 기말시험 2 - 컴퓨터 비전 시험 및 문제 풀이

huenuri 2024. 10. 31. 11:54

수료증과 시험이라는 카테고리를 하나 만들어서 학습일지를 쓰는 중이다. 그동안 과목별로 이수하면 이수증을 해당 과목에 올렸는데 이렇게 하니 보기도 힘든 것 같아 아예 따로 설정하기로 했다.

풀이 과정과 함께 일지를 쓰며 시험을 보다 보니 시간을 훨씬 더 많이 걸리지만 공부는 더 잘될 거라 믿는다.


 

 

 

 

컴퓨터 비전 문제

 

문제 6번

 

 

 

 

 

이 문제는 어렵지 않은 문제라 풀이는 생략하겠다.


 

 

 

 

 

7번 문제

 

 

이 문제는 캡처하기 전에 답을 먼저 선택해버렸다. 

 

OpenCV에서 이미지의 색상 공간을 변환할 때는 cv2.cvtColor 함수를 사용한다. 코드에서 cv2.COLOR_BGR2RGB로 BGR 색상 공간을 RGB로 변환하고자 할 때, cvtColor 함수가 필요하다.

 

 


 

 

 

 

 

 

문제 8번

 

 

이 코드는 OpenCV를 사용하여 이미지를 불러오고, 이를 창에 띄운 후 키 입력을 기다렸다가 모든 창을 닫는 기능을 수행한다.

 

코드를 코랩에서 실행시키려고 했지만 그건 잘 되지 않았다. 그냥 문제나 풀어봐야겠다. 그러다가 시험 시간이 다 지나가겠다.

  1. cv2.destroyAllWindows()는 윈도우 창을 모두 닫는 기능이다.
    • cv2.destroyAllWindows()는 OpenCV에서 열린 모든 창을 닫는 함수이다.
  2. img의 shape을 확인하면 (행, 열)과 같은 결과가 출력된다.
    • img.shape은 (행, 열, 채널 수)의 형태로 출력된다. 컬러 이미지라면 (height, width, channels) 형식으로 나온다. 흑백 이미지의 경우 (행, 열)이지만, 일반적인 컬러 이미지에서는 (행, 열, 채널)로 출력된다. 따라서 틀린 답이다.
  3. cv2.imshow()는 이미지를 윈도우 창에 띄워 보여주는 기능이다.
    • cv2.imshow()는 이미지를 창에 띄워서 보여주는 함수이다.
  4. img 변수에 담긴 데이터는 이미지일 뿐 배열은 아니다.
    • 틀린 설명입니다. OpenCV에서 cv2.imread()로 불러온 이미지는 numpy 배열 형태로 저장된다. 따라서 이미지 데이터는 배열 형식이다.
  5. cv2.waitKey(0)는 사용자가 키보드를 입력할 때까지 무한 대기하겠다는 뜻이다.
    • 맞는 설명입니다. cv2.waitKey(0)은 무한 대기하며, 키보드 입력이 있을 때까지 대기한다.

 

 


 

 

 

 

문제 9번

 

 

컴퓨터 비전은 아직 공부를 하지 않아서 문제를 푸는 게 쉽지 않다. 이 문제는 밝기, 어둡기, 중간 밝기의 여러 사진을 합성하여 밝은 부분과 어두운 부분 모두 잘 보이도록 하나의 이미지를 만드는 방법에 대해 묻는 것이다.

 

문제 분석

  • 동일한 장면을 서로 다른 노출(밝기)로 촬영한 여러 장의 사진을 합성하여 전체적으로 디테일이 잘 보이게 하고 싶습니다.
  • 밝은 영역과 어두운 영역이 모두 잘 보이게 하려면 각 사진의 밝은 부분과 어두운 부분을 적절히 합쳐야 합니다.

 

문제 풀어보기

  • Image Blending(이미지 블렌딩)은 여러 이미지를 합성하여 하나의 이미지로 만드는 방법이다. 특히, 노출이 다른 여러 이미지를 합성하여 최적의 밝기와 대조를 가진 이미지를 만들 때 주로 사용된다.
  • 차영상 기법 (Background Subtraction): 주로 비디오 분석에서 움직이는 객체를 추적할 때 사용되며, 배경과 전경을 분리하기 위한 방법이다.
  • 히스토그램 평활화 (Histogram Equalization): 이미지의 명암을 균등하게 조절하여 대비를 높이는 방법이지만, 여러 사진을 합성하는 것과는 관련이 없다.
  • 에지 검출 (Edge Detection): 이미지에서 윤곽선을 추출하는 방법으로, 밝기 차이가 나는 부분을 강조하는 것이 목적이다.
  • 감마 보정 (Gamma Correction): 이미지의 밝기를 조정하는 방법으로, 전체적인 밝기 조정을 위한 기법이다.

따라서 답은 이미지 불렌딩이다.

 

 


 

 

 

 

문제 10번

 

이 문제는 OpenCV와 미리 학습된 얼굴 검출 모델을 사용하여 비디오 프레임에서 얼굴을 탐지하고, 각 얼굴에 대해 Bounding Box와 신뢰도(conf) 값을 화면에 출력하는 프로그램을 작성하는 것이다.

OpenCV의 DNN 모듈을 사용하여 deploy.prototxt와 res10_300x300_ssd_iter_140000.caffemodel을 활용한 얼굴 검출 모델을 사용할 수 있다.

 

 

코드는 찾아서 복사 붙여넣기 했지만 이 문제는 무슨 말인지도 잘 모르겠고 그냥 넘어가야겠다. 나중에 다시 한번 풀어봐야지. 지금은 시간도 없으니 빨리 다음 문제를 푸는 게 훨씬 더 나을 것 같다.

그래도 코드를 풀이해보면 다음과 같다.

 

 

  1. 모델 로드: res10_300x300_ssd_iter_140000.caffemodel과 deploy.prototxt 파일을 사용해 DNN 모델을 로드한다.
  2. 비디오 캡처: cv2.VideoCapture(0)으로 웹캠에서 비디오 프레임을 가져온다.
  3. 얼굴 검출:
    • 프레임을 전처리하여 DNN 모델에 입력으로 사용한다.
    • net.forward()를 통해 얼굴 검출 결과를 얻고, 각 결과에 대해 신뢰도(confidence)를 확인한다.
  4. Bounding Box와 신뢰도 출력:
    • 신뢰도가 0.5 이상일 경우, 얼굴 주위에 사각형(Bounding Box)을 그리고, 하단에 신뢰도(conf) 값을 흰색으로 표시한다.
  5. 종료: q 키를 누르면 비디오 스트림이 종료된다.

 


 

 

 

시험을 마치고

컴퓨터 비전은 아직 공부하지는 않아서 실습 문제는 풀지 못했지만 다음 주부터 공부에 들어갈 예정이다. 그때가 되면 이 문제도 충분히 풀 수 있을 것 같다.

다음은 딥러닝 문제를 풀어보겠다.