PDA

View Full Version : تشخیص محل قرار گیری پلاک (تشخیص پلاک خودرو)



بهروز عباسی
پنج شنبه 29 فروردین 1392, 09:31 صبح
درود
من برای یه پروژه کوچیک باید برنامه تشخیص پلاک بنویسم (قبلاً یه کارهایی کردم و لی الان جدی تر شده:متعجب:)
دنبال یه راه سریع و البته قابل اطمینان هستم ، شما چه Algorithmای رو پیشنهاد میکنید؟؟

من برنامه رو با Delphi نوشتم ؛ با استفاده از Binarization کردن تصویر خودرو و کار کردن روی برخی از نواحی اون که میتونن کاندید باشن محل دقیق پلاک رو بدست میارم ،ولی در تصاویر مختلف باید Binarization رو به اندازه های مختلف روی تصویر اعمال کنم. به همین خاطر تاحالا که روش مطمئنی نبوده .:لبخند:

اینم تصویر برنامه در حال اجرا ؛که محل پلاکو تشخیص داده :

103002

مصطفی ساتکی
پنج شنبه 29 فروردین 1392, 11:29 صبح
با چه روشی باینری کردید در ضمن حتماً هم نیاز نیست باینری کنید .
2 راه حل خوب برای این کار دارید یک اینکه مشتق در جهت y بگیرید تا نسبت به خطوط عمودی واکنش بهتری داشته باشید بعد آنها را در تصویر پیدا کنید.
راه حل دیگر استفاده از adaptive threshold به روش گوسی هستش.

موفق باشید.

بهروز عباسی
پنج شنبه 29 فروردین 1392, 13:53 عصر
با چه روشی باینری کردید در ضمن حتماً هم نیاز نیست باینری کنید .
راستش من به مباحث تئوری آشنایی چندانی ندارم (منظورم روشهایی مختلف انجام اینجو کاراست) ،امّا برای این کار تابع زیرو نوشتم (یادم نیست Algorithm اش رو ازکجا گیرآوردم)

function Binarization(const AInputImage: TBitmap;
const AValue: integer): TBitmap;

type
TRGB32 = packed record
B, G, R: Byte;
end;

TRGB32Array = packed array [0 .. MaxInt div SizeOf(TRGB32) - 1] of TRGB32;
PRGB32Array = ^TRGB32Array;

var
iRow, iColumn: integer;
_Result: TBitmap;

RGBBitmap: PRGB32Array;
begin

_Result := TBitmap.Create;

try
_Result.PixelFormat := pf32Bit;
_Result.Assign(AInputImage);

for iColumn := 0 to _Result.Height - 1 do
begin
RGBBitmap := _Result.Scanline[iColumn];
for iRow := 0 to _Result.Width - 1 do
begin
if (RGBBitmap[iRow].B > AValue) then
RGBBitmap[iRow].B := 255
else
RGBBitmap[iRow].B := 0;

RGBBitmap[iRow].R := RGBBitmap[iRow].B;
RGBBitmap[iRow].G := RGBBitmap[iRow].B;

end;
end;
Result := (_Result);
finally
// _Result.Free;
end;
end;


2 راه حل خوب برای این کار دارید یک اینکه مشتق در جهت y بگیرید تا نسبت به خطوط عمودی واکنش بهتری داشته باشید بعد آنها را در تصویر پیدا کنید.
من قبلاً این کارو میکردم با استفاده از Vertical Sobel سعی میکردم لبه های عمودی رو بدست بیارم ؛چون ناحیه مربوط به پلاک بیشترین لبه ها رو داره اینطوری اونو پیدا کنم (Histogram) ،امّا مثلاً اگه اون ماشین یک "نیسان"آبی:لبخند: باشه که نرده هم داشته باشه :چشمک: اون قسمت نرده ها هم لبه های زیادی داره ---> خلاصه توی این جور مواقع نتونستم کاری کنم ،پیشنهادی دارید؟؟؟


راه حل دیگر استفاده از adaptive threshold به روش گوسی هستش.
باید در موردش تحقیق کنم ممنون از کمکت.

