READING BINGO balls WITH MICROCONTROLLERS

author
4 minutes, 34 seconds Read

Every once in a while a project comes along with that magical power to consume your time and attention for numerous months. When you finally complete it, you feel sorry that you don’t have to do anything more.

What is so special about this Bingo ball reader? It may seem like an ordinary OCR project at first glance; a video camera captures the image and OCR software recognizes the number. easy as that. And it works without problems, like every easy gadget should.

But then again, maybe it’s not that simple. Numbers are scattered all over the ball, so they have to be located first, and the best candidate for reading should be selected. Then, numbers are painted onto a sphere rather than a flat surface, in some cases making them deformed to the point where their shape has to be recovered first. Also, the angle of reading is not fixed but somewhere on a 360° scale. and then we have the glare problem to boot, as Bingo balls are so shiny that every light source reflects as a saturated bright spot.

So, is that all of it? ভাল প্রায়. The task is expected to be carried out by an embedded microcontroller, with limited speed and memory, yet the recognition process for one ball has to be fast — 500 ms at worst. but that’s just one part of the process. The project includes the pipelined mechanism which accepts the ball, transports it to be scanned by the OCR and then shot by the public broadcast video camera before it gets dumped. and finally, if the reading was not reliable enough, the ball has to be subtly rotated so that the numbers would be repositioned for another reading attempt.

Despite these challenges I did manage to build this system. It’s fast and reliable, and I discovered some very interesting tricks along the way. Take a look at the quick demo video below to get a feel for the speed, and what the system “sees”. then join me after the break to dive into the details of this interesting embedded build.

Initially, I thought I would have to employ a neural network for the recognition process, but it turned out the recognition is actually the simplest part of the project, and that it would be much simpler and faster to do it algorithmically. The difficult part is identifying what’s what on the whole image, locating the best number, the line under it, and measuring how much it ought to be rotated. starting with nothing much more than a bitmap image, the processor has to do a lot of math even before it can be sure if the number consists of one or two digits.

Simplified schematic of OCR section
VGA during Development

To make the development, maintenance and adjustments easier, the same MCU is used for VGA signal generation in addition to image fetching and processing. It doesn’t only display the scanned image, but also includes some current parameters and RAM contents. The controller board has a VGA connector, but it ought to not be used during the normal operation of the unit. VGA monitor has nothing in common with broadcast monitors in the Bingo hall, as there are two independent cameras and lighting systems.

VGA signal generation consumes a lot of processor time, so it is switched off during image fetch and processing, which is about 500 ms during each ball reading cycle. Sync signals are transparently generated by the internal PWM peripherals and they are active all the time, so that picture restore after RGB signal establishing is fast.

In this case, 16-bit microcontroller PIC24EP512GP806 was used, with 586/52 K of program/data memory and 60 MIPS execution speed.

Fetching the Image

The inexpensive analog “cube” video camera was used in the first phase of development, but was later substituted by a digital cube camera. Both were similar in price and performance, but the latter one came with the lens which has higher focal length, so the distance could be higher and the video camera could see the larger area of the ball.

For such a small object, the best light source ought to be white LEDs, but the glare was quite bad with the shiny ball surface. I carried out some experiments with diffusers, but with no luck. The eventual service came from a quite different approach: very bright and sharp reflection, but with double exposure which uses different light sources. during the second image fetch process, the MCU selects the lower value for every pixel.

As the hotspots never match, they will be canceled and the resulting image (the third photo from the left) is evenly lit and glare-free. As an added bonus, the background light reflections were canceled in the process as well.

Please note that the system is embedded, without a screenshot function, so the images come from a VGA monitor being shot with a camera.

The light source is composed of 16 white LEDs, so that eight LEDs are active at a time. The image on the far right-hand side represents LED arrangement from the camera’s point of view. LEDs are colored red and blue here to help differentiate betweenপ্রথম এবং দ্বিতীয় এক্সপোজার জন্য গ্রুপ।

এটি প্রক্রিয়াটি উল্লেখযোগ্যভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে না থাকে। এ কারণে পুরো ইমেজিং প্রক্রিয়াটি কার্যকরীভাবে 100 এমএস নেয়।

