한 번씩 마이크로 컨트롤러

로 빙고 볼을 읽는 동안 프로젝트가 그 마법의 힘과 함께 수많은 개월 동안 당신의 시간과 관심을 소비하는 것과 함께 프로젝트가 함께 제공됩니다. 마침내 그것을 완성 할 때, 당신은 더 많은 것을 할 필요가 없다는 것을 미안합니다.

이 빙고 볼 리더에 대해 매우 특별한 것은 무엇입니까? 언뜻보기에 일반적인 OCR 프로젝트처럼 보일 수 있습니다. 비디오 카메라는 이미지와 OCR 소프트웨어를 캡처하여 숫자를 인식합니다. 쉽게. 그리고 그것은 모든 쉬운 가제트와 마찬가지로 문제없이 작동합니다.

그러나 다시는 다시는 그렇게 간단하지 않습니다. 숫자는 공 전체에 흩어져 있으므로 먼저 위치해야하며 독서를위한 가장 좋은 후보가 선택되어야합니다. 그런 다음 숫자는 평평한 표면보다는 구체에 칠해져 있으며 어떤 경우에는 모양이 먼저 회수되어야하는 지점으로 변형됩니다. 또한 독서 각도는 고정되지 않지만 360 ° 규모의 어딘가에 있습니다. 그리고 빙고 볼이 너무나 빛나는 모든 광원이 포화 된 밝은 자리로 반사되는 반짝 이는 눈부심 문제가 있습니다.

그게 모든 것인가? 글쎄, 거의. 이 작업은 제한된 속도와 메모리가있는 임베디드 마이크로 컨트롤러에 의해 수행 될 것으로 예상되지만, 하나의 볼에 대한 인식 프로세스는 최악의 경우 500ms입니다. 그러나 그것은 단지 과정의 한 부분입니다. 이 프로젝트에는 공을 수락하고 OCR에 의해 스캔하여 투입되기 전에 공용 방송 비디오 카메라가 촬영할 수있는 파이프 라인 메커니즘이 포함되어 있습니다. 그리고 마지막으로, 판독 값이 충분히 신뢰할 수 없으면, 볼을 미묘하게 회전 시켜서 숫자가 다른 읽기 시도를 위해 재배치 될 수 있도록해야합니다.

이러한 문제에도 불구 하고이 시스템을 구축 할 수있었습니다. 그것은 빠르고 신뢰할 수 있으며, 나는 그 길을 따라 매우 흥미로운 트릭을 발견했습니다. 아래의 빠른 데모 비디오를 살펴보고 속도에 대한 느낌, 시스템이 “보는”것입니다. 그런 다음이 재미있는 임베디드 빌드의 세부 사항으로 다이빙을 마시려면 휴식을 취한 후에 저에게 합류하십시오.

처음에, 나는 내가 인정 과정을 위해 신경망을 고용해야한다고 생각했지만, 실제로는 실제로 프로젝트의 가장 간단한 부분이며, 훨씬 더 간단하고 더 빠르게 알고 있어야한다는 것입니다. 어려운 부분은 전체 이미지에 무엇이 가장 좋은 번호를 찾아야 하는지를 식별하고, 그 아래에서 줄을 찾아서 회전 해야하는지 측정하는 것입니다. 비트 맵 이미지보다 훨씬 더 많은 것을 시작하면 숫자가 하나 또는 두 자리로 구성되어 있는지 확인하기 전에 프로세서가 많은 수학을 수행해야합니다.

OCR 섹션의 개략도
개발 중 VGA

개발, 유지 보수 및 조정을보다 쉽게하기 위해 동일한 MCU가 이미지 가져 오기 및 처리 외에도 VGA 신호 생성에 사용됩니다. 스캔 한 이미지를 표시 할뿐만 아니라 현재 매개 변수와 RAM 내용도 포함합니다. 컨트롤러 보드에는 VGA 커넥터가 있지만 장치의 정상 작동 중에는 사용하지 않아야합니다. VGA 모니터에는 두 개의 독립적 인 카메라 및 조명 시스템이 있으므로 빙고 홀의 방송 모니터와 공통점이 없습니다.

VGA 신호 생성은 많은 프로세서 시간을 소비하므로 이미지 가져 오기 및 처리 중에 스위치가 꺼져 있으며 각 볼 읽기 사이클 동안 약 500ms입니다. 동기 신호는 내부 PWM 주변 장치에 의해 투명하게 생성되며 항상 활성 상태이므로 RGB 신호 설정 후 사진 복원이 빠릅니다.

