웅재의 코딩세상

제18회 임베디드SW 경진대회 개발 과정 3 본문

프로젝트/제18회 임베디드 SW 경진대회

제18회 임베디드SW 경진대회 개발 과정 3

웅드 2024. 2. 7. 15:36

개발 중 장애요인과 해결 방안

            1. 빛 번짐에 따라 원하는 색상 범위가 달라진다.
              • 영상 내 원하는 곳을 드래그해 드래그한 곳의 hsv값 배열을 출력시키고 높은 값과 낮은 값을 추출해주는 함수를 만들었다. – 출력된 범위가 좁은 것이 단점
              • 트랙바를 이용하여 직접 hsv값을 추출한 다음 함수 내에서 사용해 보았다. – 직접 추출할 때의 캠과 비슷하게 원하는 물체를 추출할 수 있었다. – 확실히 원하는 색상이 출력된다,
            2. 노트북을 이용한 색상과 로봇의 카메라 색상 인식 값이 다르다.
              • 노트북 버전과 캠 버전 등 각각의 카메라가 인식할 수 있는 색상의 범위를 따로 지정했다.
            3. 화살표를 정면이 아닌 다른 각도에서 보면 무게중심이 이동한다.
              • 결함을 찾아 결함 주변에 4개씩 점을 찍어서 컨투어 영역 안에 있는지 밖에 있는지 값을 확인하면 정확하게 인식 가능
            4. 미션 수행할 때 알파벳 인식하는 방법을 넓이로 계산했는데 거리에 따라 넓이가 달라진다.
              • 먼저 알파벳의 색상을 인식하고 그 후 알파벳 범위를 컨투어를 이용해 사각형으로 잡은 다음 그 사각형의 넓이와 알파벳의 넓이를 비율로 계산해 abcd를 출력시켰다. 거리에 상관없이 알파벳이 정확하게 인식이 되어 성공했지만 B와 D의 비율 차이가 크지 않아 거리가 멀어질수록 B와 D의 인식률이 점점 떨어진 다는 문제가 있었다. 컨투어의 크기 즉 컨투어의 개수를 len()함수를 이용해 B는 3개 D는 2개라는 차이점을 이용해 B와 D를 구분할 수 있었다.
            5. 미션 구역의 옆면이 45도 기울어져 있어 거리가 멀수록 알파벳 인식이 힘들다.
              • 미션 수행하기 전 과정이라 다음과정인 미션을 수행하기 위해서는 미션 구역으로 어느정도 전진을 해야 하기 때문에 알파벳 인식 후 미션 수행하는 타임을 줄이기 위해 라인 코너에서 어느정도 전진 후 알파벳을 인식하고 바로 미션을 수행하게 알고리즘을 설계했다.
            6. 노이즈를 제거하는 함수를 사용해도 노이즈가 생김
              • 모폴리지 연산의 확장을 통해 픽셀을 채워 노이즈를 최대한 줄였다.
            7. 로봇 그림자로 인한 hsv값 변환
              • S값의 범위를 좀 더 넓게 잡아 그림자가 져도 색상을 추출할 수 있게 설정

 

