تشخیص پلاک خودرو با رزبری پای و پردازش تصویر OpenCV
سلام. پروژه تشخیص پلاک خودرو با رزبری پای و پردازش تصویر OpenCV را آماده کردیم.
محتویات
- آموزش پردازش تصویر پلاک ماشین با رزبری پای و Open CV
- پیش نیاز ها
- مراحل تشخیص پلاک با استفاده از رزبری پای
- 1. تشخیص پلاک با Open CV و رزبری پای
- 2. تقسیم بندی کاراکتر ها در Open CV
- 3. تشخیص حروف و اعداد با OpenCV و رزبری پای
- عدم موفقیت در تشخیص شماره پلاک !
- چند نمونه موفق در تشخیص پلاک با رزبری پای و Open CV
آموزش پردازش تصویر پلاک ماشین با رزبری پای و Open CV
امنیت همیشه یک نگرانی اساسی برای بشر بوده است. امروزه در مدارس ، بیمارستان ها و هر مکان عمومی دیگری دوربین های نظارتی داریم تا امنیت را بیشتر کنند. طبق بررسی های انجام شده توسط HIS ، تخمین زده می شود که در سال 2014 حدود 245 میلیون دوربین امنیتی نصب شده و کار کرده اند ، که مانند داشتن یک دوربین امنیتی برای هر 30 نفر در این سیاره است. با پیشرفت تکنولوژی به ویژه در پردازش تصویر و یادگیری ماشین ها ، می توان با آموزش پردازش اطلاعات از ویدیو به آنها ، این دوربین ها را باهوش تر کرد.
از فید ویدیوی این دوربین ها می توان برای انجام تشخیص چهره ، تحلیل الگو ، تحلیل احساسات و موارد دیگر استفاده کرد. در حقیقت ، شرکت های نظارتی مانند Hikvision و بسیاری دیگر از قبل اجرای این ویژگی ها را در محصولات خود آغاز کرده اند. ما قبلاً از پردازش تصویر MATLAB برای خواندن شماره پلاک (تشخیص شماره پلاک خودرو با متلب و پردازش تصویر) استفاده کردیم، امروز در این مقاله نحوه تشخیص و خواندن شماره پلاک از خودرو با استفاده از Raspberry Pi و OpenCV را یاد خواهیم گرفت. ما از برخی تصاویر وسایل نقلیه تصادفی از Google استفاده خواهیم کرد و برنامه ای را برای نوشتن صفحه شماره با استفاده از OpenCV Contour Detection Detection می نویسیم و سپس با استفاده از Tesseract OCR شماره را از صفحه می خوانیم. بنابراین شروع کنیم.
پیش نیاز ها
همانطور که قبلاً گفته شد ، ما از کتابخانه OpenCV برای شناسایی و شناسایی چهره ها استفاده خواهیم کرد. بنابراین حتما قبل از ادامه این آموزش ، OpenCV Library را روی Raspberry Pi نصب کنید آموزش نصب OpenCV روی رزبری پای با CMake (در 2 روش) . همچنین Pi خود را با آداپتور 2A نیرو دهید و برای اشکال زدایی آسان تر آن را به مانیتور صفحه نمایش وصل کنید.
مراحل تشخیص پلاک با استفاده از رزبری پای
تشخیص صفحه پلاک یا LPR در مدت کوتاه، شامل سه مرحله اصلی است. مراحل به شرح زیر است.
1. تشخیص پلاک : اولین قدم تشخیص پلاک خودرو از خودرو است. ما از گزینه کانتور در OpenCV برای شناسایی اجسام مستطیل برای پیدا کردن پلاک استفاده خواهیم کرد. اگر اندازه ، رنگ و محل تقریبی پلاک را بدانیم ، می توانیم دقت را بهبود ببخشیم. به طور معمول الگوریتم تشخیص بر اساس موقعیت دوربین و نوع پلاک شماره مورد استفاده در آن کشور خاص تنظیم می شود.
2. تقسیم کاراکتر : پس از شناسایی پلاک، باید آنرا برش داده و آن را به عنوان تصویری جدید ذخیره کنیم. باز هم این کار را می توان به راحتی با استفاده از OpenCV انجام داد.
3. تشخیص کاراکتر : اکنون ، تصویر جدیدی که در مرحله قبل به دست آوردیم ، حتماً دارای چند کاراکتر (اعداد / الفبا) روی آن است. بنابراین ، می توانیم OCR (تشخیص نویسه نوری) را روی آن انجام دهیم تا عدد را تشخیص دهیم.
اکنون هر کدام از این سه مرحله را به طور کامل توضیح خواهیم داد.
پیشنهاد میکنم آموزش تشخیص پلاک ایرانی با متلب را نیز مشاهده کنید.
1. تشخیص پلاک با Open CV و رزبری پای
اولین قدم در این آموزش تشخیص پلاک است. بیایید تصویر نمونه ای از یک ماشین بگیریم و با شناسایی پلاک آن کار را شروع کنیم. سپس از همان تصویر برای تقسیم کاراکتر ها و تشخیص کاراکتر ها استفاده خواهیم کرد. اگر می خواهید بدون توضیحات مستقیم وارد کد شوید، می توانید به پایین صفحه بروید، در انتهای صفحه کد کامل قرار داده شده است. برای درک بیشتر پیشنهاد میشود تمام آموزش را بخوانید.
مرحله 1: تصویر را در اندازه مورد نظر تغییر اندازه دهید و سپس آنرا grayscale کنید.
img = cv2.resize(img, (620,480) ) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey scale
تغییر اندازه از بروز مشکلات در تصاویر با وضوح بیشتر جلوگیری میکند. اطمینان حاصل کنید که پلاک بعد از تغییر اندازه هنوز هم در کادر قرار میگیرد. grayscale کردن یا همان تبدیل به مقیاس خاکستری در پروژه های پردازش تصویر بسیار متداول است. این کار باعث میشود که بتوانیم از بهم ریختگی رنگ ها جلوگیری کرده و تشخیص را راحت تر کنیم. پس از این مرحله تصویر ما مانند زیر میشود :
مرحله 2: هر تصویر اطلاعات مفید و بی فایده خواهد داشت، در این جا اطلاعات مفید فقط پلاک است و بقیه تصویر بیهوده است. این اطلاعات بی فایده نویز نامیده می شوند. به طور معمول با استفاده از فیلتر دو طرفه (Bluring) جزئیات ناخواسته از یک تصویر حذف می شود.
gray = cv2.bilateralFilter(gray, 11, 17, 17)
سینتکس destination_image = cv2.bilateralFilter(source_image, diameter of pixel, sigmaColor, sigmaSpace)
است. می توانید فضای سیگما را از 17 به مقادیر بالاتر افزایش دهید تا اطلاعات پس زمینه بیشتری را محو کنید ، اما مراقب باشید که قسمت مفید تار نشود. تصویر خروجی در زیر نشان داده شده است ، همانطور که می بینید جزئیات پس زمینه (درخت و ساختمان) در این تصویر تار شده است. به این ترتیب می توان از تمرکز برنامه در این مناطق جلوگیری کرد.
مرحله 3: مرحله بعدی جالب است که در آن تشخیص لبه (Edge) انجام می شود. روش های زیادی برای انجام آن وجود دارد ، آسان ترین و محبوب ترین روش استفاده از روش canny edge
در OpenCV است.
edged = cv2.Canny(gray, 30, 200) #Perform Edge detection
سینتکس destination_image = cv2.Canny(source_image, thresholdValue 1, thresholdValue 2)
خواهد بود. Threshold Vale 1 و Threshold Vale 2 حداقل و حداکثر هستند. فقط لبه هایی که دارای شیب با شدت بیش از حداقل مقدار آستانه و کمتر از حداکثر آستانه هستند نمایش داده می شوند. سپس تصویر به حالت زیر در می آید.
مرحله 4: اکنون می توانیم به دنبال کانتورهای (counters) روی تصویر خود باشیم.
nts = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10] screenCnt = None
هنگامی که counters ها شناسایی شدند ، آنها را از بزرگ به کوچک طبقه بندی می کنیم و 10 نتیجه اول را نادیده می گیریم. در تصویر ما پیشخوان می تواند هر چیزی باشد که دارای سطح بسته باشد اما از بین تمام نتایج به دست آمده ، شماره پلاک نیز وجود دارد زیرا یک سطح بسته هست.
برای فیلتر کردن تصویر پلاک بین نتایج به دست آمده ، تمام نتایج را loop می کنیم و بررسی می کنیم که دارای یک کانتور مستطیل شکل با چهار طرف و شکل بسته هستند یا خیر. زیرا یک پلاک قطعاً یک مستطیل شکل چهار گوش خواهد بود.
# loop over our contours for c in cnts: # approximate the contour peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.018 * peri, True) # if our approximated contour has four points, then # we can assume that we have found our screen if len(approx) == 4: screenCnt = approx break
مقدار 0.018 یک مقدار آزمایشی است. می توانیدآن را تغییر دهید تا بررسی کنید که بهترین نتیجه برای شما چگونه بدست می آید. پس از یافتن counters مناسب ، آن را در متغیری به نام screenCnt
ذخیره می کنیم و سپس یک جعبه مستطیل را در اطراف آن ترسیم می کنیم تا مطمئن شویم که پلاک را به درستی تشخیص داده ایم.
مرحله 5: اکنون که می دانیم پلاک در کجای تصویر قرار دارد ، اطلاعات باقیمانده برای ما بی فایده است. بنابراین می توانیم به جز محلی که پلاک در آن است ، بقیه تصویر را حذف کنیم. کد انجام این کار در زیر نشان داده شده است
# Masking the part other than the number plate mask = np.zeros(gray.shape,np.uint8) new_image = cv2.drawContours(mask,[screenCnt],0,255,-1,) new_image = cv2.bitwise_and(img,img,mask=mask)
2. تقسیم بندی کاراکتر ها در Open CV
قدم بعدی درپروژه تشخیص پلاک با رزبری پای تقسیم پلاک از تصویر با برداشتن آن و ذخیره آن به عنوان تصویر جدید است. سپس می توانیم از این تصویر برای شناسایی کاراکتر های موجود در آن استفاده کنیم. کد برای برداشت عکس منطقه مورد نظر از تصویر اصلی در زیر نشان داده شده است
# Now crop (x, y) = np.where(mask == 255) (topx, topy) = (np.min(x), np.min(y)) (bottomx, bottomy) = (np.max(x), np.max(y)) Cropped = gray[topx:bottomx+1, topy:bottomy+1]
تصویر حاصل در زیر نشان داده شده است. همچنین می توانیم آنرا خاکستری کرده و در صورت لزوم Edge کنیم. این کار برای بهبود شناخت کاراکتر در مرحله بعدی انجام می شود. با این حال فهمیدیم که حتی با تصویر اصلی نیز خوب عمل می کند.
3. تشخیص حروف و اعداد با OpenCV و رزبری پای
مرحله نهایی در تشخیص پلاک با Raspberry pi شناخت این است که در اطلاعات پلاک را از تصویر جدا شده بخوانیم. ما از بسته pytesseract برای خواندن کاراکتر های تصویر استفاده خواهیم کرد.
#Read the number plate text = pytesseract.image_to_string(Cropped, config='--psm 11') print("Detected Number is:",text)
هنگام گردآوری نتیجه به شرح زیر میشود :
همانطور که می بینید تصویر اصلی با شماره “HR 25 BR9044” بود و برنامه ما تشخیص داده است و همان مقدار را روی صفحه چاپ کرده است.
عدم موفقیت در تشخیص شماره پلاک !
ممکن است بعد از استفاده از کد این پروژه به سرعت جواب نگیرید. زیرا تشخیص شماره پلاک به عوامل زیادی مثل زاویه عکس برداری و میزان نور محیط و شکل شماره پلاک دارد. بنابراین باید پروژه را با توجه به شرایط شخصی سازی کنید. برخی از مشکلاتی از این دست با استفاده از تصاویر بهتر یا با پیکربندی موتور Tesseract قابل اصلاح است.
چند نمونه موفق در تشخیص پلاک با رزبری پای و Open CV
در بیشتر اوقات کیفیت و جهت گیری تصویر صحیح است ، این برنامه توانسته پلاک خودرو های را شناسایی کرده و شماره آن ها را بخواند.
موارد موجود در فایل : سورس کامل ، تصاویر نمونه
و اینکه با stm32 می شه پردازش تصویر انجام داد؟ STM32 یا میکروکنترلر ARM دیگری.