이 경우 586/52 k의 프로그램 / 데이터 메모리와 60 개의 MIPS 실행 속도가있는 16 비트 마이크로 컨트롤러 PIC24EP512GP806이 사용되었습니다.

이미지를 가져옵니다

저렴한 아날로그 “큐브”비디오 카메라는 개발 첫 단계에서 사용되었지만 나중에 디지털 큐브 카메라로 대체되었습니다. 둘 다 가격과 성능이 비슷하지만 후자는 초점 거리가 높을수록 렌즈와 함께 제공되므로 거리는 비디오 카메라가 공의 큰 영역을 볼 수 있습니다.

그러한 작은 물체의 경우 가장 좋은 광원은 백색 LED가되어야하지만 눈부심은 반짝이는 볼 표면으로 아주 나빴습니다. 나는 기관총을 가진 몇 가지 실험을 수행했지만 운이 없었습니다. 최종 서비스는 매우 밝고 날카로운 반사를 매우 밝고 날카로운 반사로부터 왔지만 다른 광원을 사용하는 이중 노출이 있습니다. 두 번째 이미지 가져 오기 프로세스 중에 MCU는 모든 픽셀에 대한 낮은 값을 선택합니다.

핫스팟이 일치하지 않으므로 취소되면 결과 이미지 (왼쪽의 세 번째 사진)가 균등하게 켜지고 눈부심이 없어집니다. 추가 보너스로서, 배경 빛 반사가 프로세스에서 취소되었다.

스크린 샷 기능이없는 시스템이 포함되어 있으므로 이미지가 카메라로 촬영되는 VGA 모니터에서 가져옵니다.

광원은 16 개의 백색 LED로 구성되어 있으므로 8 개의 LED가 한 번에 활성화됩니다. 맨 오른쪽의 이미지는 카메라의 관점에서 LED 배열을 나타냅니다. LED는 붉은 색과 파란색이 여기에 구분을 돕습니다.첫 번째 및 두 번째 노출을위한 그룹.

이렇게하면 프로세스는 두 개의 노출뿐만 아니라 조명이 변경된 후 CMOS 센서의 복구 및 객담을 허용하기 위해 두 개의 노출뿐만 아니라 두 개의 노출 사이의 더미 프레임 시간을 갖게됩니다. 그래서 전체 이미징 프로세스가 실질적으로 100ms를 차지하는 이유입니다.

스캔 한 이미지의 해상도는 8 비트 픽셀 깊이가있는 220 × 220 픽셀입니다. 아날로그 그레이 스케일 이미지는 단지 6 비트로 구성되며 나머지 두 비트가 모니터에서 파란색과 붉은 색 표현에 사용되는 것입니다. 그레이 스케일은 실제로 그린스 케일입니다. 이러한 여분의 픽셀은 파란색 및 빨간색 영역으로 단일 단계 모드에서 볼 수있는 처리 단계간에 특수 플래그 픽셀로 사용됩니다. 이것은 프로그램 개발 및 디버깅 중에 매우 유용합니다.

전체 프로세스는 개발 및 디버깅을 위해 단일 단계 모드에서 수행 할 수있는 17 단계로 나뉩니다. 스텝 번호는 화면의 왼쪽 상단 모서리에 표시됩니다 (아래 참조). 오른쪽 상단의 1 MS 해상도로 스톱워치의 현재 상태가 표시됩니다. 이러한 방식으로 실행 시간을 따르고 각 단계를 최적화하는 것이 쉽습니다.

공 위치와 스트레칭

공을 정확하게 찾으려면, CTROMS = σcixai / σai 및 cy = σciyai / σai를 사용하여 Centroid CX = σcixai / σai 및 cy가 x, y 좌표를 사용하여 계산됩니다. 모든 픽셀의 값. 이 단계 이전에 배경이 주로 검은 색이므로 CX는 CY가 공을 대략 중앙에있을 것입니다. 그런 다음 전체 프레임 버퍼가 2D 블록으로 이동되므로 Centroid가 프레임의 중앙에있는 좌표 x = 110, y = 110입니다. 센터에는 많은 경우의 가공 펌웨어가 비트 6과 7을 무시함에 따라 개발자의 편의를 위해 2 × 2 개의 적색 픽셀 (비트 7)으로 표시됩니다.

다음으로, 볼 지름은 측정되어 서로 다른 직경을 위해 둘레에 평균 픽셀 값을 계산한다. 그런 다음 배경 (직경 밖에있는 모든 픽셀)은 흑색 영역의 더 나은 격리를 보장하기 위해 “흰색”또는 훨씬 더 구체적으로 녹색 (값 0x3F)으로 설정됩니다. 배경은 검정색 (잉크) 또는 흰색 (종이) 영역을 선택할 때마다 처리 중에 백색 또는 검정색으로 설정됩니다.

