خوش آمدید!

با تشکر از مشاهده انجمن گفتگوی ایرانی پاتوق در صورت تمایل برای استفاده از تمامی امکانات انجمن ثبت نام نمایید.

همین حالا ثبت نام کن!

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

بهروز

SpeciaL
عضو کادر مدیریت
MetalHeaD
8/28/20
123
برای مشاهده تصاویر باید ثبت نام کنید



تشخیص پلاک خودرو با Raspberry Pi و OpenCV
تشخیص پلاک خودرو با Raspberry Pi و OpenCV ( پروزه OpenCV )
امنیت همیشه یک نگرانی عمده برای بشر بوده است.
امروز ما در مدارس ، بیمارستان ها و هر مکان عمومی دیگر دوربین های نظارت تصویری داریم تا احساس امنیت کنیم.
طبق یک نظرسنجی توسط HIS تخمین زده شده است که حدود 245 میلیون دوربین امنیتی در سال 2014 نصب و کار کرده اند ، این مانند داشتن یک دوربین امنیتی برای هر 30 نفر در این کره خاکی است.
با پیشرفت در فناوری به ویژه در پردازش تصویر و یادگیری ماشین ، می توان با آموزش ساخت این دوربین ها برای پردازش اطلاعات از خوراک ویدئو ، هوشمندتر کرد.
از خوراک ویدئویی این دوربین ها می توان برای انجام شناسایی چهره ، تجزیه و تحلیل الگو ، تجزیه و تحلیل احساسات و موارد دیگر استفاده کرد که واقعاً آن را به چیزی مانند “چشم خدا” نشان داده شده در فیلم FF7 نزدیک می کند.
در واقع ، شرکت های نظارتی مانند هایک ویژن و بسیاری دیگر از قبل پیاده سازی این ویژگی ها را در محصولات خود آغاز کرده اند.
در این مقاله با نحوه شناسایی و خواندن شماره پلاک اتومبیل با استفاده از Raspberry Pi و OpenCV آشنا می شویم.
ما از برخی تصاویر تصادفی وسیله نقلیه از Google استفاده خواهیم کرد و برنامه ای برای شناسایی شماره پلاک با استفاده از OpenCV Contour Detection و سپس خواندن شماره از صفحه با استفاده از Tesseract OCR خواهیم نوشت.
جالب به نظر می رسد! ، بنابراین بیایید شروع کنیم. ( پروزه OpenCV )
پیش نیازها تشخیص پلاک خودرو با Raspberry Pi و OpenCV
همانطور که قبلا گفته شد ، ما از کتابخانه OpenCV برای شناسایی و شناسایی چهره ها استفاده خواهیم کرد.
بنابراین قبل از ادامه این آموزش حتماً OpenCV Library را روی Raspberry Pi نصب کنید.
همچنین Pi خود را با آداپتور 2A روشن کنید و برای اشکال زدایی راحت تر آن را به یک نمایشگر متصل کنید.
این آموزش نحوه دقیق کار OpenCV را توضیح نمی دهد ، اگر شما علاقه مند به یادگیری پردازش تصویر هستید ، این اصول OpenCV و آموزش های پیشرفته پردازش تصویر را بررسی کنید.
همچنین می توانید با استفاده از OpenCV در مورد آموزش خطوط ، تشخیص لکه و غیره در این بخش آموزش تقسیم تصویر اطلاعات کسب کنید.
برای شناسایی پلاک خودرو از روی تصویر ، کاری مشابه این کار انجام خواهیم داد.( پروزه OpenCV )
مراحل مربوط به تشخیص پلاک با استفاده از رزبری پای
شناسایی پلاک یا به اختصار LPR شامل سه مرحله اصلی است. مراحل به شرح زیر است
1. تشخیص پلاک خودرو: پردازش تصویر با OpenCV
اولین قدم تشخیص پلاک خودرو از خودرو است.( پروزه OpenCV )
ما از گزینه کانتور در OpenCV برای تشخیص اشیا rect مستطیل شکل برای یافتن شماره پلاک استفاده خواهیم کرد.
اگر اندازه ، رنگ و محل تقریبی شماره پلاک را بدانیم ، می توان دقت را بهبود بخشید.
به طور معمول الگوریتم تشخیص بر اساس موقعیت دوربین و نوع پلاک مورد استفاده در آن کشور خاص آموزش می یابد.
اگر تصویر حتی اتومبیل نداشته باشد ، این پیچیده تر می شود ، در این حالت ما یک مرحله اضافی برای شناسایی ماشین و سپس پلاک خواهیم داشت.
2. تقسیم کاراکترها: پردازش تصویر با OpenCV
پس از شناسایی پلاک ، باید آن را برش داده و به عنوان تصویر جدید ذخیره کنیم.
باز هم می توان با استفاده از OpenCV به راحتی این کار را انجام داد.( پروزه OpenCV )
3. شناسایی نویسه: پردازش تصویر با OpenCV
اکنون ، تصویر جدیدی که در مرحله قبل به دست آوردیم مطمئناً برخی از نویسه ها (اعداد / حروف الفبا) روی آن نوشته شده است.
بنابراین ، می توانیم OCR Optical Character Recognition را روی آن انجام دهیم تا تعداد را تشخیص دهیم.
ما قبلاً با استفاده از Raspberry Pi تشخیص نوری شخصیت (OCR) را توضیح دادیم.
1. تشخیص پلاک
اولین قدم در این پلاک خوان Raspberry Pi تشخیص پلاک پلاک است.
بیایید یک نمونه عکس از یک ماشین تهیه کنیم و با شناسایی پلاک خودرو در آن شروع کنیم.
سپس از همان تصویر برای Chagment Segmentation و Character Recognition نیز استفاده خواهیم کرد.
اگر می خواهید بدون توضیح مستقیم وارد کد شوید ، می توانید به پایین این صفحه بروید ،
جایی که کد کامل ارائه شده است. تصویر آزمایشی که من برای این آموزش استفاده می کنم در زیر نشان داده شده است.
برای مشاهده تصاویر باید ثبت نام کنید

