본문 바로가기

딥러닝

9강 - OpenCV와 함께하는 이미지 기초 - OpenCV로 이미지 파일 열기

이번 강의에서는, 오픈 CV와 파이썬 스크립트를 이용하여 이미지 파일을 여는 방법을 배워 보겠습니다
주피터 밖의 별개의 창에 표시하기 위해서 오픈 CV 라이브러리를 사용하겠습니다
우리가 뒤의 강의에서 할 더욱 복잡한 영상과 이미지 분석은
주피터 밖에서 출력을 해야 합니다
전 강의에서 본 것과 같이 노트북 안의 이미지를 표시하는 데에
plt.imshow만 사용하기도 할 테지만 오픈 CV 자체를 이용할 수도 있습니다
주피터는 브라우저 기반이라 창을 닫으면 간섭이 일어납니다
대부분 주피터 랩은 문제없이 새 창을 표시할 수 있지만
오픈 CV 창을 닫으려고 한다면 커널이 충돌하곤 합니다 이 잠재적 문제를 해결하기 위해선
노트북 안의 커널을 재시작해야 하죠
이러한 문제들은 윈도에서보다 맥 OS와 리눅스에서 더 많이 나타나는 경향이 있는데
문제를 재현해서 여러분이 앞으로 어떻게 그것을 해결할 수 있는지 보여주기 위해 최선을 다해 보겠습니다
하지만 여러분이 이러한 오류나 문제들을 실제로 맞닥뜨리지는 않게 되더라도 놀라지 마세요
다시 한번, 만약 여러분에게 커널 오류가 자주 발생한다면, 그냥 간단히 코드를 분리된
파이썬 스크립트로 작동하세요
이러한 잠재적 문제들을 보여드릴 거고요, 또한 매트플롯립이 아니라 오픈 CV로
어떻게 이미지들을 바로 열고 표시하는지도 보여드릴 겁니다
노트북에서와 분리된 스크립트로서 둘 다 보여드릴 거예요
이제 시작해봅시다
여기 새 노트북이 있습니다
저는 먼저 노트북에서 이미지를 여는 방법과 일어날 수 있는 잠재적 오류를 보여드릴 건데요
{import cv2} 라고 입력하는데 한 셀에 다 들어갈 겁니다
이게 꽤 중요해요


{img = cv2.imread} 라고 입력하고 지금 읽을 이미지를
불러옵니다
그 강아지 사진을요
'DATA'가 다 대문자로 되어 있는지 확인하시고 {('DATA/00-puppy.jpg')}


그리고 {cv2.}를 입력하고
그 자체의 {imshow()} 명령을 가지고 여기서 두 매개변수를 취합니다
하나는 여러분이 부르고 싶은 창 이름 아무거나 입력합니다, {('Puppy')}라고 해 보죠
띄어쓰기를 하면 안 되는 걸 잘 확인하세요
그리고 두 번째 매개변수는 여러분이 표시하고 싶은 실제 이미지입니다
이번 경우에는 이 강아지 이미지를 보여드리려 해요


마지막으로 {cv2.waitKey()}를 입력하는데 이는 기본적으로 우리에게
나가기 버튼을 클릭하고 그 창을 닫을 수 있게 하는 신호가 될 것입니다
나중에, 우리는 창을 닫기 위해 나가기 단추나 Q를 누르는 더 복잡한 기술을
살펴볼 거예요


이제 앞으로 가서 셀을 실행해 볼 건데요 모든 것이 같은 셀 안에 있다는 것을 확인하세요
실행해 보겠습니다
그리고 셀을 실행하고 나면, 여기에 별표가 생기게 되는데요, 지금 이 셀이
실행 중이라는 뜻입니다


그리고 이제 작업 표시줄 아래를 다시 보면 주피터 랩 아이콘의 작은 추가 창 같은 것이
보이실 겁니다
그리고 그 창을 클릭하면, 강아지 이미지와 그것의 독립된 창이 보입니다
여기서 약간 흥미로운 점은 여러분이 실제로 이 창의 크기를 재조정할 수 없다는 거예요
그래서 오픈 cv는 그냥 같은 치수들로 표시할 겁니다
제 경우 모든 것은 화면에 알맞습니다
하지만 만약 여러분이 이것을 더 작은 화면의 컴퓨터에서 작동시킨다면, 정말로 여러분의 화면을 꽉 채울 수도
있습니다
이것을 유념하세요
꽤 큰 이미지입니다


이제 여기서 나갈게요
나가면, 여기에 '-1'과 같은 어떤 음수 결괏값 같은 것을 볼 수 있습니다
그러면 모든 것이 알맞게 작동하고 있는 것이죠