مصطفی ساتکی
پنج شنبه 29 فروردین 1392, 14:38 عصر
در کد بالا جای متغیر های iColumn , iRow رو عوض کنید (برای پیمایش height از iRowو برای پیمایش width از iColumn استفاده کنید).
بعد bitmap که تصویر خروجی در آن قرار می گیره pixelformat شو 8bit قرار بدید و در خروجی تابع قرار ندید به صورت پارامتر و var به تابع بفرستید هر 2 مورد تو کارایی برنامه تاثیر میذاره.
در ضمن این نوع آستانه گیری برای محیط های out door کاربرد نداره.
شما اول نواحی کاندید پلاک رو پیدا می کنید مثلاً نرده های پشت نیسان هم ممکن جز این نواحی باشند بعد با شرط هایی که ویژگی های دیگر پلاک رو مشخص می کنه به هدفمون می رسیم.
به صورت کاربردی و با دقت بالا بخاید و اون چیزی که من تو پلاک خوان خودم انجام دادم 300 ناحیه پلاک و 900 ناحیه غیر پلاک رو sobel گرفته با یک کلاسیفیر 2 بخشی آموزش دادم سپس با بررسی ratio و چند تا ویژگی دیگر ، از پلاک تصویر sobel گرفته و پلاک رو با کلاسیفیر در نهایت چک می کنم که که تا حالا پیش نیومده اشتباه کنه.

بهروز عباسی
پنج شنبه 29 فروردین 1392, 15:24 عصر
به صورت کاربردی و با دقت بالا بخاید و اون چیزی که من تو پلاک خوان خودم انجام دادم 300 ناحیه پلاک و 900 ناحیه غیر پلاک رو sobel گرفته با یک کلاسیفیر 2 بخشی آموزش دادم سپس با بررسی ratio و چند تا ویژگی دیگر ، از پلاک تصویر sobel گرفته و پلاک رو با کلاسیفیر در نهایت چک می کنم که که تا حالا پیش نیومده اشتباه کنه.

برای آموزش بهتره از چه نوع ANN ای استفاده کنم؟

مصطفی ساتکی
پنج شنبه 29 فروردین 1392, 15:43 عصر
svm خودش 2 بخشی هستش و دقت بالایی هم داره.

22mamliii
شنبه 07 اردیبهشت 1392, 00:38 صبح
سلام دوستان..... من دارم رو پروژه تشخص پلاک کار می کنم.برنامشو تو متلب نوشتم. منتهی تو قسمت برطرف کردن چرخش پلاک به مشکل برخوردم..........یعنی اینکه خروجی این قسمت برای بعضی از تصاویر خوبه، ولی تو بعضی از تصاویر تصویر پلاک دیگه ای رو تو خروجیش صاف میکنه و نشونش میده...نمیدونم مشکلش از کجاست:ناراحت:......ممنون میشم اگه کسی کمکم کنه.

مصطفی ساتکی
شنبه 07 اردیبهشت 1392, 08:56 صبح
به سایت برنامه نویس خوش آمدید.
قوانین به این صورت هستش که هر سوال مستقل در یک تاپیک جداگانه مطرح میشه چون قرار در آینده توسط افراد دیگری هم مورد استفاده قرار بگیره.
پس لطفاً سوال خودتون را در یک تاپیک مطرح کنید الگوریتمی که برای localize استفاده کردید و تصاویر مربوط به آن را ذکر کنید تا مشکل شما بررسی شه.

موفق باشید.

mzolfaghari
جمعه 03 خرداد 1392, 04:43 صبح
سلام
با متلب میشه با تکنیک های پردازش تصویر تصویر را که جدا کرد و شماره پلاک را نیز بصورت متن بالای تصویر نوشت.
با جستجوی مقالات الگوریتم های متنوع و کارامدی وجود دارد. در صورت نیاز درخدمتم.
موفق باشید
عکس ضمیمه حاصل پایان نامه ای که برای یکی از دوستان انجام دادم. متن و کد موجوده
البته یک کار دیگه ام انجام دادم که فقط ناحیه را جدا می کند و تصویر پلاک نمایش داده می شود.

مصطفی ساتکی
جمعه 03 خرداد 1392, 10:39 صبح
استخراج پلاک در چنین شرایط ایده ال اهمیت چندانی نداره . الگوریتم localization بایستی در شرایط جوی مختلف و همچنین شرایط پرسپکتیو جواب بده آن هم به صورت real در تصاویری با ابعاد 2500*1500 همچنین 24 فریم در ثانیه.

yakhteh
دوشنبه 07 مرداد 1392, 11:57 صبح
درود
میشه بگین چه روشی برای جداسازی پلاک از تصویر استفاده کردین؟
سپاس

مصطفی ساتکی
دوشنبه 07 مرداد 1392, 12:04 عصر
مشتق در جهت y می گیریم چون حروف لبه های تندی دارند مجموعه از خطوط عمودی باقی می مونه بعدش این تصویر را با روش های adpaptive آستانه گیری می کنیم حالا مجموعه blob هایی که در کنار هم و فرکانس مشخص در راستای x دارند را دسته بندی می کنیم اینها میشه نواحی کاندید پلاک سپس aspect ratio نواحی را با شرطی بررسی می کنیم و در نهایت تصویر ناحیه کاندید را با svm بررسی می کنیم که ببینم پلاک هستش یا نه.