تشخیص پلاک خودرو با Raspberry Pi و OpenCV ( پروزه OpenCV )
مرحله 1: اندازه تصویر را به اندازه مورد نیاز تغییر دهید و سپس آن را در مقیاس خاکستری انجام دهید. کد مربوط به همان در زیر آورده شده است
img = cv2.resize(img, (620,480) )
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey scale

تغییر اندازه ما به ما کمک می کند تا از بروز مشکلات با وضوح تصویر بزرگتر جلوگیری کنیم ،
مطمئن شوید که شماره پلاک پس از تغییر اندازه همچنان در قاب باقی مانده است
پوسته پوسته شدن خاکستری در تمام مراحل پردازش تصویر معمول است.
این سرعت باعث افزایش سرعت پردازش دیگر می شود که دیگر لازم نیست هنگام پردازش تصویر با جزئیات رنگ سر و کار داشته باشیم.
با انجام این مرحله ، تصویر چیزی شبیه به این تغییر شکل می دهد
برای مشاهده تصاویر باید ثبت نام کنید

مرحله 2: هر تصویر اطلاعات مفید و بی فایده ای خواهد داشت ،
در این مورد فقط برای ما پلاک اطلاعات مفید است و بقیه برای برنامه ما بسیار بی فایده است.
این اطلاعات بی فایده را سر و صدا می نامند. پردازش تصویر با OpenCV
به طور معمول با استفاده از یک فیلتر دو طرفه (Bluring) جزئیات ناخواسته یک تصویر حذف می شود.
gray = cv2.bilateralFilter(gray, 11, 17, 17)
نحو Destin_image = cv2.bilateralFilter است (منبع_تصویر ، قطر پیکسل ، sigmaColor ، sigmaSpace). پردازش تصویر با OpenCV
می توانید رنگ سیگما و فضای سیگما را از 17 به مقادیر بالاتر برسانید تا اطلاعات پس زمینه بیشتر محو شود ، اما مراقب باشید که قسمت مفید تار نشود.
تصویر خروجی در زیر نشان داده شده است ، همانطور که مشاهده می کنید جزئیات پس زمینه (درخت و ساختمان) در این تصویر تار هستند.
به این ترتیب می توانیم بعداً از تمرکز برنامه بر روی این مناطق جلوگیری کنیم.
برای مشاهده تصاویر باید ثبت نام کنید

