어떻게 사는게 좋을까? 어떤 선택을 하는 것이 최선일까?를 난데없이 문득 고민하는 하루입니다. 별로 고민없이 물 흐르는데로 사는 것이 인생이라 생각하고, 오직 즐거움(^^)만을 따라다녔는데... 뭔가 요즘 선택을 계속 고민하게 되네요.ㅠㅠ. 이럴때는 일하다말고, 잠시 블로깅하는 것이 정신건강에 좋죠^^. 얼마전에 이때까지 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 모델에 돌려주고, 그 결과를 다시 저 이미지에 마킹하겠다는거죠.. ㅋㅋㅋ 요즘 조금씩 블로그할 시간이 안나서 그걸 또 언제할지 모른다는것이 함정~~~^^입니다.
'Theory > DeepLearning' 카테고리의 다른 글
Tensorflow의 GradientTape을 이용한 미분 (2) | 2022.02.18 |
---|---|
어찌어찌 설치하고 구동해본 영상 인식 - CUDA, OpenCV, darknet - YOLO, 그리고 고마운 분들~ (30) | 2018.05.23 |
[Keras] 붓꽃 Iris 데이터 분류해보기 Iris classification using Keras (22) | 2018.05.18 |
Python에서 OpenCV를 통해 내가 손으로 쓴 숫자 영역 확인하기 (42) | 2018.05.08 |
Python에서 OpenCV를 이용해서 초간편하게 사람 얼굴, 몸을 인식하기 (42) | 2018.04.27 |
[Keras] 이미 학습된 모델을 읽어와서 나의 필기체 숫자 인식하기 (36) | 2018.04.18 |
[Keras] MNIST 데이터 셋을 이용한 필기 글씨에 대한 CNN Tutorial (56) | 2018.04.16 |
[Keras] 타이타닉 생존자 분석. 디카프리오는 정말 살 수 없었을까? (32) | 2018.04.13 |
신기하네요. 대단합니다.ㅎ
즐거운 한주 시작하세요.
ㅎㅎ 네.. 감사합니다.^^
함정에 안 빠지도록 해 주세요^^
ㅎㅎㅎㅎ 넵^^
프로그래밍 언어가 필기도 인식하는 건가요 완전 대박입니다!
좋은 도구를 많들어준 분들이 계셔서 말이죠^^
날씨도 화창한 날이네요 ㅎ
즐거운 하루 되세요 ^^
ㅎㅎ네.. 감사합니다.^^
우와.. 멋지세요!!
학부과정에서 matlab 이용해서 번호판 인식하던게 떠오르네요
근데.. 그때는 번호판 영역만 잡고 단순하게 커팅해서 썼는데 말이죠 ㅠㅠ
그리고 가우시안 필터로 부드럽게 하는건 상상도 못했네요 ^^;
단순하게 축소나 확대를 이용해서 중간에 점을 없애는건 써왔는데 말이죠
(예를 들어 1개 점을 부드럽게 하려면 1 픽셀 확대 1픽셀 축소)
역시 구차니님... 학부때 이미 하셨다니^^
아.. 그리고 주변부가 흐려지는게 일부로 넣은게 아니였군요 ㅋㅋ
그거는 vignetting이나 lens shade correction 적용하시면
상당부분 완화하실수 있으리라 생각됩니다.(CCTV쪽 있다 보니..)
헉.. 그래요?? 한번 찾아보겠습니다
정말이지.. OpenCV.. 재미있네요^^
와~ 그렇네요 그전에 했던 작업들이 꼬리에 꼬리를 물고 새로운 영역을 터주는거네요. 숫자 영역을 지정해주면 원하는 결과를 보다 더 정확하게 그리고 세밀하게 낼 수 있겠네요. 폰 수중 낙하는 아쉽지만 테두리 음영...음음...@.@ 이렇게 만드는 코드에서 느낄 수 없는 운치가 느껴집니다^^;; 미바뤼의 카네이션과 함께 행복한 어버이날 되셨기를 바라며 굿밤 되세요~^^
ㅎㅎ 미바뤼의 카네이션이라고 쓰고, 어린이집 선생님의 고생이라고 읽는거죠^^
감사합니다^^
아바타 분위기라는 말씀에 웃음이 나와버렸어요. ㅎㅎ
재미있게 봤습니다.
삶이란 정답이 없는 것 같아요... 누구나 그 답을 찾아가는 과정이 아닐까 생각해보네요. ^^
그러게요~~ 정답도.. 또 정답이 있을 수도 없는게 현실이겠죠^^
글자를 인식하는 것은 정말 재미있는 것 같아요
전 이번에 OpenCV에 푹 빠졌답니다.^^
글씨를 쓴 영역을 찾는것만으로도 절반은 해낸거군요!
ㅎㅎ 그쵸^^
문자 인식하는 구조도 있네요~ 글자를 인식하는 능력도 점점 발전해나가네요!! ㅋ
ㅎㅎ네 그러게요^^
다른 프로그램도 이런식으로 인식하는군요.^^
네.. 그런것 같습니다.^^ 그리고 아주 재미있답니다.^^
좋은정보 감사합니다~ ㅎ
네. 즐거운 하루 되세요^^
우와~ 정말 멋지네요 ^^
아~ 네. 감사합니다.^^
와 이렇게도 가능하군요. 좋은데요.
아주 재미있는 영역이지요^^
안녕하세여~ 좋은 정보 감사합니다~
22번 째 line 에서
image, contours = cv2.findContours(img_th.copy(),
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
opencv4.0 부터 변수가 2개가 되었다고 하여서 heirarcy 를 없애고 진행을 하였습니다
이후에 아래와 같은 에러가 나오는데, 어떤 것을 보면 될까요??
File "test.py", line 24, in <listcomp>
rects = [cv2.boundingRect(each) for each in contours]
cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\imgproc\src\shapedescr.cpp:743: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'cv::pointSetBoundingRect'
감사합니다 ~
네.. 그 버전을 아직 사용해보지 않았는데... 한 번 테스트해봐야겠네요.. 지금은 잘 모르겠습니다.ㅠㅠ.
비밀댓글입니다
도움이 되었다니... 다행입니다.^^
이 게시글과 전에 쓰셨던 CNN을 케라스로 돌려 숫자를 인식하는 게시글을 잘 보았습니다.
현재 이미지에서 글자들을 인식하여, 초록색 상자로 숫자들이 분할된것은 확인하였는데, 여기에 인식되어있는 숫자들을 따로 어떤숫자로 인식한건지 출력할수있는 방법이 따로있을까요?
네 predict 명령에서 결과가 나옵니다.
안녕하세요! 과제 중에 여러 자료를 보고 도움이 되었습니다. 감사합니다. 다름이 아니라 plt.imshow(img); 이 부분에서 TypeError: Image data of dtype object cannot be converted to float 라는 오류가 나는데 해결방법을 모르겠습니다... 사진과 파일을 같은 위치에 두었고 파일을 읽어오는 img = cv2.imread 부분에서도 경로를 맞게 한 것같은데 이와같은 오류가 나는 건 무슨일일까요...혹시 알 수 있을까요?
아... 그게.. 잘 모르겠네요.ㅠㅠ.
혹시 넓이값에서 15000,500000 은 어떻게 적용되었는지 알수있을까요???
이건 그냥 상황에 맞워 잡았습니다.ㅠㅠ. 너무큰건 제외하려구요^^