پروژه الکترونیکپروژه های پایتونپروژه های پردازش تصویرپروژه های رزبری پای

تشخیص پلاک خودرو با رزبری پای و پردازش تصویر OpenCV

سلام. پروژه تشخیص پلاک خودرو با رزبری پای و پردازش تصویر OpenCV را آماده کردیم.

آموزش پردازش تصویر پلاک ماشین با Raspberry pi و  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 (تشخیص نویسه نوری) را روی آن انجام دهیم تا عدد را تشخیص دهیم.

حتما ببینید :  پروژه دماسنج رزبری پای با سنسور DS18B20

اکنون هر کدام از این سه مرحله را به طور کامل توضیح خواهیم داد.

1. تشخیص پلاک با Open CV و Raspberry pi

اولین قدم در این آموزش تشخیص پلاک است. بیایید تصویر نمونه ای از یک ماشین بگیریم و با شناسایی پلاک آن کار را شروع کنیم. سپس از همان تصویر برای تقسیم کاراکتر ها و تشخیص کاراکتر ها استفاده خواهیم کرد. اگر می خواهید بدون توضیحات مستقیم وارد کد شوید، می توانید به پایین صفحه بروید، در انتهای صفحه کد کامل قرار داده شده است. برای درک بیشتر پیشنهاد میشود تمام آموزش را بخوانید.

آموزش پردازش تصویر پلاک ماشین با Raspberry pi و  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 به مقادیر بالاتر افزایش دهید تا اطلاعات پس زمینه بیشتری را محو کنید ، اما مراقب باشید که قسمت مفید تار نشود. تصویر خروجی در زیر نشان داده شده است ، همانطور که می بینید جزئیات پس زمینه (درخت و ساختمان) در این تصویر تار شده است. به این ترتیب می توان از تمرکز برنامه در این مناطق جلوگیری کرد.

تشخیص پلاک با Open CV و Raspberry pi

مرحله 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 حداقل و حداکثر هستند. فقط لبه هایی که دارای شیب با شدت بیش از حداقل مقدار آستانه و کمتر از حداکثر آستانه هستند نمایش داده می شوند. سپس تصویر به حالت زیر در می آید.

استفاده از Edge در OpenCV

مرحله 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 ذخیره می کنیم و سپس یک جعبه مستطیل را در اطراف آن ترسیم می کنیم تا مطمئن شویم که پلاک را به درستی تشخیص داده ایم.

حتما ببینید :  آموزش راه اندازی ماژول XBee با رزبری پای

کشیدن مستطیل دور پلاک خودرو با Open CV

مرحله 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)

پوشاندن قسمتی از تصویر با پردازش تصویر OpenCV

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 کنیم. این کار برای بهبود شناخت کاراکتر در مرحله بعدی انجام می شود. با این حال فهمیدیم که حتی با تصویر اصلی نیز خوب عمل می کند.

تقسیم بندی کاراکتر ها در Open CV

3. تشخیص حروف و اعداد با OpenCV و رزبری پای

مرحله نهایی در تشخیص پلاک با Raspberry pi شناخت این است که در اطلاعات پلاک را از تصویر جدا شده بخوانیم. ما از بسته pytesseract برای خواندن کاراکتر های تصویر استفاده خواهیم کرد.

#Read the number plate
text = pytesseract.image_to_string(Cropped, config='--psm 11')
print("Detected Number is:",text)

هنگام گردآوری نتیجه به شرح زیر میشود :

تشخیص حروف و اعداد با OpenCV و رزبری پای

همانطور که می بینید تصویر اصلی با شماره “HR 25 BR9044” بود و برنامه ما تشخیص داده است و همان مقدار را روی صفحه چاپ کرده است.

عدم موفقیت در تشخیص شماره پلاک !

ممکن است بعد از استفاده از کد این پروژه به سرعت جواب نگیرید. زیرا تشخیص شماره پلاک به عوامل زیادی مثل زاویه عکس برداری و میزان نور محیط و شکل شماره پلاک دارد. بنابراین باید پروژه را با توجه به شرایط شخصی سازی کنید. برخی از مشکلاتی از این دست با استفاده از تصاویر بهتر یا با پیکربندی موتور Tesseract قابل اصلاح است.

چند نمونه موفق در تشخیص پلاک با رزبری پای و Open CV

در بیشتر اوقات کیفیت و جهت گیری تصویر صحیح است ، این برنامه توانسته پلاک خودرو های را شناسایی کرده و شماره آن ها را بخواند.

عدم موفقیت در تشخیص شماره پلاک !

چند نمونه موفق در تشخیص پلاک با رزبری پای و Open CV

موارد موجود در فایل : سورس کامل ، تصاویر نمونه

برای دانلود فایل های پروژه ثبت نام کنید، تنها چند ثانیه زمان لازم است. از طریق فرم زیر اقدام کنید.

ایمیل خود را وارد کنید

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
برچسب ها

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا
بستن
بستن