مرحله 3: مرحله بعدی جایی جالب است که ما تشخیص لبه را انجام می دهیم.
روش های مختلفی برای انجام این کار وجود دارد ، آسان ترین و محبوب ترین راه استفاده از روش کنج لبه از OpenCV است.
خط انجام همان کار در زیر نشان داده شده است
پردازش تصویر با OpenCV
edged = cv2.Canny(gray, 30, 200) #Perform Edge detection
نحو Destin_image = cv2.Canny خواهد بود (منبع_ تصویر ، آستانه ارزش 1 ، آستانه ارزش 2). مقادیر آستانه 1 و مقدار آستانه 2 حداقل و حداکثر مقادیر آستانه هستند.
فقط لبه هایی نشان داده می شوند که دارای شیب شدت بیش از حداقل مقدار آستانه و کمتر از حداکثر مقدار آستانه باشند.
تصویر حاصل در زیر نشان داده شده است
برای مشاهده تصاویر باید ثبت نام کنید

مرحله 4: اکنون می توانیم به دنبال خطوطی بر روی تصویر خود باشیم ،
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
هنگامی که شمارنده ها شناسایی شدند ، آنها را از بزرگ به کوچک مرتب می کنیم و فقط 10 نتیجه اول را با بی توجهی به سایر نتایج در نظر می گیریم.
در تصویر ما پیشخوان می تواند هر چیزی باشد که سطح بسته ای داشته باشد اما از همه نتایج بدست آمده شماره پلاک نیز در آنجا خواهد بود زیرا یک سطح بسته نیز است.
برای فیلتر کردن تصویر پلاک در میان نتایج بدست آمده ، همه نتایج را حلقه کرده و بررسی می کنیم که دارای یک کانتور مستطیل شکل با چهار ضلع و شکل بسته است.
از آنجایی که پلاک خودرو قطعاً چهار ضلعی مستطیل است.

# 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

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

پردازش تصویر با OpenCV
تصویر جدید چیزی شبیه به زیر نشان داده می شود
برای مشاهده تصاویر باید ثبت نام کنید

2. تقسیم حروف
مرحله بعدی در تشخیص شماره پلاک Raspberry Pi این است که پلاک خودرو را با برش دادن از تصویر و ذخیره آن به عنوان یک تصویر جدید از تصویر خارج کنید.
سپس می توانیم از این تصویر برای شناسایی شخصیت موجود در آن استفاده کنیم.
کد برش تصویر roi (منطقه مورد نظر) از تصویر اصلی در زیر نشان داده شده است
# 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]

تصویر حاصل در زیر نشان داده شده است.
به طور معمول به برش تصویر اضافه می شود ، همچنین می توانیم آن را خاکستری کنیم و در صورت لزوم آن را لبه کنیم.
این کار برای بهبود تشخیص شخصیت در مرحله بعدی انجام می شود.
با این حال متوجه شدم که حتی با تصویر اصلی نیز خوب عمل می کند.
برای مشاهده تصاویر باید ثبت نام کنید

3. شناخت شخصیت
پردازش تصویر با رزبری پای
مرحله نهایی در این تشخیص پلاک رزبری پای این است که در واقع اطلاعات صفحه شماره را از تصویر تقسیم شده بخوانید.
ما از بسته pytesseract برای خواندن شخصیت ها از تصویر استفاده خواهیم کرد ، دقیقاً مانند آنچه در آموزش قبلی انجام داده ایم. کد مربوط به همان در زیر آورده شده است
#Read the number plate
text = pytesseract.image_to_string(Cropped, config=’–psm 11′)
print(“Detected Number is:”,text)
ما قبلا توضیح دادیم که چگونه یک موتور Tesseract را پیکربندی کنیم ، بنابراین در صورت نیاز در اینجا دوباره می توانیم Tesseract OCR را پیکربندی کنیم تا در صورت لزوم نتایج بهتری بدست آوریم.
سپس کاراکتر شناسایی شده روی کنسول چاپ می شود.
هنگام کامپایل نتیجه به صورت زیر نشان داده می شود
برای مشاهده تصاویر باید ثبت نام کنید


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

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