하지만, 맥 OS나 리눅스에서 종종, 여러분이 이것을 실행한 다음 창으로 다시 돌아가서
창을 끄려고 하면, 여기서 에러가 발생하는 경우도 생깁니다
무슨 일이 생기냐면 여러분이 나가려고 할 때, 닫히는 것이 아니라 느려지기 시작하고, 갑자기
이 강아지가 응답하지 않고 어떠한 에러가 발생하게 됩니다
그리고 기본적으로 여기서 여러분의 커널이 망가지게 되는 거예요
'파이썬을 종료하시겠습니까' 등의 문구가 뜨는 거죠
이 경우에, 이러한 오류가 발생한다면, 이것을 스크립트로 실행해야 한다는 것을
의미하고, 곧 보여드릴 거예요

하지만 어떻게 실제로 이 오류에 대처할지 보여드리기 위해, 여러분이 해야 할 것은 프로그램을 닫는
것입니다
그래서 만약 여러분이 맥 OS나 리눅스를 사용한다면, 이 특정한 창을 바로 닫기 위해 강제 종료를 할 수 있습니다
아래의 작업 표시줄을 클릭하시고, 강제 종료를 누르세요

 

그래서 여기에서, 프로그램 닫기를 누르시고, 닫기, 취소를 누르세요
그리고 이제 여러분이 해야 할 것은 커널을 누르고 재시작을 하는 것입니다
만약 커널을 재시작하지 않으면 코드가 실행되지 않을 거예요


모든 것이 실행되고 있는 것을 확인한 후, {print('new')} 또는 출력할 문구를 입력하고
[shift + enter]를 누르면 그 셀 옆에 1이 보일 겁니다
좋습니다


우리는 방금 .imshow를 통해 오픈 CV를 바로 이용하여 이미지를 어떻게 여는지 보았고, 이것은 노트북의
CV2 버전입니다
하지만 주피터의 작동 방식에 따른 잠재적인 커널 충돌 또한 알게 되었죠
이제 오픈 CV와 일반적인 파이썬 .py 스크립트를 이용하여 어떻게 파일을 여는지 알아보겠습니다
강의를 이어가기 전에, 어떻게 여러분의 명령문으로 파이썬 스크립트를 실행하는지에 대한
이해를 명확히 해야 합니다
그리고 일반적으로, 이 강의에 등록하기 전에 이미 그러한 능력을 갖추고 있어야 합니다
꽤 기초적인 파이썬이죠
하지만 재검토가 필요하다면 언제든 주피터 랩 개괄 부분과 도입부의
이전 강의를 찾아볼 수 있습니다
이제 앞으로 넘어가서 실제로 파이썬 스크립트를 써 봅시다
좋습니다
다시 우리가 아까 쓰던 노트북으로 다시 돌아왔습니다
이제 커널 오류들의 발생 가능성을 줄이기 위해
몇 줄의 코드를 추가해서 파이썬 스크립트로 실행해 보겠습니다
이 모든 코드를 복사해서 다시 여기로 돌아갑니다
[+] 버튼을 눌러 새로운 Launcher를 생성합니다
그리고 스크롤을 내려서 새 텍스트 파일을 생성합니다
지금 이건 .txt 파일인데


마우스 우클릭을 해서 이름을 'mypuppy.py'와 같은 고유한 이름으로 재설정합니다
'opencv.py'와 같은 다른 것으로 이름을 변경하지 마세요, 오류가 발생할 수도 있습니다
'numpy.py' 같은 이름을 붙이지 마시고 고유의 이름을 명확히 정해 주세요
이렇게 'mypuppy.py'를 만들었고 전에 있던 코드를 붙여넣어 보겠습니다


이 코드를 약간 수정해 줄 겁니다
여기서 해야 할 건, 여기에 {import cv2} {img = cv2.imread}라고 되어 있는데, 이제 imshow에서는
이것을 while 루프에 넣을 겁니다
{while True}라고 쓰고, 이 이미지를 보여줄 거예요
이제, 이대로 그냥 두면, 문제는 이것이 이미지를 계속해서
영원히 반복해서 보여줄 겁니다

그래서 이 while true 루프에서 나오기 위해 어떤 브레이크 조건이 필요합니다
제가 사용할 것은 두 개의 조건입니다
{if cv2.waitKey} 라고 입력하고 이 안에 숫자를 입력할 거예요
waitKey 함수가 하는 일은 기본적으로 최소한 이만큼의 밀리초만큼 기다렸나 하는 것입니다
여러분은 여기에 어떤 숫자든 넣을 수 있고
그다음 {& 0xff == 27 :} {break}를 입력합니다
그래요, 지금 도대체 뭘 하는 걸까요?


이 한 줄의 코드는 아주 이상하거든요
사실 우리는 실제로 우리의 노트를 0xff가 본질적으로 어떻게 돌아가는지 설명하는
이 스택 오버플로 게시물에 있습니다.https://stackoverflow.com/questions/35372700/whats-0xff-for-in-cv2-waitkey1


