Python Project 0-1 WebCam으로 이미지 찍기
우선 바로 전 글에서 말한 대로 이미지에 있는 텍스트를 사진으로 찍어서 Text화 해서 스피커로 소리로 나오게 하는 걸 만들기 위해서는 일단 WebCam을 이용해서 사진을 찍어야 합니다. 그러기 위해서는 저는 opencv를 사용했습니다. 가장 큰 이유는 구글링 해서 찾을 때 가장 많은 예시가 나왔고, 제 노트북(삼성 노트북)으로 윈도우를 쓰는데 문제가 딱히 없어서 사용했습니다.
일단 opencv-python을 설치해야합니다.
>> pip install opencv-python
이라고 위에 커맨드를 입력하면 자동으로 설치가 됩니다. 어렵지 않을 꺼라 믿습니다.
그러면 아래와 같이 설치가 완료된 것을 확인할 수 있습니다. 뭐 업그레이드가 가능하다고 되어있지만, 저는 패스하고 넘어갔습니다.
자 그럼 WebCam을 이용해서 사진을 찍어볼까요?
여기서 필요한 라이브러리는 총 2개입니다. 하나는 아까 설치한 opencv이고 나머지 하나는 matplotlib입니다. 좀 익숙한 라이브러리인가요? 이 2번째 라이브러리는 그래프 그릴 때 설치를 하셨을 겁니다. 안 했으면 설치를 추천드립니다. 필요한 이유는 사진을 찍어서 이미지로 보기 위해서 설치를 합니다.
일단 시작은 라이브러리 선언을 해야 합니다.
from cv2 import *
import matplotlib.pyplot as plt
이렇게 시작을 하고 이다음으로는 어떤 WebCam을 쓰는지 정해야 합니다.
cap_img = VideoCapture(0)
만약 노트북에 WebCam이 설치가 되어 있는 경우에는 0이 그 WebCam을 인식할 것입니다. 노트북에 WebCam이 있는데 USB로 다른 WebCam을 사용할 경우에는 1이라고 써서 하시면 됩니다. 저는 처음에는 로지텍 WebCam을 사용했는데, 나중에 Image to Text 할 때 삼성 노트북 설치된 WebCam으로 하니까 더 인식이 잘 되어서 일단 노트북 WebCam을 이용해서 테스트를 했습니다.
이제 WebCam을 지정을 했으니 잘 작동되는지 확인을 합니다.
아래의 코드를 이용하면 이미지를 잘 잡았는지 알려줍니다. 잘 안 되는 경우에는 ret이라는 변수에 false가 들어갑니다.
if cap_img.isOpened():
ret, frame = cap_img.read()
else:
ret = False
ret를 이용해서 조건문으로 잘 된 경우에는 이미지를 보여주고 아니면 오류 메시지를 보여줍니다.
여기서 cvtColor함수를 이용해서 컬러 혹은 흑백 등 다양하게 할 수 있는데 저는 일단 COLOR_BGR2RGB을 이용해서 칼라로 보게 했습니다. imshow는 이미지를 보여주는 함수입니다.
그다음 코딩 라인은 그림 나오는 표현 방식을 정리한 것인데, title이야 그림 위에 제목을 xticks, yticks에 []을 입력을 하면 눈금이 사라집니다. 마지막에 imwrite는 사진 찍은 것을 이미지로 저장을 하는 것입니다.
if ret == True:
img02 = cvtColor(frame, COLOR_BGR2RGB)
plt.imshow(img02)
plt.title('Color Image')
plt.xticks([])
plt.yticks([])
plt.show()
imwrite("filename.jpg",img02) #save image
else:
print("Wrong WebCam")
그리고 마지막으로 오픈한 캡처 객체를 해제하는 함수는 release()입니다.
cap_img.release()
이렇게 하면 WebCam을 이용해서 사진을 찍는 게 가능합니다. 크게 어려운 부분이 없을 꺼라 믿습니다.
그런데 여기서 조금 불편한 게 있습니다. 사진이 어떻게 나올지 전혀 알 수가 없기 때문에 매우 불편합니다. 그래서 이것을 Streaming으로 WebCam으로 보다가 키보드 입력이 들어가면 그때 사진이 딱 찍히면 엄청 좋을 것 같아서 추가했습니다.
일단 처음은 바로 전 코드와 동일합니다.
from cv2 import *
cap = cv2.VideoCapture(0)
이렇게 한 다음에 while(무한 루프)를 이용합니다. 일단 무한 루프를 돌면서 계속 이미지를 읽어서 img라는 변수에 저장을 합니다. 그리고 그것을 계속적으로 imshow함수를 이용해서 보여줍니다. 그렇게 하면 일단은 WebCam을 이용해서 Streaming을 할 수 있습니다. 그러면 Streaming을 보면서 내가 원하는 타이밍에 사진을 찍으면 편하게 사진을 찍을 수 있을 것입니다. User입력으로 사진 찍을 타이밍을 잡기 위해서 키보드 입력 ‘1’이라는 버튼을 누르면 사진을 찍을 수 있게 if조건문으로 표현을 했습니다. 1 대신에 다른 키보드 입력을 사용해도 됩니다. 저는 1이 편해서 1을 사용했습니다. 사진을 찍게 되면 사진을 저장을 하고 무한루프에서 나오기 위해서 break를 사용했습니다.
while(True):
# Capture Image
ret, frame = cap.read()
# Save Image in One Variable
img = cvtColor(frame, cv2.COLOR_BGR2RGB)
# Display the resulting frame
imshow('frame',img)
#When Press Key 1, Save image
if waitKey(1) & 0xFF == ord('1'):
imwrite("filename.jpg",img) #save image
break
그리고 마지막으로 끝났으니까 오픈한 갭쳐 객체를 해제하고 Streaming 때문에 새로 열린 창을 닫는 함수를 사용합니다.
# When everything done, release the capture
cap.release()
#Close Window
destroyAllWindows()
이렇게 해서 간단하게 WebCam을 이용해서 사진 찍는 것을 완료했습니다. 그럼 총 3단계 중에서 가장 처음이 끝난 것입니다. 지금 위에 있는 코딩은 구글링 해서 쉽게 찾을 수 있고, 혹은 다른 방법을 이용해서 사진을 찍어도 상관이 없습니다. 어찌하든 jpg 혹은 png 파일로 사진을 저장만 하면 되기 때문입니다. 그럼 다음 글에서는 이미지에 있는 글을 Text화 하는 방법을 설명하겠습니다.