본문으로 바로가기

어떻게 사는게 좋을까? 어떤 선택을 하는 것이 최선일까?를 난데없이 문득 고민하는 하루입니다. 별로 고민없이 물 흐르는데로 사는 것이 인생이라 생각하고, 오직 즐거움(^^)만을 따라다녔는데... 뭔가 요즘 선택을 계속 고민하게 되네요.ㅠㅠ. 이럴때는 일하다말고, 잠시 블로깅하는 것이 정신건강에 좋죠^^. 얼마전에 이때까지 10년 블로그 생활중에 처음으로 OpenCV라는 아이를 이용해서, Python으로 OpenCV를 이용해서 사람의 얼굴이나 몸을 인식하는 것을 haarcascade를 이용해서 연습했는데요. 이번에는 내가 직접 쓴 숫자에서 숫자 하나하나가 위치하는 영역을 인식하고 싶네요^^. 어떻게하면 좋을까요^^. 정답은?? 구글이죠^^ 아무튼.. 그 연습을 시작해볼께요...

아... 이겁니다. 이 손글씨에서 숫자가 위치한 영역을 찾고 싶은거죠. 잠깐.. 인식은 안해요.. 왜냐구요? 다음 글에서 할 거거든요^^ 위 그림파일 이름이 300.jpg입니다. 그래서 위 그림을

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

img = cv2.imread("./300.jpg")

plt.figure(figsize=(15,12))
plt.imshow(img);

로 읽어들이는 거구요...

이렇죠... 문제는 제가 연습장에 쓰고, 폰으로 찍었는데... 저의 노예계약이 무려 1년반이나 남은 On7 폰이 물속으로 낙하하신 후에... 카메라 성능이 저렇게 되었습니다. 테두리에 이상한 음영이ㅠㅠ. 저거 좀 있다 좀 골치아프겠어요ㅠㅠ.

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.figure(figsize=(15,12))
plt.imshow(img_gray);

아무튼... cvtColor명령으로 GRAY로 바꾸면...

흠... 아바타 분위기라고 지적(^^) 당했지만.. 전 그냥 저 상태로 감상하는게 좋습니다. 아직은 OpenCV 초심자이니까요 ㅎㅎㅎ^^ OpenCV 학습 속도가 잘 붙는 아이인것 같습니다.^^

img_blur = cv2.GaussianBlur(img_gray, (5, 5), 0)
plt.figure(figsize=(15,12))
plt.imshow(img_blur);

그리고, 가우시안블러~~~를 살짝 씌워서....

위에 필기도구나 저의 거지같은(^^) 카메라때문에 끊어진 듯 보이는 이어진 선이 부드럽게 연결된듯 보입니다.

ret, img_th = cv2.threshold(img_blur, 100, 230, cv2.THRESH_BINARY_INV)

