mỗi lần một dự án đi kèm với sức mạnh kỳ diệu đó để tiêu thụ thời gian và sự chú ý của bạn trong nhiều tháng. Khi cuối cùng bạn hoàn thành nó, bạn cảm thấy tiếc vì bạn không phải làm gì thêm.
Điều gì đặc biệt về trình đọc bóng bingo này? Nó có vẻ giống như một dự án OCR thông thường thoạt nhìn; Một máy quay video ghi lại phần mềm hình ảnh và OCR nhận dạng số. dễ như thế. Và nó hoạt động mà không gặp vấn đề gì, giống như mọi tiện ích dễ dàng nên.
Nhưng sau đó một lần nữa, có lẽ nó không đơn giản. Các số nằm rải rác trên quả bóng, vì vậy chúng phải được định vị trước, và ứng cử viên tốt nhất để đọc nên được chọn. Sau đó, các số được vẽ lên một quả cầu chứ không phải là một bề mặt phẳng, trong một số trường hợp khiến chúng bị biến dạng đến mức hình dạng của chúng phải được phục hồi trước. Ngoài ra, góc đọc không cố định nhưng ở đâu đó trên thang điểm 360 °. Và sau đó chúng ta có vấn đề về chói lóa để khởi động, khi Bingo Balls rất sáng bóng đến nỗi mọi nguồn sáng phản chiếu như một điểm sáng bão hòa.
Vì vậy, đó là tất cả của nó? Vâng, gần như. Nhiệm vụ dự kiến sẽ được thực hiện bởi một vi điều khiển nhúng, với tốc độ và bộ nhớ hạn chế, nhưng quá trình nhận dạng cho một quả bóng phải nhanh – tệ nhất 500 ms. Nhưng đó chỉ là một phần của quá trình. Dự án bao gồm cơ chế đường ống chấp nhận bóng, vận chuyển nó sẽ được OCR quét và sau đó được quay bởi máy quay video phát sóng công cộng trước khi nó bị đổ. Và cuối cùng, nếu việc đọc không đủ đáng tin cậy, bóng phải được quay một cách tinh tế để các con số sẽ được định vị lại cho một nỗ lực đọc khác.
Bất chấp những thách thức này tôi đã quản lý để xây dựng hệ thống này. Nó nhanh và đáng tin cậy, và tôi đã phát hiện ra một số thủ thuật rất thú vị trên đường đi. Hãy xem video demo nhanh chóng bên dưới để cảm nhận về tốc độ và hệ thống “nhìn thấy” gì. Sau đó tham gia cùng tôi sau giờ nghỉ để lặn vào các chi tiết của bản dựng nhúng thú vị này.
Ban đầu, tôi nghĩ rằng tôi sẽ phải sử dụng một mạng lưới thần kinh cho quá trình nhận dạng, nhưng hóa ra sự công nhận thực sự là một phần đơn giản nhất của dự án, và nó sẽ đơn giản hơn nhiều và nhanh hơn để thực hiện thuật toán. Phần khó khăn là xác định những gì trên toàn bộ hình ảnh, định vị số tốt nhất, dòng dưới nó, và đo bao nhiêu để được xoay. Bắt đầu không có gì nhiều hơn một hình ảnh bitmap, bộ xử lý phải thực hiện nhiều môn toán ngay cả trước khi có thể chắc chắn nếu số lượng bao gồm một hoặc hai chữ số.
Sơ đồ đơn giản hóa của phần OCR
VGA trong quá trình phát triển
Để làm cho việc phát triển, bảo trì và điều chỉnh dễ dàng hơn, cùng MCU được sử dụng để tạo tín hiệu VGA ngoài việc tìm nạp và xử lý hình ảnh. Nó không chỉ hiển thị hình ảnh được quét, mà còn bao gồm một số thông số hiện tại và nội dung RAM. Bảng điều khiển có đầu nối VGA, nhưng nó không nên được sử dụng trong hoạt động bình thường của thiết bị. Màn hình VGA không có gì chung với màn hình phát sóng trong hội trường Bingo, vì có hai máy ảnh độc lập và hệ thống chiếu sáng.
Tạo tín hiệu VGA tiêu thụ rất nhiều thời gian xử lý, do đó nó bị tắt trong khi tìm nạp và xử lý hình ảnh, khoảng 500 ms trong mỗi chu kỳ đọc bóng. Tín hiệu đồng bộ được tạo trong suốt bởi các thiết bị ngoại vi PWM bên trong và chúng đang hoạt động mọi lúc, để hình ảnh khôi phục sau khi thiết lập tín hiệu RGB nhanh.
Trong trường hợp này, vi điều khiển 16 bit PIC24EP512GP806 đã được sử dụng, với 586/52 K của bộ nhớ / dữ liệu / tốc độ thực thi 60 mips.
Tìm nạp hình ảnh
Máy quay video “Cube” rẻ tiền được sử dụng trong giai đoạn phát triển đầu tiên, nhưng sau đó được thay thế bởi một camera khối kỹ thuật số. Cả hai đều giống nhau về giá cả và hiệu suất, nhưng cái sau đi kèm với ống kính có tiêu cự cao hơn, do đó khoảng cách có thể cao hơn và máy quay video có thể nhìn thấy diện tích lớn hơn của quả bóng.
Đối với một vật thể nhỏ như vậy, nguồn sáng tốt nhất nên là đèn LED trắng, nhưng ánh sáng chói khá tệ với bề mặt bóng sáng bóng. Tôi đã thực hiện một số thí nghiệm với bộ khuếch tán, nhưng không có may mắn. Dịch vụ cuối cùng đến từ một cách tiếp cận khá khác nhau: phản xạ rất sáng và sắc nét, nhưng với sự phơi nhiễm gấp đôi sử dụng các nguồn sáng khác nhau. Trong quá trình tìm nạp hình ảnh thứ hai, MCU chọn giá trị thấp hơn cho mỗi pixel.
Khi các điểm nóng không bao giờ kết hợp, chúng sẽ bị hủy và hình ảnh kết quả (ảnh thứ ba từ bên trái) được chiếu sáng đều và không sáng. Là một phần thưởng được thêm vào, các phản xạ ánh sáng nền cũng bị hủy trong quy trình.
Xin lưu ý rằng hệ thống được nhúng, không có chức năng ảnh chụp màn hình, vì vậy hình ảnh đến từ màn hình VGA được chụp bằng máy ảnh.
Nguồn sáng bao gồm 16 đèn LED trắng, do đó tám đèn LED đang hoạt động tại một thời điểm. Hình ảnh ở phía bên phải xa xôi đại diện cho sự sắp xếp LED từ quan điểm của máy ảnh. Đèn LED màu đỏ và xanh dương ở đây để giúp phân biệt giữacác nhóm cho tiếp xúc thứ nhất và thứ hai.
Điều này làm cho quá trình chậm hơn đáng kể, như bây giờ chúng ta không chỉ có hai lần phơi sáng, mà còn là thời gian khung hình giả giữa hai lần phơi sáng, để cho phép phục hồi và chỗ ở của cảm biến CMOS sau khi ánh sáng thay đổi. Đó là lý do tại sao toàn bộ quá trình hình ảnh thực tế là 100 ms.
Độ phân giải của hình ảnh được quét là 220 × 220 pixel, với độ sâu 8 bit pixel. Hình ảnh GreenScale tương tự chỉ bao gồm sáu bit, với hai bit còn lại đang được sử dụng cho biểu diễn màu xanh lam và đỏ trên màn hình, vì thang độ xám thực sự là Greenscale. Những pixel thêm được sử dụng làm pixel cờ đặc biệt giữa các bước xử lý, hiển thị ở chế độ một bước, dưới dạng các khu vực màu xanh và đỏ. Điều này [hóa ra là] rất hữu ích trong quá trình phát triển chương trình và gỡ lỗi.
Toàn bộ quá trình được chia thành 17 bước, cũng có thể được thực hiện ở chế độ một bước cho mục đích phát triển và gỡ lỗi. Số bước được hiển thị ở góc trên cùng bên trái của màn hình (xem bên dưới) và trạng thái hiện tại của đồng hồ bấm giờ với độ phân giải 1 ms ở trên cùng bên phải. Bằng cách này, thật dễ dàng để theo dõi thời gian thực hiện và tối ưu hóa từng bước.
Vị trí bóng và kéo dài
Để xác định vị trí bóng chính xác, X, Y tọa độ cho Centroid (Trung tâm hình học) được tính toán, sử dụng công thức CX = σcixai / σai và cy = σciyai / σai, trong đó CX, CY là tọa độ x, y và A là giá trị của mỗi pixel. Khi nền chủ yếu là màu đen trước bước này, CX, CY sẽ đại khái ở trung tâm của quả bóng. Sau đó, toàn bộ bộ đệm khung được di chuyển dưới dạng khối 2D, để Centroid ở tọa độ x = 110, y = 110, nằm ở trung tâm của khung. Trung tâm được đánh dấu bằng 2 × 2 pixel đỏ (bit 7) chỉ dành cho sự tiện lợi của nhà phát triển, vì phần mềm xử lý trong nhiều trường hợp bỏ qua bit 6 và 7.
Tiếp theo, đường kính bóng được đo, tính giá trị pixel trung bình trên chu vi cho các đường kính khác nhau. Sau đó, nền (mỗi pixel bên ngoài đường kính) được đặt thành “trắng” hoặc, cụ thể hơn nhiều, màu xanh lá cây (giá trị 0x3F), để đảm bảo cách ly tốt hơn các khu vực màu đen. Nền sẽ được đặt thành màu trắng hoặc đen nhiều lần nhiều hơn trong quá trình xử lý, mỗi lần lựa chọn các khu vực màu đen (mực) hoặc màu trắng (giấy) là bắt buộc.
Hoàn toàn biến đổi một quả cầu thành một bề mặt phẳng là không thể, nhưng hình dạng có thể được cải thiện nếu hình ảnh không bị biến dạng tuyến tính, giống như trên hình ảnh Bước 3. Bộ vi điều khiển nhỏ 16 bit không có bộ đồng xử lý số học và sử dụng các thư viện lượng giác tiêu chuẩn sẽ tiêu thụ quá nhiều thời gian xử lý. Đó là lý do tại sao các bảng tra cứu lượng giác được sử dụng và bạn có thể thấy trên đồng hồ bấm giờ (các chữ số màu xanh tốt nhất trên cùng) mà trong trường hợp này, thời gian thực hiện cho quy trình kéo dài chỉ 11 ms. Bạn cũng có thể thấy rằng phần trung tâm của quả bóng chủ yếu là không đổi, và các cạnh không được kéo dài tuyến tính để các biến dạng hình cầu được giảm thiểu.
Ở bước 4, tương tự như chức năng Mặt nạ Unsharp trong Photoshop, một hình ảnh mới, mờ được tạo. Vì không có đủ không gian RAM cho một bộ đệm đầy đủ khác, nó được thực hiện trên hình ảnh phụ trợ được thu nhỏ xuống độ phân giải 44 × 44. Chức năng của mặt nạ Unsharp rất quan trọng, vì nó đảm bảo tốt hơn các pixel “mực” so với các pixel “giấy”. Chọn ngụ ý cài đặt “bit 7”, sẽ dẫn đến các khu vực màu đỏ trên màn hình VGA.
Bây giờ có hai hình ảnh trong cùng một bộ đệm khung, thang độ xám (bit 0-5) và nhị phân một (bit 7). Loại thứ hai được sử dụng trong bước tiền xử lý 6, nơi loại bỏ các lỗ nhỏ và vết trầy xước. Hình ảnh đã chọn lần đầu tiên được mở rộng và ký hợp đồng, và sau đó quá trình được lặp lại với việc mua các hoạt động đảo ngược – dẫn đến các cạnh được làm tròn trơn tru và không có rác.
Thao tác thành phần.
Sau một vài bước tiến triển hơn nhiều, sẽ diễn ra nhiều hoạt động lớn hơn nhiều. Cái đầu tiên được gọi là “Các thành phần được kết nối”, trong đó các khu vực bị cô lập được chọn và tham số cho mỗi phần được mua. Điều này bao gồm kích thước X và Y, tọa độ trung tâm X và Y, số pixel được chọn và khoảng cách của Euclid từ trung tâm của khung. Điều này sẽ giúp sắp xếp mọi thành phần dưới dạng chữ số, vòng tròn lớn, gạch chân hoặc nền. Ở giai đoạn này, nó cũng trở nên rõ ràng nếu số bao gồm một hoặc hai chữ số.
Bước này mất rất nhiều thời gian xử lý, khoảng 200 ms. Một vấn đề khác là thuật toán tiêu chuẩn cho các thành phần được kết nối đòi hỏi một bộ đệm khung phụ có cùng kích thước, do đó tôi phải tạo một thuật toán mới sử dụng cùng bộ đệm khung, cộng với một bảng nhỏ để tọa độ ngắn hạn.
Tại thời điểm này, thật dễ dàng để bộ xử lý chọn ứng cử viên tốt nhất để nhận dạng – đó là vòng tròn với khoảng cách nhỏ nhất của Euclid từ trung tâm của quả bóng. Các thành phần được kết nối bên trong vòng tròn này được tính đến và mọi thứ khác đều bị hết hạn.
Những quả bóng trong câu hỏi là những quả bóng OCR đặc biệt với những con số được gạch chân, so rằng góc quay có thể được đo. Bây giờ, trung tâm của vòng tròn được biết đến, chương trình xoay hình thức “t” ảo, tương ứng với hình dạng gạch chân, trong 512 bước xung quanh vòng tròn 360 °, đếm cách “pixel” mực “chứa. Số lượng được đánh giá cao nhất chỉ ra góc xoay, sau đó khối bộ đệm khung 2D được chuyển sang góc dưới cùng của hình ảnh (Bước 12 trên hình ảnh ngoài cùng bên trái) và xoay được thực hiện, di chuyển bitmap sang góc đối diện của bộ đệm khung. Nhờ các bảng tra cứu logarit, nhóm hoạt động này chỉ mất 50 ms.
Nó tiếp tục tốt hơn với mỗi bước. Các chữ số được chọn với các màu khác nhau, sau đó một chữ số được di chuyển đến khoảng cách an toàn, và sau đó mỗi chữ số được thu nhỏ đến độ phân giải đã biết là 30 × 46.
Sự công nhận
Vì độc giả này là dự án OCR đầu tiên của tôi, tôi ngây thơ nghĩ rằng quá trình nhận dạng sẽ là phần khó khăn nhất để giải quyết. Sau mỗi bước đã được gỡ lỗi và kiểm tra từng cái một, tôi đã đạt đến bước thứ 17 và cuối cùng. Như tôi đã chỉ ra, kế hoạch ban đầu của tôi là lựa chọn một mạng lưới thần kinh, nhưng sau đó tôi đã thử một thuật toán dễ dàng và chơi xung quanh với nó. Tôi đã đánh giá nó với một vài quả bóng và bạn không thể tưởng tượng được tôi bị sốc như thế nào khi tôi thấy nó hoạt động hoàn hảo! Cuối cùng, bitmap được hiển thị chính xác cho hai số ASCII.
Thuật toán khá đơn giản. Bitmap cho mỗi chữ số thực tế được chia thành ba phần, đầu tiên theo chiều ngang, và sau đó theo chiều dọc. Sau đó, pixel hoạt động được tính ở mọi cột hoặc hàng và biểu đồ được tạo. Ngoài ra còn có một biểu đồ thứ 7 được thêm vào, được nghiêng để giúp phát hiện tốt hơn các đường cắt ngang tại các chữ số 4 và 7.
Chỉ mất 3 ms để xây dựng bảy biểu đồ cho mỗi chữ số và để so sánh chúng với các bảng được sắp xếp trước, tính tổng các lỗi có ý nghĩa của Squared và sắp xếp kết quả. Để làm cho sự phát triển và gỡ lỗi dễ dàng hơn, tất cả các biểu đồ được vẽ lên màn hình.
Sau khi kết quả so sánh được sắp xếp, chúng tôi sẽ nhận được người chiến thắng cho mỗi chữ số (trong trường hợp này 8 và 5), nhưng công việc của chúng tôi không được thực hiện cho đến khi một điều nữa diễn ra. Chất lượng đọc phải được xếp hạng, để bộ điều khiển có thể ước tính nếu kết quả đủ đáng tin cậy.
Nếu số trên bóng chỉ có một chữ số, bảng lỗi cho mỗi chữ số (0 … 9) được sắp xếp và “người chiến thắng” được so sánh với cái thứ hai (gần như-người chiến thắng). Nếu tỷ lệ cao, ngụ ý rằng sự công nhận thành công. Trong trường hợp của chúng tôi, đó là 147%, ngụ ý rằng ứng cử viên được xếp hạng thứ hai có nhiều lỗi hơn 147% so với loại tốt nhất. Chẳng hạn, lần đầu tiên có 100 đơn vị lỗi “và lần thứ hai có 247. Đây là một đánh giá tốt, mặc dù nhiều xếp hạng là về phía bắc 300%. Nói chung, xếp hạng cao hơn 80% nên được coi là đủ an toàn.
Nhưng nếu có hai chữ số thì sao? Một chuỗi chỉ mạnh như liên kết yếu nhất của nó, vì vậy chương trình sẽ bỏ qua chữ số được nhận dạng thành công hơn nhiều (loại có tỷ lệ cao hơn) và sử dụng một chữ số yếu hơn để đưa ra quyết định cuối cùng về thành công.
Bộ điều khiển có hai chế độ hoạt động cơ bản. Ở chế độ nhanh, chỉ có một lần đọc, được lặp lại (sau khi quay bóng) chỉ khi lần đọc đầu tiên không được đánh giá đủ tốt. Ở chế độ chậm hơn (“an toàn”), có hai bài đọc có kết quả sẽ khớp.
Người đọc được đánh giá ở Belgrade, trong Công ty Eleks-M, nơi sản xuất thiết bị sòng bạc. Thử nghiệm đã được thực hiện với một máy quay video bổ sung, tự động ghi lại từng cách đọc bóng, sau đó các hình ảnh (với tên tệp không chứa gì ngoài số bóng được công nhận) được sắp xếp theo thứ tự abc và séc cuối cùng được thực hiện theo cách thủ công.
Toàn bộ bài kiểm tra kéo dài trong 240 giờ, giúp kiểm tra căng thẳng về độ bền của máy thổi lô tô ngoài đầu đọc. Sau 10 ngày và 115.000 quả bóng đọc, chỉ có một lần đọc sai (Ball 37 đã được đọc là 7), với trình đọc được đặt thành Chế độ nhanh. Kiểm tra ở chế độ an toàn sẽ là vô nghĩa, vì một lỗi có thể sẽ không bao giờ xảy ra.
Khái niệm cơ học.
Đường dẫn vật lý cho Bingo Balls là C