স্ক্যান করা চিত্রটির রেজোলিউশনটি 220 × 220 পিক্সেল, 8-বিট পিক্সেল গভীরতার সাথে। এনালগ গ্রেস্কেলের চিত্রটি কেবল ছয়টি বিট রয়েছে, যা অবশিষ্ট দুটি বিটগুলির সাথে নজরদারি উপর নীল এবং লাল রঙের উপস্থাপনের জন্য ব্যবহার করা হচ্ছে, যেমন গ্রেস্কেল প্রকৃতপক্ষে গ্রিনসস্কেল। সেই অতিরিক্ত পিক্সেলগুলি নীল এবং লাল ক্ষেত্রগুলির মতো একক ধাপে মোডে দৃশ্যমান পদক্ষেপগুলির মধ্যে বিশেষ পতাকা পিক্সেল হিসাবে ব্যবহার করা হয়। এই [প্রোগ্রাম উন্নয়ন এবং ডিবাগিং সময় খুব সহায়ক হতে পরিণত হয়েছে।

পুরো প্রক্রিয়াটি 17 টি ধাপে বিভক্ত, যা উন্নয়ন এবং ডিবাগিংয়ের উদ্দেশ্যে একক-পদক্ষেপ মোডেও সঞ্চালিত হতে পারে। ধাপে নম্বরটি স্ক্রিনের উপরের বাম কোণে প্রদর্শিত হয় (নীচে দেখুন), এবং স্টপওয়াচের বর্তমান অবস্থা উপরের ডানদিকে 1 এমএস রেজোলিউশন সহ। এই ভাবে এটি কার্যকর করার সময় অনুসরণ করা এবং প্রতিটি ধাপে অপ্টিমাইজ করা সহজ ছিল।

বল অবস্থান এবং প্রসারিত

বলটি সনাক্ত করার জন্য, x, y coordinates সেন্ট্রয়েড (জ্যামিতিক কেন্দ্র) এর জন্য গণনা করা হয়, সূত্রগুলি সিএক্স = σcixai / σai এবং CY = σciyai / σai ব্যবহার করে গণনা করা হয়, যেখানে CX, y x x, y coordinates এবং a হয় প্রতিটি পিক্সেল মান। এই ধাপের আগে পটভূমিটি প্রধানত কালো, সিএক্স, সিএক্স, সিএটি কেবল বলের কেন্দ্রে হবে। তারপর পুরো ফ্রেমের বাফারটি একটি 2D ব্লক হিসাবে সরানো হয়, যাতে Centroid কোঅর্ডিনেটস এক্স = 110, Y = 110, যা ফ্রেমের কেন্দ্রস্থলে অবস্থিত। কেন্দ্রটি 2 × 2 রেড পিক্সেল (বিট 7) এর সাথে শুধুমাত্র বিকাশকারীর সুবিধার জন্য চিহ্নিত করা হয়েছে, কারণ অনেক ক্ষেত্রে প্রসেসিং ফার্মওয়্যারটি বিটকে উপেক্ষা করে 6 এবং 7।

পরবর্তী, বল ব্যাস পরিমাপ করা হয়, বিভিন্ন ব্যাসের জন্য পেরিমিটারের গড় পিক্সেল মান গণনা করে। তারপরে, পটভূমিটি (ব্যাসের বাইরে থাকা প্রতিটি পিক্সেল) কালো এলাকাগুলির আরও ভাল বিচ্ছিন্নতা নিশ্চিত করার জন্য, আরো বিশেষভাবে, সবুজ (মূল্য 0x3F) তে সেট করা হয়। পটভূমিটি প্রক্রিয়াকরণের সময় কয়েক গুণ বেশি সাদা বা কালোতে আরো বেশি সময় লাগবে, প্রতিটি সময় কালো (কালি) বা সাদা (কাগজ) এলাকায় নির্বাচন করা হবে।

একটি সমতল পৃষ্ঠের একটি গোলকটি অনাক্রম্যভাবে রূপান্তরিত করা অসম্ভব, কিন্তু চিত্রটি অ-রৈখিকভাবে বিকৃত করা হলে আকৃতিটি উন্নত করা যেতে পারে, যদি ধাপে 3 টি চিত্রের মতো। ছোট 16-বিট মাইক্রোকন্ট্রোলারদের একটি গাণিতিক coprocessor নেই, এবং স্ট্যান্ডার্ড trigonometric গ্রন্থাগার ব্যবহার করে খুব প্রসেসর সময় গ্রাস করবে। এই কারণে ট্রাইগোনোমেট্রিক সন্ধান টেবিলগুলি ব্যবহার করা হয়েছিল, এবং আপনি স্টপওয়াচ (শীর্ষ সেরা নীল সংখ্যা) দেখতে পারেন যে, এই ক্ষেত্রে, প্রসারিত পদ্ধতির জন্য কার্যকর সময় মাত্র 11 মি। আপনি দেখতে পারেন যে বলের কেন্দ্রীয় অংশটি বেশিরভাগই অপরিবর্তিত, এবং প্রান্তগুলি অ-রৈখিকভাবে প্রসারিত হয় যাতে গোলকসংক্রান্ত বিকৃতিগুলি হ্রাস পায়।

ধাপ 4 তে, একইভাবে ফটোশপে unsharp মাস্ক ফাংশন, একটি নতুন, বিবর্ণ ইমেজ তৈরি করা হয়। অন্য সম্পূর্ণ ফ্রেম বাফারের জন্য পর্যাপ্ত RAM স্পেস নেই, এটি অক্জিলিয়ারী ইমেজের উপর সঞ্চালিত হয় যা রেজোলিউশন 44 × 44। Unsharp মাস্কের ফাংশনটি খুবই গুরুত্বপূর্ণ, কারণ এটি “কালি” পিক্সেলের সাথে “কালি” পিক্সেলগুলির আরও ভাল নির্বাচন করার নিশ্চয়তা দেয়। নির্বাচন করা হচ্ছে “বিট 7 সেটিং” বোঝায়, যা VGA পর্দায় লাল এলাকায় পরিণত হবে।

এখন একই ফ্রেম বাফার দুটি ছবি রয়েছে, গ্রেস্কেল এক (বিট 0-5) এবং বাইনারি এক (বিট 7)। পরেরটি preprocessing পদক্ষেপ 6, যেখানে ছোট গর্ত এবং scratches নির্মূল করা হয়। নির্বাচিত চিত্রটি প্রথম সম্প্রসারিত এবং চুক্তিবদ্ধ, এবং তারপরে প্রক্রিয়াটি বিপরীত ক্রয়ের সাথে পুনরাবৃত্তি করা হয় – যা প্রান্তে মসৃণভাবে বৃত্তাকার এবং আবর্জনা-মুক্ত হয়।

কম্পোনেন্ট ম্যানিপুলেশন

কয়েকটি আরো অনেক preprocessing পদক্ষেপ পরে, আরো অনেক বড় অপারেশন সঞ্চালিত হয়। প্রথমটিটি “সংযুক্ত উপাদান” নামে পরিচিত, যেখানে বিচ্ছিন্ন এলাকাগুলি নির্বাচন করা হয় এবং প্রতিটিের জন্য পরামিতিগুলি অর্জিত হয়। এতে এক্স এবং Y মাত্রা, এক্স এবং Y কেন্দ্র কোঅর্ডিনেটস, নির্বাচিত পিক্সেলের সংখ্যা এবং ফ্রেমের কেন্দ্র থেকে ইউক্লিডের দূরত্ব অন্তর্ভুক্ত রয়েছে। এটি একটি ডিজিট, বড় বৃত্ত, নিম্নরেখা বা পটভূমি হিসাবে প্রতিটি উপাদান সাজানোর সাহায্য করবে। এই পর্যায়ে, নম্বরটি এক বা দুটি সংখ্যা অন্তর্ভুক্ত থাকলে এটি স্পষ্ট হয়ে যায়।

এই পদক্ষেপ প্রক্রিয়াকরণের সময় অনেক, প্রায় 200 মি। আরেকটি সমস্যা ছিল যে সংযুক্ত উপাদানগুলির জন্য স্ট্যান্ডার্ড অ্যালগরিদমটি একই আকারের একটি অক্জিলিয়ারী ফ্রেমের বাফার দরকার, তাই আমাকে একটি নতুন অ্যালগরিদম তৈরি করতে হয়েছিল যা একই ফ্রেম বাফারটি ব্যবহার করে, এবং স্বল্পমেয়াদী সমন্বয়গুলির জন্য একটি ছোট টেবিলটি ব্যবহার করে।

এই মুহুর্তে প্রসেসরের পক্ষে স্বীকৃতির জন্য সেরা প্রার্থী নির্বাচন করা সহজ – এটি বলের কেন্দ্র থেকে ক্ষুদ্রতম ইউক্লিডের দূরত্বের সাথে বৃত্ত। এই বৃত্তের অভ্যন্তরে সংযুক্ত উপাদানগুলি অ্যাকাউন্টে নেওয়া হয়, এবং অন্য সবকিছু বহিষ্কৃত হয়।

প্রশ্নে বলটি আন্ডারলাইনযুক্ত সংখ্যা সহ বিশেষ ওসিআর বলo যে ঘূর্ণন কোণ পরিমাপ করা যেতে পারে। এখন বৃত্তের কেন্দ্রটি পরিচিত হলে, প্রোগ্রামটি ভার্চুয়াল “টি” ফর্মটিকে ঘিরে রয়েছে, যা আন্ডারলাইন আকারের সাথে সামঞ্জস্যপূর্ণ, যা 360 ° বৃত্তের প্রায় 512 ধাপে, এটি কতগুলি “কালি” পিক্সেল রয়েছে। সর্বোচ্চ রেটযুক্ত গণনা ঘূর্ণন কোণকে নির্দেশ করে, তারপরে ফ্রেমের বাফার 2D ব্লকের চিত্রটির নীচের সেরা কোণে স্থানান্তরিত হয় (বামপন্থী ছবির উপর ধাপ 1২), এবং ঘূর্ণন সঞ্চালিত হয়, বিটম্যাপ বিপরীত কোণে সরানো হয় ফ্রেম বাফার এর। লগারিদমিক সন্ধান টেবিল ধন্যবাদ, অপারেশন এই গ্রুপ শুধুমাত্র 50 মি।

এটা প্রতিটি পদক্ষেপ সঙ্গে ভাল পেয়ে রাখে। সংখ্যার বিভিন্ন রঙের সাথে নির্বাচিত হয়, তবে একটি সংখ্যার নিরাপদ দূরত্বে সরানো হয় এবং তারপরে প্রতিটি সংখ্যা 30 × 46 এর পরিচিত রেজোলিউশনে স্কেল করা হয়।

স্বীকৃতি

এই পাঠকটি আমার প্রথম ওসিআর প্রকল্প ছিল, আমি নৈমিত্তিক মনে করি স্বীকৃতি প্রক্রিয়াটি সমাধান করার জন্য কঠিন অংশ হবে। প্রতিটি ধাপে সম্পূর্ণরূপে ডিবাগ করা হয় এবং একের পর এক চেক করার পরে, আমি 17 তম এবং চূড়ান্ত পদক্ষেপে পৌঁছেছিলাম। আমি ইতিমধ্যে উল্লেখ করেছি যে, আমার প্রাথমিক পরিকল্পনাটি একটি নিউরাল নেটওয়ার্কের জন্য নির্বাচন করা ছিল, কিন্তু তারপর আমি একটি সহজ অ্যালগরিদম চেষ্টা করেছিলাম এবং এটির সাথে প্রায় খেলতাম। আমি কয়েকটি বল দিয়ে এটি মূল্যায়ন করেছি এবং আপনি কল্পনা করতে পারবেন না যে আমি যখন এটি পুরোপুরি কাজ করেছিলাম তখন আমি কতটা হতাশ ছিলাম! শেষ পর্যন্ত বিটম্যাপটি সঠিকভাবে দুটি ASCII নম্বরগুলিতে রেন্ডার করা হয়েছিল।

অ্যালগরিদম বেশ সহজ। প্রতিটি সংখ্যার জন্য বিটম্যাপটি তিনটি ভাগে বিভক্ত ছিল, প্রথমটি অনুভূমিকভাবে, এবং তারপরে উল্লম্বভাবে। তারপর সক্রিয় পিক্সেল প্রতিটি কলাম বা সারিতে গণনা করা হয়, এবং ইতিহাস তৈরি করা হয়। একটি যোগ করা 7 ম হিস্টোগ্রামও রয়েছে, যা 4 এবং 7 টিতে ক্রসকুট লাইনগুলির আরও ভাল সনাক্তকরণে সহায়তা করার জন্য slanted হয়।

প্রতিটি সংখ্যার জন্য সাতটি হিস্টোগ্রাম তৈরি করতে এবং তাদের পূর্বনির্ধারিত টেবিলের সাথে তুলনা করার জন্য মাত্র 3 এমএস সময় লেগেছিল, ইঙ্গিত স্কয়ারড ত্রুটিগুলির সমষ্টি গণনা করে ফলাফলগুলি সাজান। উন্নয়ন এবং ডিবাগিং সহজতর করার জন্য, সমস্ত হিস্টোগ্রাম পর্দায় অঙ্কিত হয়।

তুলনা ফলাফলের পরে সাজানো হয়, আমরা প্রতিটি সংখ্যার জন্য বিজয়ী পেতে পারি (এই ক্ষেত্রে 8 এবং 5), কিন্তু আমাদের কাজটি আরও বেশি কিছু না হওয়া পর্যন্ত সম্পন্ন হয় না। পড়ার গুণমানটি রেট করা উচিত, যাতে নিয়ামকটি যথেষ্ট নির্ভরযোগ্য কিনা তা অনুমান করতে পারে।

বলের সংখ্যাটি যদি শুধুমাত্র একটি সংখ্যা থাকে তবে প্রতিটি সংখ্যার জন্য ত্রুটিগুলির টেবিলটি সাজানো হয় এবং “বিজয়ী” দ্বিতীয়টি (প্রায়-বিজয়ী) এর সাথে তুলনা করা হয়। যদি অনুপাতটি উচ্চ থাকে তবে তা বোঝায় যে স্বীকৃতি সফল হয়। আমাদের ক্ষেত্রে এটি 147% ছিল, যা বোঝায় যে দ্বিতীয় রেটযুক্ত প্রার্থীকে সর্বোত্তম একের চেয়ে 147% বেশি ত্রুটি রয়েছে। উদাহরণস্বরূপ, প্রথমটির 100 টি “ত্রুটি ইউনিট” ছিল এবং দ্বিতীয়টি ছিল 247. এটি একটি ভাল রেটিং, যদিও অনেক রেটিং 300% এর উত্তরে। সাধারণত, 80% এর বেশি রেটিংগুলি যথেষ্ট নিরাপদ বিবেচনা করা উচিত।

কিন্তু দুটি সংখ্যা থাকলে কি হবে? একটি চেইন শুধুমাত্র তার দুর্বলতম লিঙ্ক হিসাবে শক্তিশালী, তাই প্রোগ্রামটি আরো সফলভাবে স্বীকৃত সংখ্যার (উচ্চ অনুপাতের সাথে এক) উপেক্ষা করবে এবং সাফল্যের চূড়ান্ত সিদ্ধান্ত নেওয়ার জন্য দুর্বল এক ব্যবহার করবে।

নিয়ামক অপারেশন দুটি মৌলিক মোড আছে। দ্রুত মোডে, শুধুমাত্র একটি পড়ার আছে, যা পুনরাবৃত্তি করে (বল ঘূর্ণন পরে) শুধুমাত্র যদি প্রথম পাঠ্যটি ভালভাবে রেট দেওয়া হয় না। ধীর (“নিরাপদ”) মোডে, দুটি রিডিং রয়েছে যার ফলাফলগুলি মিলতে হবে।

এলেক্স-এম কোম্পানির পাঠককে বেলগ্রেডে মূল্যায়ন করা হয়েছিল, যা ক্যাসিনো সরঞ্জাম তৈরি করে। পরীক্ষাটি একটি অতিরিক্ত এখনও ভিডিও ক্যামেরা দিয়ে সঞ্চালিত হয়েছিল যা স্বয়ংক্রিয়ভাবে প্রতিটি বল পড়ার রেকর্ড করা হয়েছিল, তারপরে ইমেজগুলি (ফাইলের নামগুলির সাথে স্বীকৃত বল নম্বরের সাথে কিছুই ছিল না) বর্ণানুক্রমিকভাবে সাজানো হয়েছিল এবং চূড়ান্ত চেকটি ম্যানুয়ালি চালানো হয়েছিল।

পুরো পরীক্ষাটি ২40 ঘন্টার জন্য স্থায়ী হয়, যা পাঠক ছাড়াও Bingo ব্লোয়ারের স্থায়িত্ব চাপ-পরীক্ষা করতে সহায়তা করবে। 10 দিন এবং 115,000 বলের পর, পাঠককে দ্রুত মোডে স্থাপন করা হচ্ছে, কেবলমাত্র একটি ভুল পড়ার মাত্র একটি ভুল পড়ছে (বল 37) ছিল। নিরাপদ মোডে পরীক্ষার অর্থহীন হবে, কারণ একটি ত্রুটি সম্ভবত ঘটবে না।

যান্ত্রিক ধারণা

Bingo বলের জন্য শারীরিক পথ সি

Similar Posts

Leave a Reply

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