그래서 오픈 CV로 작업을 할 때, 여러분은 이렇게 생긴 루프를 보게 되실 겁니다
{if cv2.waitKey(0) & 0xff ==} 심지어 가끔은 어떤 문자나 스트링의 순서까지 나오고
다음에 브레이크를 합니다
이것의 진짜 의미는 2진법의 11111111이고 이것이
이 비트마다 '&' 또는 '그리고'를 상수에 따라 이용하는 16진법의 상수라는 것입니다


이것이 본질적으로 의미하는 것은 '만약 1 밀리초 동안 기다렸다면'이라고 번역이 되는
{if cv2.waitKey(1) & 0xFF == 27:}의 첫 번째 부분이고
'&' 표시는 'and' 라는 뜻입니다
'그리고 esc 키를 눌렀다'로 해석됩니다
esc 키를 누름으로써 키보드에서 신호를 넘겨받았다는 뜻이죠
나중에, 저희는 어떻게 키보드에서 우리만의 키 명령을 추가할 수 있는지 알아볼 것입니다


그리고 사실 이 스택 오버플로에서는, 순서 'q'를 사용하기로 결정됐고, 이는 그 'q'가
눌러지기까지 기다리는 것을 말합니다
이건 나중에, 특히 이미지로 그리는 것과 함께 살펴보겠습니다


하지만 지금은, 가장 자주 디폴트가 되는, 그리고 나가기 키의 상징이며
숫자이기도 한 '27' 에 대해 계속하도록 하겠습니다
그래서 '만약 최소 1밀리초 기다렸고 나가기 키를 눌렀다'고 입력하고,
이 while True 루프에서 나가면, 이 이미지를 더는 보여주지 않는다는 것을 의미합니다

그리고 이 while True 루프 이후에, {cv2.destroyAllWindows}라고 입력합니다
여기서 A와 W가 대문자인 것을 확인하시고 저는 이것을 저장하겠습니다
저장하는 것을 잊지 마세요
여기 위에 회색 동그라미가 보이신다면, 저장되지 않았다는 것을 의미합니다
[Ctrl + s] 또는 [Command + s]를 누르셔야 합니다


좋습니다, 저는 cv2를 임포트하고, 그 파일을 읽고, 이것이 참이라면,
강아지 이미지와 새 창을 계속 보이게 할 것이며 최소 1밀리초 기다릴 것이고
이 while 루프에서 나가기 전에 사용자가 esc 키를 누르기를 기다릴 것입니다
그 후 모든 창을 파괴하고, 모든 것을 닫을 것입니다
그러므로 저장하는 것을 잊지 마시고 실제로 이 스크립트를 실행해 봅시다

launcher로 다시 돌아갑니다
새 터미널을 생성하겠습니다


{python my puppy.py}라고 입력합니다
엔터 키를 누르면 여기서 커서가 깜빡이는 것을 보실 텐데요
이제 일어날 일은 이 아래쪽에서 진행됩니다
이미지가 나타납니다


이 강아지 이미지를 보고 이제 할 수 있는 것은 키보드의 esc 키를 누르는 건데
그러면 이미지가 닫히게 됩니다


좋습니다, 이것이 자체 파이썬 스크립트 내에서 오픈 CV imshow 메소드를 올바르게 사용하는 방법입니다
더 많은 비디오나 상호작용하는 이미지에 대한 더욱 복잡한 분석을 위해 cv2.imshow를 더 많이 사용하게 되면
종종 스크립트를 실행하게 될 것입니다
그리고 좋은 점과 제가 선호하는 작업 방식은, 먼저 노트북의 한 셀에 모든 것을 넣고
그 .py 파일에 그냥 복사와 붙여넣기를 계속하는 것입니다
저는 주피터가 무엇이 실제로 일어나는지 이해하기 위해 [shift + tab]을 사용하거나 보기 탭과 같은
그러한 특별한 기능을 많이 갖추고 있기 때문에 많이 선호합니다
그러니 주피터의 장점을 활용해서 모든 것을 .py에 넣으세요
이 강의에서 주피터를 사용하는 가장 큰 이유는 노트북, 스크립트와 터미널을
더 쉽게 이용할 수 있게 하려는 거예요
좋습니다, 일단 이 코드의 정확한 세부사항을 다 이해하지 못하더라도 너무 걱정하지 마시고
단지 이것의 역할은 1 밀리초를 기다리고 여러분이 esc 키를 누르는지 확인하는 것과
만약 그렇다면, 여기서 나간다는 걸 이해하시면 됩니다
좋습니다
오픈 cv 사용에 관한 내용은 끝이 났습니다
다음 강의에서 봅시다

Untitled1.ipynb
0.00MB
mypuppy.zip
0.00MB