image, contours, hierachy= cv2.findContours(img_th.copy(), 
                                 cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

rects = [cv2.boundingRect(each) for each in contours]
rects

이제... 적당한 threshold 값을 찾아서 - 정말 찾아야하더군요.ㅠㅠ. 코드를 몇번 돌려봤는지ㅠㅠ. 아무튼... 그렇게 찾아서.. 이쁘게 사각영역을 얻어~~~

얻었는줄 알았는데...12개 숫자인데... 이상하게.. 너무 많은 영역이 나옵니다. 이 다음 코드를 생략하고, 끝까지 진행하면, 몹쓸 카메라로 인해 만들어진 가운데 원의 경계선에 작은 상자들이 만들어집니다.ㅠㅠ. 그래서 잔꽤를....

tmp = [w*h for (x,y,w,h) in rects]
tmp.sort()
tmp

구한 height와 weight를 이용해서 넓이를 보는거죠. 그래서 결과를 보면

제일 큰 아이 두개를 빼고, 나머지의 넓이를 찾을 수 있습니다. 그래서 넓이값으로 다시 한 번 더 걸러주는거죠...

rects = [(x,y,w,h) for (x,y,w,h) in rects if ((w*h>15000)and(w*h<500000))]
rects

뭐 이번 경우만 사용할 수 있지만... 일단 전 연습생(^^)이니까요... 그리고 이딴 블로그에 설마.. 죽자고 위 방식의 문제를 걸고 넘어지실 분은 없으리라 보고... (더 좋은 방법을 알려주시는건 정말 감사합니다.^^)

이제 상자 12개가 나왔네요^^

for rect in rects:
    # Draw the rectangles
    cv2.rectangle(img, (rect[0], rect[1]), 
                  (rect[0] + rect[2], rect[1] + rect[3]), (0, 255, 0), 5) 

plt.figure(figsize=(15,12))
plt.imshow(img);

ㅋㅋ 저렇게 기존의 img에 상자를 넣어줍니다. 끝끝끝~~

짠.... 다음엔 뭐할까요???? ㅎㅎ 아마 제가 최근 MNIST데이터 셋으로 CNN을 케라스로 돌렸다는 둥 , 그때 학습한 모델을 저장했다가, 자기 손글씨를 확인하는데 사용했는데.. 그때 이미지의 크기 28*28에 맞추느라 약간 삽질했다는 둥의 이야기를 기억하신다면, 그 와중에 난데없이 갑자기 OpenCV로 가서는 사람 얼굴 영역 찾기 놀이를 했다는 것도 기억하신다면~^^ 넵.. 짐작하신데로 입니다. 다음 과정은 저렇게 찾은 각각의 이미지를 28*28로 크기를 바꾸고, 그걸 이미 학습해둔 CNN 모델에 돌려주고, 그 결과를 다시 저 이미지에 마킹하겠다는거죠.. ㅋㅋㅋ 요즘 조금씩 블로그할 시간이 안나서 그걸 또 언제할지 모른다는것이 함정~~~^^입니다.


댓글을 달아 주세요

  1. BlogIcon 잉여토기 2018.05.08 08:18 신고

    이런 방식으로 인식하여 문자인식 스캔 앱 같은 것도 개발되고 하는 거군요.

    • BlogIcon PinkWink 2018.05.09 11:38 신고

      전 지금 그냥 공부하는 단계라서...
      아마 실제로는 꽤 효율적이고 성공율이 높은 시스템이 적용되어 있겠죠^^

  2. BlogIcon 휴식같은 친구 2018.05.08 08:36 신고

    신기하네요. 대단합니다.ㅎ
    즐거운 한주 시작하세요.

  3. BlogIcon 공수래공수거 2018.05.08 09:31 신고

    함정에 안 빠지도록 해 주세요^^

  4. BlogIcon 북두협객 2018.05.08 09:32 신고

    프로그래밍 언어가 필기도 인식하는 건가요 완전 대박입니다!

  5. BlogIcon 귀요미디지 2018.05.08 15:50 신고

    날씨도 화창한 날이네요 ㅎ
    즐거운 하루 되세요 ^^

  6. BlogIcon 구차니 2018.05.08 17:29 신고

    우와.. 멋지세요!!
    학부과정에서 matlab 이용해서 번호판 인식하던게 떠오르네요
    근데.. 그때는 번호판 영역만 잡고 단순하게 커팅해서 썼는데 말이죠 ㅠㅠ

    그리고 가우시안 필터로 부드럽게 하는건 상상도 못했네요 ^^;
    단순하게 축소나 확대를 이용해서 중간에 점을 없애는건 써왔는데 말이죠
    (예를 들어 1개 점을 부드럽게 하려면 1 픽셀 확대 1픽셀 축소)

  7. BlogIcon 구차니 2018.05.08 17:31 신고

    아.. 그리고 주변부가 흐려지는게 일부로 넣은게 아니였군요 ㅋㅋ
    그거는 vignetting이나 lens shade correction 적용하시면
    상당부분 완화하실수 있으리라 생각됩니다.(CCTV쪽 있다 보니..)

  8. BlogIcon Bliss :) 2018.05.08 21:37 신고

    와~ 그렇네요 그전에 했던 작업들이 꼬리에 꼬리를 물고 새로운 영역을 터주는거네요. 숫자 영역을 지정해주면 원하는 결과를 보다 더 정확하게 그리고 세밀하게 낼 수 있겠네요. 폰 수중 낙하는 아쉽지만 테두리 음영...음음...@.@ 이렇게 만드는 코드에서 느낄 수 없는 운치가 느껴집니다^^;; 미바뤼의 카네이션과 함께 행복한 어버이날 되셨기를 바라며 굿밤 되세요~^^

  9. BlogIcon peterjun 2018.05.09 02:58 신고

    아바타 분위기라는 말씀에 웃음이 나와버렸어요. ㅎㅎ
    재미있게 봤습니다.
    삶이란 정답이 없는 것 같아요... 누구나 그 답을 찾아가는 과정이 아닐까 생각해보네요. ^^

  10. BlogIcon 핑구야 날자 2018.05.09 06:35 신고

    글자를 인식하는 것은 정말 재미있는 것 같아요

  11. BlogIcon 스티마 2018.05.09 09:15 신고

    글씨를 쓴 영역을 찾는것만으로도 절반은 해낸거군요!

  12. BlogIcon 멜로요우 2018.05.09 14:29 신고

    문자 인식하는 구조도 있네요~ 글자를 인식하는 능력도 점점 발전해나가네요!! ㅋ

  13. BlogIcon IT넘버원 2018.05.09 19:45 신고

    다른 프로그램도 이런식으로 인식하는군요.^^

  14. BlogIcon Z(제트) 2018.05.10 00:42 신고

    좋은정보 감사합니다~ ㅎ

  15. BlogIcon 즐거운 우리집 2018.05.10 07:25 신고

    우와~ 정말 멋지네요 ^^

  16. BlogIcon Deborah 2018.05.10 15:16 신고

    와 이렇게도 가능하군요. 좋은데요.