همانطور که مشاهده می کنید ،
برنامه ما توانست پلاک را به درستی تشخیص داده و برش دهد.
اما کتابخانه Tesseract نتوانسته است شخصیت ها را به درستی تشخیص دهد.
به جای “TS 08 UE 3396” واقعی ، OCR آن را “1508 ye 3396” تشخیص داده است.
با استفاده از تصاویر جهت یاب بهتر یا با پیکربندی موتور Tesseract می توان مشکلات این چنینی را اصلاح کرد.
یکی دیگر از بدترین سناریوها این است که کانتور نتواند پلاک را به درستی تشخیص دهد.
تصویر زیر دارای اطلاعات پس زمینه و نور کم بسیار زیادی است که برنامه حتی موفق به شناسایی پلاک خودرو از روی شماره نشده است.
در این حالت ما باید دوباره یادگیری ماشین را رد کنیم یا کیفیت تصویر را بهبود ببخشیم.
برای مشاهده تصاویر باید ثبت نام کنید

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

برای مشاهده تصاویر باید ثبت نام کنید

امیدوارم که شما با استفاده از Raspberry Pi تشخیص خودکار شماره صفحه را درک کرده باشید و از ساختن چیزهای جالب به تنهایی لذت برده باشید.
فکر می کنید با OpenCV و Tesseract چه کار دیگری می توان انجام داد؟ ، نظرات خود را در بخش نظرات به من اطلاع دهید.

کد کامل برنامه
پردازش تصویر با رزبری پای ( پروزه OpenCV )
ما قبلا توضیح دادیم که چگونه یک موتور Tesseract را پیکربندی کنیم ، بنابراین در صورت نیاز در اینجا دوباره می توانیم Tesseract OCR را پیکربندی کنیم تا در صورت لزوم نتایج بهتری بدست آوریم.
سپس کاراکتر شناسایی شده روی کنسول چاپ می شود.
هنگام کامپایل نتیجه به صورت زیر نشان داده می شود
برای مشاهده تصاویر باید ثبت نام کنید


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

موارد ناموفق در تشخیص شماره پلاک
فایل کامل پروژه این صفحه شناسایی رسپبری پای را می توان از اینجا بارگیری کرد ، این برنامه حاوی برنامه و تصاویر آزمایشی است که ما برای بررسی برنامه خود استفاده کردیم.
بدون گفتن ، لازم به یادآوری است که نتایج حاصل از این روش دقیق نخواهد بود.
دقت به شفافیت تصویر ، جهت گیری ، نوردهی و غیره بستگی دارد.
برای به دست آوردن نتایج بهتر می توانید الگوریتم های یادگیری ماشین را به همراه این موارد پیاده سازی کنید.
برای دریافت ایده ، به مثال دیگری نگاه می کنیم که در آن ماشین مستقیماً رو به دوربین نیست.پ
پردازش تصویر با رزبری پای ( پروزه OpenCV )
برای مشاهده تصاویر باید ثبت نام کنید

همانطور که مشاهده می کنید ، پردازش تصویر با رزبری پای
برنامه ما توانست پلاک را به درستی تشخیص داده و برش دهد.
اما کتابخانه Tesseract نتوانسته است شخصیت ها را به درستی تشخیص دهد.
به جای “TS 08 UE 3396” واقعی ، OCR آن را “1508 ye 3396” تشخیص داده است.
با استفاده از تصاویر جهت یاب بهتر یا با پیکربندی موتور Tesseract می توان مشکلات این چنینی را اصلاح کرد.
یکی دیگر از بدترین سناریوها این است که کانتور نتواند پلاک را به درستی تشخیص دهد.
تصویر زیر دارای اطلاعات پس زمینه و نور کم بسیار زیادی است که برنامه حتی موفق به شناسایی پلاک خودرو از روی شماره نشده است.
در این حالت ما باید دوباره یادگیری ماشین را رد کنیم یا کیفیت تصویر را بهبود ببخشیم.
برای مشاهده تصاویر باید ثبت نام کنید

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

برای مشاهده تصاویر باید ثبت نام کنید

امیدوارم که شما با استفاده از Raspberry Pi تشخیص خودکار شماره صفحه را درک کرده باشید و از ساختن چیزهای جالب به تنهایی لذت برده باشید.
فکر می کنید با OpenCV و Tesseract چه کار دیگری می توان انجام داد؟ ، نظرات خود را در بخش نظرات به من اطلاع دهید.

کد کامل برنامه پردازش تصویر با رزبری پای ( پروزه OpenCV )

دوستان عزیز شما می توانید رزبری پای و تمام لوازم نیاز برای این پروژه را از وی تات تهیه فرمایید


این پروژه توسط گروه وی تات انجام شده
کپی با دکر منبع بلامانع است
 
بالا پایین