개발의 차별성

      • 영상처리 시간을 단축
        • 영상처리 함수(cv2.cvtColor , threshold 등)들을 각 함수들 정의부 안에서 실행하는 것보다 main문 안에서 실행하는 것의 처리 속도가 더 빠르다는 것을 알게 되어 각 함수마다 겹치는 영상처리 함수들을 main문에 적어 처리 속도를 더 올렸다.
      • 동서남북 알파벳을 꼭짓점을 이용해 검출
        • 보통은 알파벳 인식 시키기 위해 넓이로 계산을 하거나 OCR등을 사용하여 문자들을 인식한다. 하지만 우리는 꼭짓점의 개수를 활용해 알파벳들을 구분하기로 했다. 먼저 인식하고자 하는 알파벳의 컨투어를 잡고, 각 컨투어에서 근사 컨투어로 단순화시키고 len(approx) 함수를 사용해 꼭짓점의 개수를 찾아냈다. 각 꼭짓점의 개수를 if문을 통해 알파벳을 검출해 내고 비슷한 꼭짓점의 개수를 가진 값들은 x, y, w, h = cv2.boundingRect(contour)를 이용해 사각형으로 컨투어 시키고, w와 h를 이용해 구분했다.
      • 임베디드 보드를 마스터 보드로 결정하였다.
        • Python 은 한 줄씩 실행하는 인터프리터 언어이고 c++은 컴파일 하는 과정에서 전체 코드를 한번 훑는 컴파일 언어이다. 알고리즘을 설계하고 그에 맞는 코딩을 하기 위해서 먼저 우리가 어떠한 opencv 와 어떠한 라이브러리를 사용해야 하는지 먼저 구상해야 했다. C++보다 Python 을 고른 이유는 파이썬의 새로운 OpenCV-Python 인터페이스는numpy함수를 완벽하게 지원하고, 이미지 처리에 매우 적합한 다양한 매트릭스 작업을 지원하는 최적화 된 라이브러리이기 때문이다. Python을 사용하면서 OpenCV함수와 Numpy함수를 모두 잘 결합할 수 있다면 매우 빠른 코드를 얻을 수 있다. 하지만 파이썬 안에서 루프와 반복을 사용하게 되면 처리 속도가 느려진다. 또한 Python은 인터프리터가 필요하기 때문에 항상 c++보다 훨씬 느리다. 그래서 라즈베리파이 보드를 마스터 보드로 설정하게 되면 Python 안에서 처리하는 내용이 더 많아지게 되는데 처리할 내용이 더 많아지게 되면 결과적으론 동작 하나하나 수행하는 시간이 길어지게 된다. 반면, 임베디드 보드를 마스터 보드로 설정하게 되면 파이썬 안에서 처리해야 하는 양이 적어지기 때문에 처리 속도가 더 빨라진다. 따라서 임베디드 보드를 마스터 보드로 결정했다.
      • 코드의 길이를 최대한으로 줄였다.
        • 처음 알고리즘을 설계할 때 각 함수별로 파트를 나눠서 설계하였다. 각 파트에서 영상처리를 하게 되면 같은 함수를 사용할 수 있다. 예를 들어 RGB 색을 HSV로 바꾸는 함수나 이진화 시키는 함수 등 겹치는 함수를 사용하는 경우가 많았다. 똑같은 함수를 계속 사용하게 되면 결국 같은 동작을 여러 번 하게 되기 때문에 함수를 합칠 때 각 함수내 겹치는 부분을 main문에 한번에 써주고 그 변수를 각 함수들의 변수로 넣어주어 함수 내에서의 처리 속도를 올렸을 뿐만 아니라 전체 코드의 길이도 짧아져 코드를 디버깅 시키는 시간을 단축할 수 있었.

 

팀 업무 분담

No 구분 성명 참여인원의 업무 분담
1 팀장 이웅재 유, 무선 통신설정
알고리즘 개발
라즈베리파이 영상처리 적용
2 팀원 송** 화살표 영상처리
로봇의 전체 흐름도를 로보베이직으로 구현
임베디드 보드와 라즈베리파이 사이의 통신 값 설정
3 팀원 유** 극좌표를 이용한 라인트레이스 코딩
4 팀원 윤** 미션 구역 영상처리
- 미션 구역
- 우유곽 인식
5 팀원 이** Rectangle( ) 함수를 사용하여 좌표를 통한 라인트레이스 코딩
전반적인 코드 정리

 

        소스코드 : 

https://github.com/conoid/woongbot

 

GitHub - conoid/woongbot

Contribute to conoid/woongbot development by creating an account on GitHub.

github.com

        1.  
  1.  

 

시연 동영상 : https://youtu.be/XW39GTmv2Rk

 

반응형