평평한 표면으로 구를 완벽하게 변형시키는 것은 불가능하지만, 이미지가 3 단계 이미지와 같이 비선형으로 변형되면 형상이 향상 될 수 있습니다. 작은 16 비트 마이크로 컨트롤러는 산술 코 프로세서가 없으며 표준 삼각법 라이브러리를 사용하면 너무 많은 프로세서 시간이 소비됩니다. 그래서 삼각법 룩업 테이블이 사용되었으며 스톱워치 (최상의 블루 숫자)에서 볼 수 있습니다.이 경우 스트레칭 절차의 실행 시간은 11ms 만있었습니다. 또한 볼의 중앙 부분이 대부분 변하지 않고 모서리는 구형 변형이 최소화되도록 모서리가 선형 적으로 늘어납니다.

4 단계에서는 Photoshop의 Unsharp 마스크 기능과 유사하게 새롭고 흐려진 이미지가 생성됩니다. 다른 전체 프레임 버퍼에 대한 RAM 공간이 충분하지 않기 때문에, 해상도 44 × 44로 스케일 된 보조 이미지에서 수행된다. unsharp 마스크의 기능은 “종이”픽셀과 관련하여 “잉크”픽셀을 더 잘 선택할 수 있으므로 매우 중요합니다. 선택은 “비트 7의 설정”을 암시하는 “비트 7″은 VGA 화면에 빨간색 영역이됩니다.

이제 동일한 프레임 버퍼에 두 개의 이미지, 그레이 스케일 하나 (비트 0-5) 및 이진 1 (비트 7)이 있습니다. 후자는 작은 구멍과 스크래치가 제거되는 전처리 단계 6에서 사용됩니다. 선택한 이미지가 먼저 확장되고 계약을 맺은 다음 프로세스가 반전 된 작업 구매로 반복됩니다. 가장자리가 원활하게 둥글게되고 가비지가없는 결과를 얻습니다.

구성 요소 조작

훨씬 더 사전 처리 단계를두고 훨씬 더 많은 주요 작업이 수행됩니다. 첫 번째는 격리 된 영역이 선택되고 각각의 매개 변수가 획득되는 “연결된 구성 요소”로 알려져 있습니다. 여기에는 X 및 Y 치수, X 및 Y 중심 좌표, 선택된 픽셀 수 및 프레임 중심에서 유클리드의 거리가 포함됩니다. 이렇게하면 모든 구성 요소를 숫자, 큰 원, 밑줄 또는 배경으로 정렬하는 데 도움이됩니다. 이 단계에서는 숫자가 1 숫자 또는 두 자리를 포함하면 분명 해집니다.

이 단계에서는 약 200ms의 처리 시간을 많이 사용합니다. 연결된 구성 요소의 표준 알고리즘이 동일한 크기의 보조 프레임 버퍼가 필요하므로 동일한 프레임 버퍼를 사용하는 새 알고리즘을 만들어 내고 단기 좌표를위한 작은 테이블을 만들어야한다는 것입니다.

이 시점에서 프로세서가 인식을 위해 최상의 후보를 선택하기가 쉽습니다. 그것은 공의 중심에서 가장 작은 유클리드의 거리를 가진 원입니다. 이 원 안에 연결된 구성 요소가 고려되고 다른 모든 것이 삭감됩니다.

문제의 공은 밑줄 친 번호가있는 특별한 OCR 공입니다.o 회전 각도를 측정 할 수 있습니다. 이제 원의 중심이 알려져 있으므로 프로그램은 밑줄 모양에 해당하는 가상 “T”양식을 회전시켜 360 ° 원 주위에 512 단계의 “잉크”픽셀을 계산합니다. 가장 높은 정격 수는 회전 각도를 지시하고, 프레임 버퍼의 2D 블록은 이미지의 하단의 최상의 모서리로 이동되고 회전이 수행되고 비트 맵을 반대 모서리로 이동합니다 프레임 버퍼의. 로그 룩업 테이블 덕분 에이 작업 그룹은 50ms 밖에 걸리지 않습니다.

그것은 모든 단계에서 더 좋아지고 있습니다. 숫자가 다른 색상으로 선택되면 한 자리가 안전한 거리로 이동 한 다음 각 숫자는 30 × 46의 알려진 해상도로 확장됩니다.

인식

