6-12 BGR 3색공 마스킹 작업 및 컬러 오브젝트 디스플레이

in #kr6 years ago (edited)

라즈베리 파이 OpenCV에서 오브젝트를 인식하기 위해서 haarcascade 라이브러리 모듈을 사용하였다. 하지만 haarcascade 모듈의 적용 대상 범위는 사람 얼굴 및 신체 부위, 고양이 얼굴 및 자동차에 한정되고 있는 듯하며 대단히 제한적으로 보인다. 그렇다면 삼라만상dml 그 많은 오브젝트들을 과연 어떻게 인식할 것인가가 큰 문제다.
하다못해 자율 주행만 해도 자동차 자체는 haarcascade로 인식이 가능하다고 해도 주행차선 이나 중앙선은 어떻게 인식할 것인가? 쉽지 않은 문제이다.

여기에 소개하는 마스킹 기법만 해도 대수롭지 않게 생각할 수 있으나 야간 자율주행 시에 차선 인식 문제를 생각해 본다면 그 중요성을 희미하나마 느껴볼 수 있을 것이다.

noname01.png

웬 달이 떴나구요? 컬라 공을 마스킹한 스크린 샷이다. 일타삼매로 공을 스카치테이프 신공으로 살짝 붙여 중앙에 위치시켰다. 청색(blue)공은 이미 성공적으로 hue 값은 upper 130 lower 90으로 이미 그 값이 잘 맞고 있다. 아울러 녹색과 빨간색을 추가해 보자. 지금 시험하는 컬러공들이 좀 오래되었는지 색이 좀 바랜 느낌이 든다.

noname02.png

OpenCV에서 색상을 다룸에 RGB 대신 HSV를 사용한다. RGB는 컴퓨터 디스플레이 모니터를 중심으로 특히 웹에서 색상 표현에 좋으며 자연에서는 무지개 색으로 표현이 가능하다. 반면에 프린팅 된 컬러를 잘 나타내지 못하는 측면도 있다. RGB에 반하여 HSV 는 미술시간에 사용하는 개념인 hue(색상), saturation(채도), brightness(명도)에 해당한다.

OpenCV에서는 hue 의 범위를 0∼255 범위로 잡고 있다. 이 범위 내에 빨강, 파랑, 초록이 겹침이 없이 다 들어와야 한다. 사용자별로 시험해 볼 경우 hue 값 범위를 겹치지 않도록 찾아서 조정해야 한다. 여기서는 녹색의 경우 upper 90 lower 50, 청색은 upper 120 lower 90, 빨간색은 upper 250 lower 120으로 잡았다. 제일 잘되니까! 실제 해보면 조명 영향이 상당히 큰 편이다. 커버 대문 이미지는 밤에 형광등 조명하의 결과이다. 특히 녹색의 경우 공의 면이 좀 번쩍거리는 느낌이 들면 즉 반사가 심하면 잘라 먹은 사과처럼 일부분이 증발해 사라진다. 빨간 색도 벌레가 일부를 슬쩍 먹어버린 느낌이 든다. 청색 공이 제일 잘되는데 OpenCV-Python Tutorials에서 청색 공을 예제로 드는 배경이 짐작이 간다.

자연광의 영향이 있는 오전에 캡츄어한 이미지를 대상으로 조명효과를 비교해 보기 바란다. 자연광 조명 시점에 따라 영향을 많이 받으나 주요한 점은 조명에 상관 없이 오브젝트를 인식할 수 있다는 점이다.

noname03.png

코드 구성은 그다지 복잡하지 않다. 청색(Blue)에 대해서 코딩된 color_detect.py에서 라이브러리 모듈 도입부와 Pi 카메라 설정부분은 그대로 두고 for loop 내부에서만 각 색상별로 한 벌씩 추가하면 된다.

noname04.png

각 색상별로 hue 값의 상한과 하한을 설정해 주고 cv2.inRange() 명령을 사용해 마스크를 뜬 후 bitwise_and() 명령을 실행한다, 마지막으로 색상별로 오브젝트 트랙킹을 위한 마스크 화면과 컬러를 입힌 화면을 cv2.imshow() 명령을 사용하여 출력한다.

각 색상별로 hue 값이란 것이 RGB 값만 사용해봐서 그런지 좀 모호하다는 생각도 든다. 각자 사용하는 공의 색상 특성이 다를 수 있으므로 그 범위가 겹치지 않도록 숫자 범위를 조정하는 몇 번 정도의 수고를 해야 할 듯하다. 공이 없으신 분들은 색상 종이 잘라서 간단히 해봐도 될 듯하다.

그밖에도 머신 러닝 RC카를 준비함에 필요한 것은 오브젝트이 중심 좌표를 찾아내는 일 일 것이다. 그래야 RC 카에 설치된 모터를 구동하여 학습시킨 오브젝트를 스크린의 중앙에 위치 시킬 수 있도록 제어가 가능해질 것이다. 이 문제 해결에 다소 시간이 걸릴 것으로 예상해 본다.

필자의 블로그에 파이선 코드를 올려두었으니 일일이 코드 작업 귀찮으신 분들은 아예 다운받아서 실행해 보도록 하자.

color_BGR_detect.py
http://blog.daum.net/ejleep1/33

Sort:  

Congratulations @codingart! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

Award for the number of comments received
You published a post every day of the week

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:

Presentamos el Ranking de SteemitBoard
Introducing SteemitBoard Ranking

Support SteemitBoard's project! Vote for its witness and get one more award!

머신러닝인건가요?? 머신러닝은 하나도 몰라서 게시글 보면서 공부해보겠습니다ㅎㅎ

OpenCV는 머신 러닝 루틴을 응용해서 오브젝트를 찾아 처리한다고 보면 될 겁니다.
머신 러닝은 쭉 연재를 해 오고 있으니까 그쪽으로 순서대로 보면서 공부하시면 이해가 쌓이겠죠?

Coin Marketplace

STEEM 0.32
TRX 0.12
JST 0.033
BTC 64647.16
ETH 3160.49
USDT 1.00
SBD 4.13