이 독자가 첫 번째 OCR 프로젝트 였기 때문에 인식 과정이 가장 힘든 부분이 될 것이라고 생각합니다. 각 단계가 완전히 디버깅되어 하나씩 확인 된 후 17 번째와 마지막 단계에 도달했습니다. 내가 이미 지적했듯이, 초기 계획은 신경망을 선택하는 것이었지만, 나는 쉬운 알고리즘을 시도하고 그것을 가지고 노는 것입니다. 나는 그것을 몇 개의 공으로 평가했고, 내가 그것이 완벽하게 작동하는 것을 보았을 때 얼마나 충격을 받았는지 상상할 수 없다! 마지막으로 비트 맵이 두 개의 ASCII 번호로 올바르게 렌더링되었습니다.

알고리즘은 아주 간단합니다. 각 숫자의 비트 맵은 실제로 세 부분으로 실질적으로 분할되었으며,이어서 수평으로, 그리고 세로로 분할되었습니다. 그런 다음 활성 픽셀은 모든 열 또는 행에서 계산되고 히스토그램을 생성했습니다. 또한 숫자 4 및 7에서 크로스 컷 라인을 더 잘 탐지하는 데 도움이되는 7 번째 히스토그램이 추가되었습니다.

각 숫자마다 7 개의 히스토그램을 구축하고 사전 녹음 된 테이블과 비교하고 제곱 오류를 암시하는 합계를 계산하고 결과를 정렬합니다. 개발 및 디버깅을보다 쉽게 ​​만들려면 모든 히스토그램이 화면에 표시됩니다.

비교 결과가 분류 된 후, 우리는 각 숫자 (이 경우 8 및 5)에 대한 승자를 얻었지만, 우리의 일은 훨씬 더 많은 일이 일어날 때까지 우리의 일이 수행되지 않습니다. 읽기의 품질을 평가해야하므로 컨트롤러가 결과가 충분히 신뢰할 수 있는지 추정 할 수 있습니다.

볼의 번호가 하나만 있으면 각 숫자 (0 … 9)에 대한 오류 테이블이 정렬되고 “WINNER”는 두 번째 하나 (거의 우승자)와 비교됩니다. 비율이 높으면 인식이 성공적이라는 것을 의미합니다. 우리의 경우에는 147 %였습니다. 이는 두 번째 정격 후보가 가장 좋은 것보다 147 % 더 많은 오류가 있음을 의미합니다. 예를 들어, 첫 번째 것은 100 “에러 유닛”이 있었고 두 번째는 247을 가지고있었습니다. 이것은 많은 등급이 300 % 북쪽이지만 이것은 좋은 등급입니다. 일반적으로 80 % 이상의 등급은 충분히 안전하게 고려되어야합니다.

그러나 두 자리가있는 경우에는 어떨까요? 체인은 가장 약한 링크만큼 강하기 때문에 프로그램은 훨씬 더 성공적으로 인정받는 숫자를 무시하고 더 높은 비율을 가진 사람을 무시하고 약한 것을 사용하여 성공에 대한 최종 결정을 내릴 수 있습니다.

컨트롤러에는 두 가지 기본 모드가 있습니다. 빠른 모드에서는 첫 번째 읽기가 충분히 잘 평가되지 않은 경우에만 반복되는 (볼 회전 후) 하나의 독서가 있습니다. 느리게 ( “안전”) 모드에서는 결과가 일치 해야하는 두 가지 판독 값이 있습니다.

독자는 카지노 장비를 생산하는 Eleks-M Company의 베오그라드에서 평가되었습니다. 테스트는 모든 볼 읽기를 자동으로 녹음 한 다음 여분의 스틸 비디오 카메라로 수행 한 다음 이미지 (인식 된 볼 번호를 포함한 파일 이름을 포함하는 파일 이름을 포함하는 파일 이름과 함께 표시되지 않음)가 수동으로 최종 수표를 수행했습니다.

전체 테스트는 240 시간 동안 지속되므로 독자 이외에 빙고 송풍기의 내구성을 시험하는 데 도움이됩니다. 10 일과 115,000 개의 볼을 읽은 후에는 독자가 빠른 모드로 설정되어있는 것과 함께 하나의 잘못된 판독 값 (볼 37이 읽혔습니다) 만있었습니다. 안전 모드에서의 테스트는 오류가 발생하지 않으므로 의미가 없습니다.

기계적 개념

빙고 공의 물리적 경로는 C입니다

Leave a Reply

Your email address will not be published. Required fields are marked *

Previous post 레이저 커터
Next post 빛, 연기 및 많은 거울