معرفی شرکت دانش بنیان شهاب

ساتپا - سامانه تشخیص پلاک ایرانی

کتابخانه تشخیص پلاک ساتپا، جهت کنترل تردد خودرو ها و تامین امنیت طراحی گردیده که می تواند با استفاده از تکنیک های پیشرفته پردازش تصویر، عملیات پلاک خوانی خودرو در حال حرکت را با دقت بسیار بالا و کمترین خطا ممکن و به صورت آنی ( Real Time ) انجام دهد. ساتپا می تواند به انواع دوربین های امنیتی و نظارتی متصل گردیده و در صورت تشخیص ورود خودرو ها به محدوده نظارت دوربین ، شماره پلاک خودرو را به همراه تصویر پلاک و خودرو و همچنین زمان دقیق تشخیص تردد به شما گزارش دهد.

ساتپا مخفف «سامانه تشخیص پلاک ایرانی» است و به زبان C++ نوشته شده و در سایر زبان ها به صورت DLL قابل استفاده است. منشاء این کتابخانه به سال 1385 برمی گردد که پلاک های هر شهرستان، فرمت خاص خودش را داشت و به سفارش یک شرکت، اولین نسخه کتابخانه در آن زمان تولید شد. بعدها در سال 1391 به سفارش یک شرکت دیگر، نسخه جدید کتابخانه به منظور پشتیبانی از پلاک های 8 رقمی جدید، تولید و عرضه شد و از آن زمان مرتبا به روز رسانی می شود. از سال 1395 پشتیبانی و توسعه کتابخانه به شرکت دانش بنیان شهاب، واگذار شده است. در این راهنما، ابتدا امکانات کتابخانه در قالب برنامه میزبان سی شارپ توضیح داده شده و سپس توابع کتابخانه و پارارمترهای آن ها توضیح داده می شوند.

ساتپا نسخه 10

فایل راهنمایی که هم اکنون پیش روی شماست مخصوص نسخه 10 کتابخانه ساتپاست و قابل تعمیم به نسخه های قبل نمی باشد. در نسخه 10 ساتپا، الگوریتم پلاک¬خوانی مورد بازبینی کلی قرار گرفته است و افزایش دقت نسبت به نسخه های 8 و 9 را در پی داشته است.

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

نکته

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

راه اندازی

پیش نیازها (نسخه 10)

از نسخه 10 ساتپا، با استفاده از ویژوال استودیو 2019 کامپایل شده است و برای اجرا، حتما باید فایل های مربوط به این نسخه از ویژوال سی در کامپیوتر مقصد کپی شود. برای این کار باید بسته نرم افزاری vc_redist_2019_x64 را دانلود و نصب کنید ( اگر از نسخه 32 بیتی کتابخانه استفاده می کنید، vc_redist_2019_x86 را دانلود کنید ).

هشدار

به دلیل محدودیت های سیستم عامل در تخصیص حافظه به پردازش های 32 بیتی، اگر تعداد دوربین ها و یا تنظیمات شما بگونه ای است که باعث مصرف حافظه رم بیش از 700 مگ بایت می شود (معمولا با اجرای بیشتر از 4 دوربین این اتفاق خواهد افتاد، برای تعداد کمتر وابسته به تنظیمات تعیین شده شما برای ساتپاست) حتما از نسخه 64 بیتی استفاده کنید. در این صورت برنامه شما نیز باید 64 بیتی کامپایل شود و قابلیت اجرا بر روی سیستم های 32 بیتی را نخواهد داشت.

کتابخانه ساتپا از کتابخانه های دیگری مثل OpenCV، libVLC و OpenGL هم استفاده می کند که باید کنار ANPR.dll کپی شوند. این فایل ها همراه کتابخانه یا در بسته ای به نام Prerequisits.rar قرار دارند که باید extract شود. در نهایت باید پوشه حاوی ANPR.dll شبیه تصویر زیر باشد:

پیش نیازها (نسخه 9)

از نسخه ۷ به بعد، کتابخانه با استفاده از ویژوال استودیو ۲۰۱۵ کامپایل شده است و برای اجرا، حتما باید فایل های مربوط به این نسخه از ویژوال سی در کامپیوتر مقصد کپی شود. برای این کار باید بسته نرم افزاری vc_redist_2015_update3_x86 را دانلود و نصب کنید ( اگر از نسخه ۶۴ بیتی کتابخانه استفاده می کنید، vc_redist_2015_update3_x64 را دانلود کنید ).

هشدار

به دلیل محدودیت های سیستم عامل در تخصیص حافظه به پردازش های 32 بیتی، اگر تعداد دوربین ها و یا تنظیمات شما بگونه ای است که باعث مصرف حافظه رم بیش از 700 مگ بایت می شود (معمولا با اجرای بیشتر از 5 دوربین این اتفاق خواهد افتاد، برای تعداد کمتر وابسته به تنظیمات تعیین شده شما برای ساتپاست) حتما از نسخه 64 بیتی استفاده کنید. در این صورت برنامه شما نیز باید 64 بیتی کامپایل شود و قابلیت اجرا بر روی سیستم های 32 بیتی را نخواهد داشت.

کتابخانه ساتپا از کتابخانه های دیگری مثل OpenCV، libVLC و OpenGL هم استفاده می کند که باید کنار ANPR.dll کپی شوند. این فایل ها همراه کتابخانه یا در بسته ای به نام Prerequisits.rar قرار دارند که باید extract شود. در نهایت باید پوشه حاوی ANPR.dll شبیه تصویر زیر باشد:

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

فعال سازی سخت افزاری

در صورت خرید نسخه دارای دانگل سخت افزاری، ابتدا باید فایل ActiveX (فایلی با پسوند ocx) را که در بین فایل های ارسالی قرار دارد، رجیستر کنید. برای این کار، ابتدا cmd.exe را در حالت مدیر سیستم (run as administrator) باید اجرا کنید و سپس به مسیری که فایل ActiveXقرار دارد رفته و با نوشتن دستور زیر آن را رجیستر کنید:

regsvr32 "مسیر کامل فایل ActiveX همراه با نام فایل"

در نهایت با مشاهده پیام زیر از رجیستر شدن فایل اطمینان حاصل کنید.

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

فعال سازی نرم افزاری

در صورتیکه مجوز خریداری شده نرم افزاری باشد، هنگام اجرای برنامه دموی موجود در پوشه Release با نام SATPA_DEMO.exe ( ANPR_DEMO.exe در نسخه 9 و نسخه های پایین تر ) پیامی به صورت زیر ظاهر می شود:

بعد از تایید پیام فوق، فایلی با نام ANPR.hid تولید خواهد شد که باید این فایل را برای فروشنده ارسال کنید و در پاسخ فایلی با نام ANPR.cfg دریافت کنید. فایل دریافتی را کنار ANPR.dll کپی کنید تا برنامه اجر اشود.

اجرا دمو (نسخه 10)

در نسخه 10 ساتپا نیازی به افزودن دوربین و شی در کتابخانه نیست و با اجرای دمو می توانید از دوربین های ساخته شده ( بر اساس تعداد مشخص شده در مجوز ) استفاده کنید.

اجرا دمو (نسخه 9)

پس از اجرای دمو در ابتدا با استفاده از دکمه " + " اقدام به ایجاد یک دوربین یا شی از کتابخانه کنید. در غیر این صورت امکان استفاده از امکانات کتابخانه وجود نخواهد داشت و در ادامه با خطا مواجه خواهید شد.

تشخیص پلاک از روی عکس

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

برای کاهش سربار برنامه و جلوگیری از دو بار بارگذاری تصویر ( یک بار در برنامه میزبان، و دوباره در کتابخانه ) دکمه Recognize Buffer پیش بینی شده است. کد نوشته شده برای این دکمه، نحوه کار با بافر حافظه تصویر را نشان می دهد.

تشخیص پلاک از روی ویدیو یا دوربین (نسخه 10)

برای کار با ویدیو از تب Live استفاده کنید. در اینجا می توانید از فایل ویدیویی، دوربین وبکم یا دوربین تحت شبکه استفاده کنید. با کلیک روی هر پنجره نمایش و انتخاب فایل ویدئویی یا رشته اتصال مورد نظر در پنجره متنی و فشردن دکمه اجرا، ساتپا اقدام به نمایش و پردازش تصاویر می کند و نتایج برای دوربین انتخاب شده در ستون سمت راست نمایش داده خواهند شد .

تشخیص پلاک از روی ویدیو یا دوربین (نسخه 9)

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

کار با دوربین وبکم

برای دوربین وبکم کافیست در محل رشته URL عدد 0 (شماره دوربین) را وارد کنید و دکمه ساتپا تشخیص پلاک پلاک خوان را بزنید. اگر بیش از یک دوربین دارید، شماره های 1 و 2 و ... را استفاده کنید.

کار با دوربین تحت شبکه

اگر می خواهید تصویر را مستقیما از دوربین شبکه (IP Camera) دریافت کنید، باید رشته اتصال به دوربین را بدانید. هر دوربین، رشته اتصال خاصی دارد که با دیگر دوربین ها متفاوت است. راه های مختلفی برای دریافت رشته اتصال دوربین ها وجود دارد

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

پس از وارد کردن رشته اتصال ، از دکمه ساتپا تشخیص پلاک پلاک خوان برای اتصال به دوربین استفاده کنید.

هم چنین می توانید از توابع خود کتابخانه برای جستجو دوربین های موجود در شبکه و یافتن رشته اتصال آن ها کمک بگیرید.

کامپایل پروژه در مد دیباگ

در صورت نیاز به کامپایل پروژه در مد Debug باید تمام محتویات پوشه Release را در پوشه Debug هم کپی کنید در غیر اینصورت خطای DLL Not Found رخ می دهد.

نحوه ارتباط کتابخانه با برنامه میزبان

ارتباط کتابخانه با برنامه میزبان از طریق یک اشاره گر به تابع انجام می شود که نحوه کار در پروژه سی شارپ توضیح داده شده است. توابع DLL هم در فایل SATPA-API.cs لیست شده است.

شرایط نصب

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

انتخاب دوربین

از دوربین های بهینه شده برای امر پلاک خوانی استفاده کنید، دوربین های نظارتی مناسب امر پلاک خوانی نیستند. ترجیحا از دوربین هایی که توسط شرکت شهاب به فروش می رسد استفاده کنید، در غیر این صورت حتما در مورد مشخصات دوربین از متخصصان شرکت شهاب مشاوره بگیرید.

راه اندازی دوربین

راه اندازی دوربین در شرایط مناسب مسئله حائز اهمیتی است. پارامتر های زیر را هنگام راه اندازی دوربین در نظر داشته باشید:

زاویه دوربین

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

نور محیط

در کاربرد های فضای باز در روز اغلب نیاز به نور مصنوعی نیست اما در شب چه در فضای باز و چه در فضای بسته حتما نور مناسب را تامین کنید. در صورت امکان استفاده از نور مرئی توصیه می شود.

نمونه تصویر با نور کم :

نمونه تصویر با نور زیاد :

رزولوشن

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

سرعت شاتر

سرعت شاتر باید بگونه ای تنظیم شود که تصویر پلاک نه دچار ماتی شود و نه تصویر را چندان تیره کند.

نمونه تصویر با سرعت شاتر نامناسب ( سرعت شاتر بالا ) :

چند نمونه تصویر با سرعت شاتر نامناسب ( سرعت شاتر پایین ) :

در شرایط نوری مناسب برای روز معمولا سرعت شاتر 200/1 یا 250/1 و برای شب 250/1 یا 500/1 مناسب است.تنظیم دقیق سرعت شاتر وابسته به شراط نوری و سرعت تردد خودرو ها متفاوت است.

نرخ فریم

در کاربرد هایی مانند پارکینک که تردد خودرو ها با سرعت پایین انجام می شود نرخ فریم 20 و در کاربرد هایی با سرعت تردد بالا نرخ فریم 25 تا 30 مناسب هستند.

سایر تنظیمات

سایر تنظیمات دوربین که معمولا در دوربین های پلاک خوان وجود دارند اعم از WDR, HLC, BLC, GAIN,CONTRAST , .. که تعیین مقدار مناسب آن ها وابستگی زیادی به شرایطی محیطی دارند را بگونه ای تنظیم کنید که پلاک از ماتی، کشیدگی، تیرگی زیاد، شفافیت زیاد به دور باشد.

شرایط پلاک

پلاک نباید دارای عارضه و یا کثیفی بیش از حد باشد.

نمونه پلاک نامناسب (دارای عارضه و کثیفی):

پلاک نباید مخدوش باشد.

راهنمای تنظیمات

کاهش عرض تصویر

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

نکته

از این پارامتر تنها برای کاهش رزولوشن فایل های ویدئویی استفاده کنید. برای کاهش رزولوشن تصویر دریافتی از دوربین، از طریق تنظیمات دوربین اقدام کنید تا در مصرف پردازنده و شبکه صرفه جویی شود.

نرخ فریم بر ثانیه

تنظیم این پارامتر بستگی به استفاده از توابع پخش استریم دارد. در کتابخانه دو روش پخش vlc و opencv وجود دارد. اگر از تابع vlpr_start_grabbing(...) استفاده کنید از کتابخانه opencv استفاده خواهد شد. اگر از تابع vlpr_start_grabbingVLC(...) استفاده کنید از کتابخانه vlc برای برقراری ارتباط با دوربین یا فایل ویدئویی استفاده خواهد شد. توصیه به استفاده از کتابخانه vlc است.

اگر از متد opencv استفاده میکنید نرخ فریمی که در تنظیمات قرارمی دهید، هم نرخ فریم نمایش و هم نرخ فریم پردازش خواهد بود.

اگر از روش vlc استفاده میکنید نرخ فریمی که در تنظیمات قرار می دهید، تنها نرخ فریم پردازش خواهد بود و پخش تصویر با همان نرخ فریم مبدا خواهد بود.

نکته

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

تعداد نویسه های پلاک

سه نوع پلاک به تعداد نویسه های مختلف در کشور وجود دارد.

  1. پلاک های استاندارد وسایل نقلیه موتوری و ماشینی با 8 نویسه
  2. پلاک مناطق ازاد قدیمی با 5 نویسه
  3. پلاک مناطق آزاد جدید با 7 نویسه

این پارامتر یک ارایه دو تایی است که نشان دهنده تعداد نویسه های پلاک است. در حالت پیش فرض مقادیر 8 و 0 را داراست به این معنی که فقط پلاک های استاندارد مد نظر است. در صورتی که قصد پلاک خوانی در مناطق ازاد را دارید مقدار دوم را بر حسب نیاز 5 یا 7 قرار دهید.

گزارش تصویر پلاک

سه مقدار 0 و 1 و 2 را می پذیرد.

0 : هنگام شناسایی پلاک فقط رشته پلاک گزارش می شود.

1 : پس از شناسایی پلاک علاوه بر رشته، تصویر پلاک هم گزارش می شود.

2 : علاوه بر رشته و تصویر پلاک، تصویر خودرو نیز گزارش می شود.

موتورسیکلت

اگر قصد پلاک خوانی موتورسیکلت را دارید مقدار true در غیر این صورت مقدار false را قرار دهید.

تشخیص چند پلاک

اگر مقدار false را قرار دهید در هر فریم تنها یک پلاک شناسایی خواهد شد و اگر مقدار true را قرار دهید در هر فریم تا 5 پلاک به طور هم زمان شناسایی و گزارش خواهند شد.

نکته

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

گزارش پلاک های ناقص

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

نکته

در صورتی که این تنظیم را flase قرار دهید، در صورتی که اگر حتی یک رقم پلاک هم خوانده نشود، پلاک گزارش نخواهد داشت و تردد از دست خواهد رفت. پس در استفاده از این تنظیم دقت کنید.

VLC Cache Time

این پارامتر را برای اتصال اسان به دوربین روی 1000 میلی ثانیه قرار دهید. در صورتی که در اتصال به دوربین دچار مشکل شدید یکی از پارامتر های کمک کننده افزایش این مقدار به 1500 تا 2000 خواهد بود. توجه داشته باشید تصویر در حال نمایش نسبت به تصویر زنده، همیشه حداقل به این میزان زمان بر حسب میلی ثانیه ، تاخیر خواهد داشت.

پخش صدا

برای اتصال به دوربین باید تنظیمات صدا در دوربین و ساتپا با یکدیگرهماهنگ باشند. اگر صدا در دوربین وصل است باید این پارامتر را برابر true قرار دهید. پس اگر در اتصال به دوربین مشکل دارید حتما این گزینه را بررسی کنید.

دریافت تک تصویر

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

وقفه بعد از موفقیت

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

عدم گزارش پلاک تکراری

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

اختلاف نویسه های تکراری پلاک

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

توجه داشته باشید که منظور از x اختلاف این است که بتوان با x عمل شامل اضافه کردن کاراکتر، کاهش کاراکتر، جابه جایی دو کاراکتربا یکدیگر، تغییر کاراکتر ها و یا x عمل از ترکیب این تغییرات، دو پلاک را به یکدیگر تخصیص داد.

بافر پلاک ها

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

به طور کلی هر یک از رخداد های زیر که زود تر رخ دهد گزارش پلاک صورت می گیرد.

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

ورود خودرو

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

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

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

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

صرفه جویی در پردازنده

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

رهگیری پلاک

در صورتی که مقدار true را قرار دهید پلاک های در حال شناسایی با مارکر دنبال می شوند. در صورتی که پردازنده شما نتواند به صورت آنی تمام فریم ها را پردازش کند، این پارامتر false قرار دهید چرا که ممکن است مارکر دقیقا پلاک را نشان ندهد.

حداقل و حداکثر عرض نویسه

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

میزان کجی پلاک

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

صرفه نظر از دولتی

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

حداقل دقت پلاک

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

موتور پلاک خوانی

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

نوع پلاک

این پارامتر سه مقدار 0 ، 1 و 2 را می پذیرد.

0 : قصد پلاک خوانی مناطق ازاد را ندارید و تردد ها دارای پلاک استاندارد ملی هستند.

1 : تردد ها علاوه بر پلاک های استاندارد شامل پلاک مناطق ازاد هفت رقمی نیز هستند.

2 : تردد ها علاوه بر پلاک های استاندارد، شامل پلاک مناطق ازاد پنج رقمی نیز هستند.

شیوه ترسیم تصاویر یا Draw Method

ساتپا برای ترسیم تصاویر از چهار روش مختلف استفاده می کند.

  1. روش اول استفاده از توابع ویندوز است که بهینه ترین و مناسب ترین روش است.
  2. روش دوم استفاده از کتابخانه OpenGl است. اگر کارت گرافیک یا پردازنده گرافیکی شما OpenGl نسخه 3.3 را پشتیبانی کند، می توانید از این روش استفاده کنید.
  3. روش سوم استفاده از کتابخانه SDL است.
  4. روش چهارم، در این روش هیچ گونه ترسیمی سمت کتابخانه صورت نمی گیرد و پس از دریافت هر فریم رویداد "فریم جدید" به میزبان ارسال می شود. میزبان می تواند با استفاده از توابع ساتپا به فریم دست پیدا کند و در صورت لزوم آن را ترسیم کند. اگر قصد نمایش تصویر را ندارید می توانید از این روش استفاده کنید.

شیوه پخش

همان گونه که در پارامتر نرخ فریم توضیح داده شد، ساتپا برای اتصال به دوربین و یا پخش ویدئو از دو کتابخانه OpenCV و VLC استفاده می کند. توصیه به استفاده از کتابخانه VLC است . برای این کار از تابع vlpr_start_grabbingVLC(...) استفاده کنید.

ناحیه مورد علاقه یا Region of Interest

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

سایر پارامتر ها

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

توابع و پارامتر ها

تغییرات توابع در ساتپا 10

در نسخه 10 کتابخانه تشخیص پلاک ساتپا بخشی از نام توابع از anpr یا vlpr در نسخه های پیشین به satpa تغییر پیدا کرده است. برای اطلاع از این تغییرات می توانید به لیست کامل تغییرات نام توابع در نسخه 10 مراجعه کنید.

همچنین پارامتر ها و نحوه کار با برخی توابع نیز در نسخه 10 تغییرات داشته است. نسخه پیشین توابعی که تغییرات کلی داشته اند همچنان در مستندات موجود است. تغییرات سایر توابع تنها محدود به تغییر نام آن ها می باشد.

تابع satpa_create

short	satpa_create(byte instance,byte per_plate_license,string security_code, byte log_level, string cfg_file)

این تابع برای تولید یک شیء از کتابخانه ساتپا فراخوانی می شود و حتما باید یکبار در ابتدای برنامه (مثلا در زمان بارگذاری فرم اصلی برنامه) فراخوانی شود. کاربر می تواند چند شیء از کتابخانه برای کار کردن با دوربین های مختلف بسازد. تعداد این اشیاء بسته به نوع مجوز خریداری شده محدودیت دارد.

در صورت موفقیت این تابع، صفر و در صورت بروز خطا، عددی منفی به عنوان خروجی بر می گردد.

پارامتر ها

byte instance

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

byte per_plate_license

صفر : مجوز شما محدود به تعداد دوربین خواهد بود.

یک : مجوز شما محدود به تعداد پلاک های گزارش شده خواهد بود.

قبل از خریداری نهایی کتابخانه در مورد نوع مجوز از شرکت کسب اطلاع بفرمایید.

string security_code

این پارامتر، کد امنیتی کتابخانه و شامل یک رشته ثابت است. اگر این رشته اشتباه وارد شود، کتابخانه درست کار نخواهد کرد.

byte log_level

پارامتر log_level، نوع ثبت رویداد های کتابخانه را بیان می کند که شامل سه حالت است :

صفر : عدم ثبت هیچ رویدادی - پیش فرض (در حالتی که کتابخانه بدون خطا کار می کند نیازی به ثبت رویداد ها نیست)

یک : ثبت رویداد های مهم

دو : ثبت اکثر رویداد ها (مناسب برای خطا یابی توسط توسعه دهنده ی کتابخانه)

string cfg_file

پارامتر cfg_file آدرس فایل قفل نرم افزاری است که نام پیش فرض آن ANPR.cfg است. در صورت تمایل می توانید اسم این فایل را تغییر داده و مسیر آن را ارسال کنید. اگر NULL ارسال کنید، نام پیش فرض جستجو خواهد شد.

تابع satpa_about

void	satpa_about()

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

نمونه ای از این دیالوگ را در شکل زیر می بینید :

تابع satpa_set_event_callback (نسخه 10)

void  satpa_set_event_callback(ANPR_EVENT_CALLBACK callback_fcn ,int reserve = 0)

این تابع اشاره گری ( delegate در سی شارپ) به یک تابع callback به عنوان ورودی دریافت می کند. تابع مذکور مسئول رسیدگی به تمام رویدادهای کتابخانه خواهد بود؛ به عبارتی هر گاه رویدادی مثل (دریافت فریم جدید، تشخیص پلاک، قطع ارتباط با دوربین و ...) رخ دهد، کتابخانه این تابع callback را با پارامترهای مناسب، فراخوانی خواهد کرد.

پارامتر ها

پارامتر اول این تابع اشاره گری است به تابع callback با الگوی زیر (در C++ و سی شارپ):

C++: typedef void(__stdcall *ANPR_EVENT_CALLBACK)(int event_type, byte stream, byte plt_idx);

C#: public delegate void ANPR_EVENT_CALLBACK(int event_type, byte stream, byte plt_idx);

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

ANPR_EVENT_CALLBACK HandleANPREventsDelegate = null; 
                        private void HandleANPREvents(int event_type, byte stream, byte roi) 
                        {
                            if (InvokeRequired) 
                            { 
                                Invoke(HandleANPREventsDelegate, event_type, stream, roi);
                                return;
                            } if (event_type == WM_CAM_NOT_FOUND) 
                                MessageBox.Show("اتصال با دوربین یا فایل برقرار نشد ", "خطا ");  
                            else if (event_type == WM_NEW_FRAME)//New Frame Captured 
                                UpdateFrame(); 
                            else if (event_type == WM_PLATE_DETECTED)//plate detected 
                                UpdateResults(roi); 
                            else … 
                            } 
                            HandleANPREventsDelegate = new ANPR_EVENT_CALLBACK(HandleANPREvents); 
                            satpa_set_event_callback(HandleANPREventsDelegate);
                        }

پارامتر دوم این کتابخانه رزرو و مقدار پیشفرض صفر را می پذیرد.

هشدار

هشدار: چون این تابع توسط کتابخانه ساتپا فراخوانی می شود و کتابخانه در چند نخ (thread) جدا مشغول کار است، لذا فراخوانی آن در نخی غیر از نخ رابط کاربری صورت می گیرد و اگر مستقیما در این تابع، المانی از رابط کاربری را تغییر دهید (مثلا متن رشته را روی یک کنترل نمایش دهید)، برنامه با خطای زمان اجرا مواجه می شود. لذا نوشتن بلوک شرطی if (InvokeRequired) ضروری است.

اگر منشا اعمال تغییرات در رابط کاربری این تابع باشد بازهم به همان دلیل ذکر شده تغییرات باید در بلوک زیر قرار گیرند.

this.Invoke((MethodInvoker)delegate
                            {
                             ……..
                            });

نمونه استفاده از دستور بالا در دمو موجود است.

تابع anpr_set_event_callback (نسخه 9)

void  anpr_set_event_callback(ANPR_EVENT_CALLBACK callback_fcn ,int reserve = 0)

این تابع اشاره گری ( delegate در سی شارپ) به یک تابع callback به عنوان ورودی دریافت می کند. تابع مذکور مسئول رسیدگی به تمام رویدادهای کتابخانه خواهد بود؛ به عبارتی هر گاه رویدادی مثل (دریافت فریم جدید، تشخیص پلاک، قطع ارتباط با دوربین و ...) رخ دهد، کتابخانه این تابع callback را با پارامترهای مناسب، فراخوانی خواهد کرد.

پارامتر ها

پارامتر اول این تابع اشاره گری است به تابع callback با الگوی زیر (در C++ و سی شارپ):

C++: typedef void(__stdcall *ANPR_EVENT_CALLBACK)(int event_type, byte stream, byte plt_idx);

C#: public delegate void ANPR_EVENT_CALLBACK(int event_type, byte stream, byte plt_idx);

به عنوان مثال در نسخه 9.00 سی شارپ با دستورات زیر می توانید تابع مدیریت رویداد ها را فعال کنید:

ANPR_EVENT_CALLBACK HandleANPREventsDelegate = null;

                        private void HandleANPREvents(int event_type, byte stream, byte roi)
                        {
                            if (InvokeRequired)
                               {
                                   Invoke(HandleANPREventsDelegate, event_type, stream, roi);
                                   return;
                               }
                               if (event_type == WM_CAM_NOT_FOUND)       
                                   MessageBox.Show("اتصال با دوربین یا فایل برقرار نشد", "خطا");       
                               else if (event_type == WM_NEW_FRAME)//New Frame Captured       
                                  UpdateFrame();       
                               else if (event_type == WM_PLATE_DETECTED)//plate detected       
                                  UpdateResults(roi);       
                               else …
                            }
                            HandleANPREventsDelegate = new ANPR_EVENT_CALLBACK(HandleANPREvents);
                            anpr_set_event_callback(HandleANPREventsDelegate);
                        }

پارامتر دوم این کتابخانه رزرو و مقدار پیشفرض صفر را می پذیرد.

هشدار

هشدار: چون این تابع توسط کتابخانه ساتپا فراخوانی می شود و کتابخانه در چند نخ (thread) جدا مشغول کار است، لذا فراخوانی آن در نخی غیر از نخ رابط کاربری صورت می گیرد و اگر مستقیما در این تابع، المانی از رابط کاربری را تغییر دهید (مثلا متن رشته را روی یک کنترل نمایش دهید)، برنامه با خطای زمان اجرا مواجه می شود. لذا نوشتن بلوک شرطی if (InvokeRequired) ضروری است.

اگر منشا اعمال تغییرات در رابط کاربری این تابع باشد بازهم به همان دلیل ذکر شده تغییرات باید در بلوک زیر قرار گیرند.

this.Invoke((MethodInvoker)delegate
                            {
                             ……..
                            });

نمونه استفاده از دستور بالا در دمو موجود است.

انواع رویداد های کتابخانه

کتابخانه 6 رویداد مهم دارد که به شرح زیر اند :

نام رویداد کاربرد آن
WM_NEW_FRAME وقتی کتابخانه فریم جدیدی از ویدیو دریافت کند، این رویداد را ارسال می کند. اگر شیوه رسم draw on host انتخاب شده باشد، رسم فریم جدید باید در این رویداد مدیریت شود. برای کسب اطلاع از نحوه این کار می توانید به برنامه نمونه ی پیوست کتابخانه مراجعه کنید.
WM_CAM_NOT_FOUND این رویداد ممکن است هنگام فراخوانی توابع اتصال به دوربین رخ دهد که به معنای عدم اتصال به دوربین است.
WM_CONNECTED زمانی که اتصال به دوربین و یا فایل ویدئویی به درستی انجام شود این رویداد فراخوانی می شود
WM_INITIAL_PLATE هرگاه پلاکی یافت شود، ابتدا این رویداد فراخوانی می شود و با نهایی شدن نتیجه در فریم های بعدی ویدیو، رویداد PLATE_DETECTED اتفاق می افتد. از این رویداد برای ترسیم مستطیل اطراف پلاک در طول حرکت خودرو استفاده می کنیم. البته توجه شود هنگامی که این رویداد رخ می دهد مقدار plt_idx برابر با تعداد کل پلاک های شناسایی شده است.
WM_PLATE_DETECTED وقتی نتیجه نهایی پلاک مشخص شد، این رویداد رخ می دهد. نوعا نتیجه نهایی زمانی گزارش می شود که خودرو در آستانه خروج از صحنه باشد. در این رویداد مقدار plt_idx برابر با اندیس پلاک شناسایی شده است.
WM_PLATE_NOT_DETECTED هرگاه خودرویی وارد صحنه شود ولی پلاک آن تشخیص داده نشود، این رویداد فراخوانی می شود.
WM_END_OF_VIDEO اگر در وسط تصویر برداری، ارتباط با دوربین قطع شود یا در صورت کار با فایل ویدیویی به انتهای فایل ویدیویی برسیم، این رویداد فراخوانی می شود.
WM_CAM_SEARCH اگر از تابع جست و جوی دوربین استفاده کنید، در صورت یافتن دوربین این رویداد فراخوانی می شود.
WM_CAM_SEARCH_ERROR اگر از تابع جست و جوی دوربین استفاده کنید، در صورت بروز خطا در یافتن دوربین این رویداد فراخوانی می شود.
WM_MESSAGE سایر پیام های کتابخانه در صورت نیاز با استفاده از کد خطا تحت این رویداد فراخوانی می شوند.

تابع satpa_set_params (نسخه 10)

satpa_set_params(byte instance, string slpr_params)

هدف از این تابع، اعمال تنظیمات خاص به هر شی از کتابخانه است. این تنظیمات در قالب یک رشته جیسان به کتابخانه ارسال می شوند. کلاس تنظیمات به شکل زیر خواهد بود :

public class SLPRParams
                            {
                                public int[] num_valid_chars { get; set; {
                                public byte medianKernel { get; set; }
                                public short vlc_net_cache_time { get; set; }
                                public byte n_frm_skip_on_success { get; set; }
                                public byte difference_threshold { get; set; }
                                public byte plate_buffer_size { get; set; }
                                public int skip_same_plate_frame { get; set; }
                                public byte detect_multi_plate { get; set; }
                                public byte play_audio_from_camera { get; set; }
                                public byte plate_type { get; set; }
                                public byte report_non_standard_plates { get; set; }
                                public byte min_threshold_hist { get; set; }
                                public byte max_threshold_hist { get; set; }
                                public int[] blur_kernel { get; set; }
                                public byte char_diffrence { get; set; }
                                public byte economy { get; set; }
                                public byte detect_english_plate { get; set; }
                                public byte detect_persian_plate { get; set; }
                                public byte custom_country { get; set; }
                                public int plate_width { get; set; }
                                public int plate_height { get; set; }
                                public int frame_width { get; set; }
                                public int frame_height { get; set; }
                                public float plate_confidence_min { get; set; }
                                public float plate_threshold { get; set; }
                                public float char_confidence_min { get; set; }
                                public float char_threshold { get; set; }
                            };
                            
                        

برخی پارامتر های مهم آن به شرح زیر اند:

پارامتر ها

num_valid_chars1 و num_valid_chars2

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

medianKernel

اگر تصویر دریافتی از دوربین ، نویز دارد (مثل برخی دوربین های مادون قرمز) ، این پارامتر را روی 3 یا 5 یا 7 تنظیم کنید. با این کار نویز تصویر تا حدی حذف می شود و سرعت و دقت پلاک خوانی هم تا حدی بهبود می یابد. برای یافتن بهترین عدد، باید روی یک یا چند نمونه ویدیوی دریافتی از دوربین ، با پارامتر های مختلف تست کنید. مقدار پیش فرض این عدد، صفر است که برای اکثر دوربین ها مناسب است.=

vlc_net_cache_time

با توجه به این که ممکن است بعضی از دوربین ها در همان چند لحظه اول تصویری برای نرم افزار ارسال نکرده و خطای ارتباط برقرار نشد رخ دهد، به همین منظور این پارامتر را بسته به نوع دوربین مقداری بین 300 تا 1000 میلی ثانیه تنظیم می کنیم. هر چه این مقدار بالاتر باشد تصویری که به نرم افزار ارسال شده با تصویری که دوربین مشاهده می کند به همان میزان (بر حسب میلی ثانیه) تاخیر دارد.

n_frm_skip_on_success

این پارامتر بیان می کند، بعد از شناسایی موفق یک پلاک (در حالت ویدیو) چند فریم نادیده گرفته شود. نوعا وقتی پلاک یک خودرو شناسایی می شود تا 10-15 فریم بعدی، خودروی جدیدی به جلوی دوربین، نمی آید و در این مدت نیازی به پردازش نداریم. اگر تردد خیلی زیاد است، این پارامتر را 0 بگذارید وگرنه، عدد 15 مناسب است.

difference_threshold

این عدد، یک آستانه است برای تشخیص ورود خودرو به صحنه. به این ترتیب که اگر تغییرات صحنه از این حد بیشتر شود، فرض می کنیم خودرویی وارد صحنه شده است. عدد کوچک تر به معنی حساسیت بیشتر است و اگر صفر بگذارید، تمام فریم ها به عنوانِ فریمِ حاوی خودرو تلقی شده و پردازش می شوند. این کار باعث افزایش مصرف پردازنده خواهد شد. عدد مناسب برای این آستانه، چیزی بین 5 تا 25 است که به نوعی بیانگر درصد تغییرات صحنه است.

plate_buffer_size

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

skip_same_plate_frame

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

detect_multi_plate

اگر می خواهید چندین پلاک در یک فریم تصویر شناسایی شود، این مقدار را 1 بگذارید.

play_audio_from_camera

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

plate_type

این پارامتر سه مقدار صفر، یک و دو را می پذیرد.
صفر : قصد پلاک خوانی مناطق ازاد را ندارید و تردد ها دارای پلاک استاندارد ملی هستند.
یک : تردد ها علاوه بر پلاک های استاندارد شامل پلاک مناطق ازاد هفت رقمی نیز هستند.
دو : تردد ها علاوه بر پلاک های استاندارد، شامل پلاک مناطق ازاد پنج رقمی نیز هستند.

report_non_standard_plates

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

char_diffrence

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

economy

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

detect_english_plate

در صورتی که قصد شناسایی پلاک هایی با نویسه های لاتین را دارید، مقدار این پارامتر را عدد 1 قرار دهید. برای شناسایی پلاک های لاتین باید لایسنس مربوطه را از شرکت دریافت کنید.

detect_persian_plate

در صورتی که قصد شناسایی پلاک های کشور ایران را دارید، مقدار این پارامتر را عدد 1 قرار دهید.

custom_country

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

تابع anpr_set_params (نسخه 9)

void  anpr_set_params(byte instance, SLPRParams* params)

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

پارامتر ها

resize_thresh

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

هشدار

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

نکته ای برای افزایش کارایی

اگر دوربین شما مثلا 2 مگاپیکسل است (1080 * 1920) ولی پلاک خوانی با عرض 1280 به خوبی صورت می گیرد، بهتر است برای کاهش مصرف CPU، رزولوشن واقعی دوربین را (از طریق مرورگر یا برنامه اختصاصی دوربین) کاهش دهید تا عملیات تغییر اندازه هم صورت نگیرد.

num_valid_chars1 و num_valid_chars2

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

medianKernel

اگر تصویر دریافتی از دوربین ، نویز دارد (مثل برخی دوربین های مادون قرمز) ، این پارامتر را روی 3 یا 5 یا 7 تنظیم کنید. با این کار نویز تصویر تا حدی حذف می شود و سرعت و دقت پلاک خوانی هم تا حدی بهبود می یابد. برای یافتن بهترین عدد، باید روی یک یا چند نمونه ویدیوی دریافتی از دوربین ، با پارامتر های مختلف تست کنید. مقدار پیش فرض این عدد، صفر است که برای اکثر دوربین ها مناسب است.=

save_plate_option

این پارامتر سه مقدار 0، 1 یا 2 می تواند بگیرد. اگر 0 باشد هنگام یافتن پلاک ، تنها رشته پلاک و مختصات مستطیل آن گزارش می شود. اگر 1 باشد، علاوه بر این ها، بافر تصویر پلاک هم ذخیره و ارسال می شود، و اگر 2 باشد علاوه بر موارد قبلی، بافر تصویر کامل خودرو هم ذخیره و ارسال می شود که ممکن است کمی مصرف حافظه را افزایش داده و از سرعت پردازش بکاهد.

max_char_w, max_char_h و min_char_w, min_char_h

این ها حداقل و حداکثر عرض/طول یک نویسه بر حسب پیکسل را بیان می کنند. مقادیر پیش فرض برای حداقل ها 7 و برای حداکثر ها 100 پیکسل است و غالبا نیازی به تغییر ندارند. ولی اگر دوربین خیلی به پلاک نزدیک است و عرض برخی نویسه ها (مثل حرف ب یا ت) از 100 پیکسل بیشتر می شود، می توانید این مقادیر را اصلاح کنید.

skew_coef

این پارامتر، بیانگر میزان کجی پلاک نسبت به افق بوده و می تواند بین 0 تا 3 باشد. اگر دوربین نسبت به خودرو، زاویه دارد طوری که پلاک خودرو در تصویر به صورت افقی نیست، این عدد را باید تنظیم کنید. هر چه کجی بیشتر باشد، این عدد هم بزرگتر انتخاب شود. مقدار مناسب این پارامتر برای کجی تا 15 درجه، حدود 1.5 است.

n_frm_skip_on_success

این پارامتر بیان می کند، بعد از شناسایی موفق یک پلاک (در حالت ویدیو) چند فریم نادیده گرفته شود. نوعا وقتی پلاک یک خودرو شناسایی می شود تا 10-15 فریم بعدی، خودروی جدیدی به جلوی دوربین، نمی آید و در این مدت نیازی به پردازش نداریم. اگر تردد خیلی زیاد است، این پارامتر را 0 بگذارید وگرنه، عدد 15 مناسب است.

vlc_net_cache_time

با توجه به این که ممکن است بعضی از دوربین ها در همان چند لحظه اول تصویری برای نرم افزار ارسال نکرده و خطای ارتباط برقرار نشد رخ دهد، به همین منظور این پارامتر را بسته به نوع دوربین مقداری بین 300 تا 1000 میلی ثانیه تنظیم می کنیم. هر چه این مقدار بالاتر باشد تصویری که به نرم افزار ارسال شده با تصویری که دوربین مشاهده می کند به همان میزان (بر حسب میلی ثانیه) تاخیر دارد.

diff_thresh

این عدد، یک آستانه است برای تشخیص ورود خودرو به صحنه. به این ترتیب که اگر تغییرات صحنه از این حد بیشتر شود، فرض می کنیم خودرویی وارد صحنه شده است. عدد کوچک تر به معنی حساسیت بیشتر است و اگر صفر بگذارید، تمام فریم ها به عنوانِ فریمِ حاوی خودرو تلقی شده و پردازش می شوند. این کار باعث افزایش مصرف پردازنده خواهد شد. عدد مناسب برای این آستانه، چیزی بین 5 تا 25 است که به نوعی بیانگر درصد تغییرات صحنه است.

detect_motor

اگر می خواهید پلاک موتور هم شناسایی شود، این مقدار را 1 بگذارید.

detect_multi_plate

اگر می خواهید چندین پلاک در یک فریم تصویر شناسایی شود، این مقدار را 1 بگذارید.

نکته

برای تشخیص همزمان چند پلاک حتما مجوز چند پلاک خریداری شود در غیر این صورت یک گذاشتن این مقدار تاثیری در شناسایی ندارد.

plate_buf_size

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

skip_same_plate_time

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

play_audio_from_camera

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

take_shot_from_camera

اگر چنانچه رشته اتصال مناسبی برای دریافت جریان تصویر از دوربین پیدا نشد بعضی از دوربین ها این قابلیت را دارند که اطلاعات جریان تصویر را به صورت تک تصویر دربازه زمانی مشخص ارسال کنند اگر چنین شرایط بود این پارامتر با مقدار 1 تنظیم گردد.

تابع satpa_add_ROI

void	satpa_add_ROI(byte instance, RECT roi)

گاهی اوقات لازم است تنها بخشهای خاصی (نواحی مورد علاقه) از تصویر ویدیویی پردازش شود. این کار مصرف پردازنده را کاهش می دهد و در مواردی که بیش از یک مسیر تردد وجود دارد، می توانید برای هر مسیر، یک ناحیه مورد علاقه (Region of Interest) تعریف کنید. با این کار، در گزارش گیری ها هم می توانید تردد های مربوط به مسیرهای مختلف را تفکیک کنید.

نکته

حداکثر 4 ناحیه مورد علاقه می توانید تعریف کنید.

اگر هیچ ناحیه ای را تعریف نکنید پلاک ها با ناحیه 0 گزارش خواهند شد .

پارامتر ها

این تابع دو پارامتر می گیرد که اولی شماره دوربین (یا همان شماره شیء ساخته شده از کتابخانه) و دومی مختصات مستطیل ناحیه مورد علاقه است. اگر تنها یک دوربین دارید باید در تمام توابع، مقدار instance را صفر بگذارید.

تابع satpa_clear_ROIs

void	satpa_clear_ROIs(byte instance)

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

تابع satpa_recognize

short	satpa_recognize(byte instance, wchar_t* fn, wchar_t* result, float* pcnf, RECT* prc)

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

پارامتر ها

byte instance

این پارامتر، شماره مربوط به شیء (instance) ساخته شده از کتابخانه است.

wchar_t* fn

آدرس کامل فایل به صورت یونیکد، در این پارامتر ارسال می شود. دقت کنید در C++ نوع داده یونیکد با عنوان wchar_t شناخته می شود که معادل آن در سی شارپ همان char و در دلفی WideChar است.

wchar_t* result

رشته پلاک تشخیص داده شده (به صورت فارسی)، در این اشاره گر ریخته خواهد شد. حافظه لازم برای این اشاره گر، حتما باید در برنامه میزبان، تخصیص داده شود. هر چند برای پلاک های استاندارد ، تخصیص 8 خانه حافظه کافیست ولی پیشنهاد اکید می شود حداقل 20 خانه حافظه تخصیص دهید، چرا که ممکن است رشته های عددی غیر از پلاک در تصویر باشند که بیش از 8 حرف و رقم داشته باشند.

float* pcnf

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

نکته

از این پارامتر می توانید برای حذف رشته های اشتباه استفاده کنید. مثلا گاهی ممکن است جلوپنجره برخی خودرو ها یا کد تاکسی ها به عنوان پلاک خوانده شود. این ها چون واقعا پلاک نیستند، میزان اطمینان آن ها کم خواهد بود (نوعا کمتر از 0.6). با اعمال یک آستانه روی این عدد، می توانید از ثبت این موارد به عنوان پلاک، جلوگیری کنید.

RECT* prc

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

تابع satpa_recognize_buffer

short	satpa_recognize_buffer(byte instance, char* bytes, int W, int H, int step, wchar_t* result, float* pcnf, RECT* prc)

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

پارامتر ها

پارامتر های instance، result، pcnf و prc همانند پارامترهای تابع satpa_recognize هستند. برای کسب اطلاعات در مورد این پارامتر ها به آن تابع مراجعه کنید.

char* bytes

پارامتر bytes، اشاره گری است به ابتدای پیکسل های تصویر در حافظه RAM که در سی شارپ با استفاده از تابع LockBits می توان به آن دسترسی پیدا کرد.

int W

عرض تصویر بر حسب پیکسل

int H

ارتفاع تصویر برحسب پیکسل

int step

عرض موثر تصویر بر حسب بایت : معمولا برای تصاویر رنگی، این پارامتر 3 برابر عرض تصویر است. ممکن است به دلیل مرتب سازی حافظه RAM، این عدد کمی بزرگتر از مقدار مذکور باشد. برای دسترسی به مقدار دقیق آن در سی شارپ از پارامتر stride تصویر استفاده کنید.

int step

عرض موثر تصویر بر حسب بایت : معمولا برای تصاویر رنگی، این پارامتر 3 برابر عرض تصویر است. ممکن است به دلیل مرتب سازی حافظه RAM، این عدد کمی بزرگتر از مقدار مذکور باشد. برای دسترسی به مقدار دقیق آن در سی شارپ از پارامتر stride تصویر استفاده کنید.

تابع satpa_recognize_stream

short	satpa_recognize_stream(byte instance, char* stream, int size, wchar_t* result, float* pcnf, RECT* prc)

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

پارامتر ها

پارامتر های instance، result، pcnf و prc همانند پارامترهای تابع satpa_recognize هستند. برای کسب اطلاعات در مورد این پارامتر ها به آن تابع مراجعه کنید.

char* stream

اشاره گر به ابتدای بافر فشرده تصویر

int size

اندازه بافر برحسب بایت

تابع satpa_recognizeROI

short	satpa_recognizeROI(byte instance, byte roi_idx, wchar_t* fn, wchar_t* result, float* pcnf, RECT* prc)

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

پارامتر roi_idx، شماره ناحیه مورد علاقه ای است که می خواهید تحلیل شود. برای اینکه ببینید چگونه می شود ROI ایجاد کرد، تابع satpa_add_ROI را ببینید.

تابع satpa_recognize_bufferROI

short	satpa_recognize_bufferROI(byte instance, byte roi_idx, char* bytes, int W, int H,int step, wchar_t* result,
float* pcnf, RECT* prc)

این تابع شبیه تابع قبلی است، با این تفاوت که به جای ارسال آدرس تصویر از حافظه سخت، بافر تصویر و اطلاعات مربوطه ارسال می شود. به نوعی ترکیب دو تابع satpa_recognizeROI و satpa_recognize_buffer است. پارامتر های این تابع هم قبلا در دو تابع مذکور، معرفی شده اند.

تابع satpa_recognize_mat

short	satpa_recognize_mat(byte instance, void* pMat, wchar_t* result, float* pcnf, RECT* prc)

این تابع تنها برای برنامه های میزبان C++ کارایی دارد. تفاوت این تابع با توابع recognize قبلی تنها در تصویر ورودی است که در اینجا از نوع cv::Mat* است. این تابع در سی شارپ و دلفی و سایر زبان ها، کاربرد ندارد.

تابع satpa_find_chars

void	satpa_find_chars(byte instance, char* bytes, int W, int H, int step, RECT roi, wchar_t* result, float* pcnf)

در صورتیکه مختصات مستطیل حاوی پلاک را به نحوی در اختیار دارید، می توانید به منظور تسریع در پردازش، به جای استفاده از توابع recognize که کل تصویر را جستجو می کند از این تابع استفاده کنید. پارامتر های این تابع، شبیه تابع satpa_recognize_buffer است، با این تفاوت که یک پارامتر اضافی roi (مستطیل حاوی پلاک) را هم دریافت می کند.

تابع satpa_get_ascii_result

void	satpa_get_ascii_result(wchar_t* result_fa, char* result_en)

نتیجه دریافتی از توابع recognize به صورت رشته فارسی یونیکد است. اگر رشته انگلیسی معادل را بخواهید می توانید از این تابع استفاده کنید.

پارامتر ها

wchar_t* result_fa

رشته فارسی دریافتی از کتابخانه (ورودی)

char* result_en

رشته انگلیسی معادل (به صورت اسکی) – این رشته باید در برنامه میزبان تخصیص حافظه داده شود.

جدول حروف و ارقام فارسی پلاک و معادل انگلیسی آن ها

برای یافتن معادل های فارسی و انگلیسی نویسه های پلاک ، از جدول زیر استفاده کنید (دقت کنید برای حرفاز از حرف ه استفاده شده است) :

حرف فارسی معادل انگلیسی
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
ا -Alef-
ب -B-
ج -Jim-
د -De-
ز -Z-
س -Sin-
ص -Sad-
ط -Ta-
ع -Ain-
ف -F-
ق -Gh-
ک -K-
ل -L-
م -M-
ن -N-
و -V-
ه -H-
ی -Y-
ژ (پلاک جانبازان و معلولین) -Zh-
D D
S S

تابع satpa_get_en_results

void	satpa_get_en_result(wchar_t* result_fa, wchar_t* result_en)

نتیجه دریافتی از توابع recognize به صورت رشته یونیکد فارسی است. اگر رشته یونیکد انگلیسی معادل را بخواهید می توانید از این تابع استفاده کنید.

پارامتر ها

wchar_t* result_fa

رشته فارسی دریافتی از کتابخانه (ورودی)

wchar_t* result_en

رشته انگلیسی معادل (به صورت یونیکد) – این رشته باید در برنامه میزبان تخصیص حافظه داده شود.

لیست توابع کتابخانه در حالت کار با ویدیو (نسخه 9)

توابعی که در بخش قبلی بررسی کردیم، شامل توابع عمومی و توابع مخصوص کار با تصویر بودند و همگی با پیشوند anpr_ شروع می شدند. در ادامه توابعی را معرفی می کنیم که مخصوص کار با ویدیو هستند. این توابع با vlpr شروع می شوند که مخفف Video License Plate Recognition است.

تابع satpa_start_grabbing

short satpa_start_grabbing(byte instance, string URL, byte interval_ms, HWND hwndDraw, byte take_shots, byte draw_method)

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

این تابع برای اتصال به دوربین، از کتابخانه OpenCV استفاده می کند و ممکن است در ارتباط با ویدیوهای با رزولوشن بالا (2 مگاپیکسل و بالاتر) که به صورت فشرده (h264) ارسال می شوند موفق عمل نکند. در این موارد از تابع satpa_start_grabbingVLC استفاده کنید.

پارامتر ها

byte instance

شماره شیء ای که از کتابخانه ساخته اید. اگر تنها یک شیء ساخته اید، این عبارت را صفر بگذارید.

نکته

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

string URL

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

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

byte interval_ms

پارامتر interval_ms فاصله بین دریافت دو فریم متوالی از دوربین را نشان می دهد. مثلا اگر می خواهید نرخ فریم دریافتی از دوربین 20 فریم در ثانیه باشد، این پارامتر را باید 50 میلی ثانیه بگذارید.

نکته

همچنین لازم است نرخ فریم تنظیمات داخلی دوربین مورد نظر نیز به مقدار مطلوب تغییر کند.

HWND hwndDraw

در صورتیکه می خواهید کتابخانه به طور مستقیم، عملیات نمایش ویدیو روی یک پنجره خاص (مثلا یک پنل) را انجام دهد، باید هندل آن پنجره را به کتابخانه ارسال کنید. در غیر این صورت باید با دریافت رویداد WM_NEW_FRAME خودتان عملیات ترسیم فریم روی پنجره مورد نظر را انجام دهید.

نکته

نمایش مستقیم ویدیو، نسبت به نمایش ویدیو در رویداد WM_NEW_FRAME حجم کمتری از پردازنده را مصرف می کند.

byte take_shots

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

دقت کنید که با این کار، نرخ فریم در ثانیه خیلی کم می شود (نوعا بین 1 تا 5 فریم).

byte draw_method

این پارامتر چهار حالت دارد:

DRAW_GDI : 0

DRAW_OPENGL : 1

DRAW_SDL : 2

DRAW_ON_HOST : 3

اگر مقدار صفر (DRAW_GDI) انتخاب شود، کتابخانه برای نقاشی کردن فریم روی پنجره از API ویندوز استفاده کند.

اگر مقدار یک (DRAW_OPENGL) انتخاب شود، کتابخانه برای نقاشی کردن فریم، از کتابخانه OpenGL استفاده می کند که باید کارت گرافیک میزبان از این قابلیت پشتیبانی کند. این گزینه معمولا مصرف پردازنده را کاهش می دهد.

نکته

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

اگر مقدار دو (DRAW_SDL) انتخاب شود، کتابخانه برای نقاشی کردن فریم، از کتابخانه SDL استفاده می کند که تا حدی شبیه OpenGL است.

اگر مقدار سه (DRAW_ON_HOST) انتخاب شود، کتابخانه ساتپا، فریم ها را مستقیما ترسیم نمی کند و تنها رویداد WM_NEW_FRAME را به میزبان ارسال می کند. برنامه میزبان (مثلا در سی شارپ) باید با دریافت این رویداد، نقاشی فریم را انجام دهد.

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

نکته

برای اینکه ببینید کدام روش نمایش ویدیو، بهترین کارایی را دارد، باید سه روش اول را تست کنید و برای یک دقیقه مصرف پردازنده را بررسی کنید. برای بررسی مصرف پردازنده باید Task Manager را باز کرده و مصرف پردازنده برنامه مورد نظر را رصد کنید. دقت کنید که فقط ویدیو را پخش کنید و از زدن دکمه پردازش بپرهیزید.

تابع satpa_start_grabbingVLC

short	satpa_start_grabbingVLC(byte instance, string URL, byte interval_ms, HWND hwndDraw, byte take_shots, byte direct_draw)

این تابع، دقیقا همانند تابع satpa_start_grabbing است با این تفاوت که برای اتصال به دوربین، از کتابخانه VLC استفاده می کند. در مورادی که اتصال به دوربین با تابع قبلی برقرار نمی شود یا مشکل دارد، از این تابع استفاده کنید.

هشدار

برای استفاده از توابعی که از کتابخانه VLC استفاده می کنند، حتما باید فایل های کتابخانه VLC (نسخه سازگار با کتابخانه ساتپا) در کنار ANPR.dll باشد وگرنه برنامه با خطای بحرانی بسته خواهد شد (موارد قرمز رنگ در تصویر زیر) :

تابع satpa_stop_grabbingVLC

short	satpa_stop_grabbingVLC(byte instance)

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

تابع satpa_pause_or_resume

short	satpa_pause_or_resume(byte instance, byte pause)

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

تابع satpa_get_frame_info

short	satpa_get_frame_info(byte instance, int* W, int* H, int* channels, int* step)

از این تابع برای دریافت اطلاعات تصاویر دریافت از دوربین شامل W (عرض) H (ارتفاع)، channels (تعداد کانال های تصویر) و step (عرض موثر تصویر بر حسب پیکسل) استفاده کنید. اگر این تابع موفق شود، کد صفر و در غیر این صورت کد غیر صفر برمی گرداند.

تابع satpa_get_frame

uchar* satpa_get_frame(byte instance)

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

تابع satpa_get_frame_number

uint satpa_get_frame_number(byte instance)

این تابع، شماره فریم جاری (تعداد فریم هایی که از ابتدای اتصال به دوربین دریافت شده است) را برمی گرداند.

تابع satpa_start_process

short	satpa_start_process(byte instance , bool plate_marker)

این تابع، پردازش ویدیو را به منظور یافتن پلاک ها شروع می کند. دقت کنید که قبل از فراخوانی این تابع، باید با استفاده از یکی از توابع satpa_start_grabbing یا satpa_start_grabbingVLC به دوربین وصل شده باشید. plate_marker : در صورتی که مقدار صحیح فرستاده شود پلاک ها توسط یک مارکر دنبال می شوند.

تابع satpa_stop_process

short	satpa_stop_process(byte instance)

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

تابع satpa_get_plate (نسخه 10)

short satpa_get_plate (byte instance, byte plate_idx, string result)

برای بدست آوردن اطلاعات پلاک تشخیص داده شده از این تابع استفاده می کنیم.

پارامتر ها

byte instance

شماره دوربین (یا شماره شیءای که از کتابخانه ساخته اید)

byte plate_idx

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

string result

اطلاعات پلاک در قالب یک رشته جیسان در اختیار شما قرار داده خواهد شد. کلاس اطلاعات پلاک به صورت زیر است .

public class SPlateResult
                                {
                                public int []plate_string_unicode_indices { get; set; }
                                public string plate_string { get; set; }
                                public int[] plate_english_string_unicode_indices { get; set; }
                                public string plate_english_string { get; set; }
                                public int plate_width { get; set; }
                                public int plate_height { get; set; }
                                public float confidence { get; set; }
                                public long plate_image { get; set; }
                                public long car_image { get; set; }
                                public IntPtr plate_image_pointer;
                                public IntPtr car_image_pointer;
                                public byte direction { get; set; }
                                public byte n_char { get; set; }
                                public byte n_letter { get; set; }
                                public byte count { get; set; }
                                public byte roi { get; set; }
                                public byte line_number { get; set; }
                                public byte is_english { get; set; }
                                public byte country { get; set; }
                                public void data_generation()
                                {
                                    for (int i = 0; i < plate_string_unicode_indices.Length; i++)
                                        plate_string = plate_string + Convert.ToChar(plate_string_unicode_indices[i]);
                                    for (int i = 0; i < plate_english_string_unicode_indices.Length; i++)
                                        plate_english_string = plate_english_string + Convert.ToChar(plate_english_string_unicode_indices[i]);
                                    plate_image_pointer = new System.IntPtr(plate_image);
                                    car_image_pointer = new System.IntPtr(car_image);
                                    }
                                };
                            
                        

در جدول زیر پارامتر های کلاس فوق توضیح داده شده اند :

متغیر توضیح
plate_string_unicode_indices از آن جایی که ممکن است در برخی زبان ها رشته جیسان یونیکد پشتیبانی نشود، به جای ارسال رشته پلاک، عدد یونیکد هر کاراکتر ارسال می شود. با فراخوانی تابع data_generation این اندیس ها بصورت رشته در متغیر plate_string ذخیر ه می شوند.
plate_string از آن جایی که ممکن است در برخی زبان ها رشته جیسان یونیکد پشتیبانی نشود، به جای ارسال رشته پلاک، عدد یونیکد هر کاراکتر ارسال می شود. با فراخوانی تابع data_generation این اندیس ها بصورت رشته در متغیر plate_string ذخیر ه می شوند.
plate_english_string_unicode_indices عدد یونیکد هر کاراکتر در رشته انگلیسی
plate_english_string با فراخوانی تابع data_generation رشته انگلیسی پلاک در این متغیر ذخیره خواهد شد.
plate_width عرض پلاک در تصویر، به پیکسل
plate_height ارتفاع پلاک در تصویر، به پیکسل
confidence ضریب اطمینان پلاک (عددی بین صفر و یک)
plate_image به منظور بدست آوردن تصویر پلاک از این اشارهگر استفاده میگردد. در ابتدا بصورت یک عدد ارسال می شود، پس از فراخوانی تابع data_generation بصورت یک اشاره گر در متغیر plate_image_pointer ذخیره می شود و قابل استفاده خواهد بود.
plate_image_pointer به منظور بدست آوردن تصویر پلاک از این اشارهگر استفاده میگردد. در ابتدا بصورت یک عدد ارسال می شود، پس از فراخوانی تابع data_generation بصورت یک اشاره گر در متغیر plate_image_pointer ذخیره می شود و قابل استفاده خواهد بود.
car_image به منظور بدست آوردن تصویر خودرو از این اشارهگر استفاده میگردد. در ابتدا بصورت ی ک عدد ارسال می شود، پس از فراخوانی تابع data_generation بصورت یک اشاره گر در متغیر car_image_pointer ذخیره می شود و قابل استفاده خواهد بود.
car_image_pointer به منظور بدست آوردن تصویر خودرو از این اشارهگر استفاده میگردد. در ابتدا بصورت ی ک عدد ارسال می شود، پس از فراخوانی تابع data_generation بصورت یک اشاره گر در متغیر car_image_pointer ذخیره می شود و قابل استفاده خواهد بود.
direction چناچه جهت حرکت خودرو را نیاز دارید از این پارامتر استفاده کنید. مقدار یک ورود، مقدار دو خروج و صفر نیز نامشخص می باشد.
n_char تعداد کل کاراکتر های تشخیص داده شده برای یک پلاک (برای پلاک استاندارد 8 و برای پلاک های منطقه آزاد 5 یا 7 است)
n_letter تعداد حروفی که در یک پلاک شناسایی شده است. برای پلاک استاندارد فقط یک حرف داریم
count رزرو
roi چنانچه ناحیه مورد علاقه فعال باشد اندیس ناحیه ای را که پلاک در آن شناسایی شده است را برمی گرداند. در غیر این صورت در نسخه های ما قبل از 8.88 این مقدار 0 و در نسخه های بعد از 8.88 این مقدار 4 خواهد بود.
line_number تعداد خطوط پلاک را مشخص می کند. به عنوان مثال پلاک های موتور دارای دو خط هستند
is_english در صورتی که پلاک شناسایی شده پلاک ی با نویسه های لاتین باشد این متغیر مقدار یک خواهد داشت
country در صورتی که کشور پلاک لاتین شناسایی شده ، تشخیص داده شود در این متغیر ذخیره خواهد شد
تابع data_generation پس از دریافت جیسان اطلاعات پلاک ، این تابع وظیفه پس پردازش اطلاعات و اماده سازی آن ها را دارد.

تابع anpr_get_plate (نسخه 9)

short anpr_get_plate (byte instance, byte plate_idx, SPlateResult* result)

برای بدست آوردن اطلاعات پلاک تشخیص داده شده از این تابع استفاده می کنیم.

پارامتر ها

byte instance

شماره دوربین (یا شماره شیءای که از کتابخانه ساخته اید)

byte plate_idx

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

SPlateResult* result

برای بدست آوردن اطلاعات پلاک مورد نظر از این ساختار استفاده می کنیم. اطلاعات متغییر های این ساختار در جدول زیر آورده شده است.

نام رویداد کاربرد آن
str رشته پلاک تشخیص داده شده به فارسی
cnf ضریب اطمینان پلاک(عددی بین صفر و یک)
rc مختصات مستطیل پلاک شناسایی شده در تصویر فعلی
img_car برای بدست آوردن تصویر خودرویی که پلاک آن شناسایی شده از این اشاره گر استفاده می گردد.
direction چناچه جهت حرکت خودرو را نیاز دارید از این پارامتر استفاده کنید. مقدار یک ورود، مقدار دو خروج و صفر نیز نامشخص می باشد.
n_char تعداد کل کاراکتر های تشخیص داده شده برای یک پلاک (برای پلاک استاندارد 8 و برای پلاک های منطقه آزاد 5 یا 7 است)
n_letter تعداد حروفی که در یک پلاک شناسایی شده است. برای پلاک استاندارد فقط یک حرف داریم
count رزرو
roi چنانچه ناحیه مورد علاقه فعال باشد اندیس ناحیه ای را که پلاک در آن شناسایی شده است را برمی گرداند. در غیر این صورت در نسخه های ما قبل از 8.88 این مقدار 0 و در نسخه های بعد از 8.88 این مقدار 4 خواهد بود.

تابع satpa_recognize_cur_frame

short	satpa_recognize_cur_frame(byte instance, wchar_t* str, RECT* rc, float* cnf)

این تابع، فریم جاری را شناسایی کرده و در صورت یافتن پلاک، نتیجه را بر می گرداند. پارامتر های این تابع، مشابه پارامتر های تابع satpa_recognize است.

راه اندازی سرویس ویندوزی

اگر قصد راه اندازی سرویس تحت ویندوز را دارید نسخه دمو سرویس را از شرکت دریافت کنید.

برای راه اندازی سرویس ابتدا محتویات نسخه 64 بیتی کتابخانه را کنار سرویس خود کپی کنید. سپس فایل هایی که دارای پسوند .mcs و .cfg هستند را در پوشه System32 ویندوز کپی کنید.

از آنجایی که در پروژه سرویس رابط کاربری نخواهیم داشت، در توابع satpa_start_grabbing و satpa_start_grabbingVLC شیوه رسم را DRAW_ON_HOST = 3 قرار دهید و هنگامی که رویداد فریم جدید را از سوی کتابخانه دریافت می کنید اقدامی در جهت نمایش تصویر انجام ندهید.

لیست تغییرات نام توابع در نسخه 10

لیست کامل تغییرات نام توابع در نسخه 10 کتابخانه تشخیص پلاک ساتپا را در ادامه مشاهده می کنید :

نسخه های 9 به قبل نسخه 10
anpr_create() satpa_create()
anpr_about() satpa_about()
anpr_set_event_callback() satpa_set_event_callback()
anpr_set_params() satpa_set_params()
anpr_add_ROI() satpa_add_ROI()
anpr_clear_ROIs() satpa_clear_ROIs()
anpr_recognize() satpa_recognize()
anpr_recognize_buffer() satpa_recognize_buffer()
anpr_recognize_stream() satpa_recognize_stream()
anpr_recognizeROI() satpa_recognizeROI()
anpr_recognize_bufferROI() satpa_recognize_bufferROI()
anpr_recognize_mat() satpa_recognize_mat()
anpr_find_chars() satpa_find_chars()
anpr_get_ascii_result() satpa_get_ascii_result()
anpr_get_en_result() satpa_get_en_result()
vlpr_start_grabbing() satpa_start_grabbing()
vlpr_start_grabbingVLC() satpa_start_grabbingVLC()
vlpr_stop_grabbingVLC() satpa_stop_grabbingVLC()
vlpr_pause_or_resume() satpa_pause_or_resume()
vlpr_get_frame_info() satpa_get_frame_info()
vlpr_get_frame() satpa_get_frame()
vlpr_get_frame_number() satpa_get_frame_number()
vlpr_start_process() satpa_start_process()
vlpr_stop_process() satpa_stop_process()
anpr_get_plate() satpa_get_plate()
vlpr_recognize_cur_frame() satpa_recognize_cur_frame()

تاریخچه بروزرسانی

10.1.5

دی 1402
  • بهبود تشخیص پلاک های نظامی
  • اضافه شدن متد های جدید اتصال به دوربین
  • رفع باگ های گزارش شده
  • رفع باگ کرش دمو سی شارپ
  • اپدیت از نسخه 10.1.0 به این نسخه نیازمند اضافه شدن تنظیمات جدید به کد است

نسخه 10.1.0

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

نسخه 10.0.5

دی 1401
  • حل مشکل تابع satpa_get_ascii_result
  • رفع مشکل گزارش شده برای دانگل

نسخه 10.0.0

آبان 1401
  • افزایش قابل ملاحظه دقت پلاک خوانی علی الخصوص برای پلاک های مخدوش
  • تغییر API و جایگزین شدن استراکچر ها با Json برای سهولت استفاده در زبان های مختلف
  • ادغام نسخه ایرانی و لاتین
  • امکان استفاده از GPU

نسخه 9.0.2.8

مرداد 1402
  • بهبود قفل نرم افزاری در برابر تغییرات جزئی سخت افزار
  • اپدیت ocx دانگل
  • نمایش تاریخ انقضا هارد کد نسخه های قفل نرم افزاری

نسخه 9.0.2.0

فروردین 1401
  • بهبود کیفیت پخش تصاویر در مد ترسیم توسط میزبان
  • رفع خطای نامعتبر بودن تصویر پلاک هنگام قطع ارتباط با دوربین

نسخه 9.0.1.8

فروردین 1401
  • رفع باگ

نسخه 9.0.1.7

دی 1400
  • رفع باگ

نسخه 9.0.1.3

مهر 1400
  • بهبود عملکرد

نسخه 9.0.1.0

مرداد 1400
  • رفع باگ های گزارش شده (در صورتی که تنظیمات و یا تعداد دوربین ها بگونه ای می بود که مصرف رم زیادی را در بر داشته باشد، به دلیل محدودیت های استفاده از رم در پردازش های 32 بیتی، باعث بروز خطا می شد. در این بروز رسانی سعی در کاهش مصرف رم شد تا نسخه 32 بیتی پایداری بیشتری داشته باشد. هم چنان محدودیت در استفاده از رم در نسخه 32 بیتی وجود دارد و توصیه اکید مخصوصا برای نسخه 9 به بعد استفاده از نسخه 64 بیتی کتابخانه است. )
  • کاهش مصرف رم
  • گزارش نوع پلاک ( موتور ، ماشین )

نسخه 9.0.0.3

خرداد 1400
  • رفع برخی ایرادات جزئی

نسخه 9.0.0.0

فروردین 1400
  • کاهش مصرف پردازنده ( تا پنجاه درصد کاهش در کاربرد های با ترافیک بالا )
  • افزایش نرخ فریم پردازش
  • افزایش دقت پلاک خوانی پلاک های مخدوش
  • تغییر الگوریتم گزارش پلاک با هدف کاهش پس پردازش توسط میزبان
  • اضافه شدن قابلیت جست و جوی خودکار دوربین های تحت شبکه و یافتن رشته اتصال آن ها
  • اضافه شدن قابلیت ضبط دوربین
  • تغییر قفل سخت افزار برای حل مشکل ناسازگاری با تنظیم Persian Language For Non Unicode در ویندوز 10
  • فراهم شدن امکان تعریف ناحیه مورد علاقه در تمامی روش های پخش تصویر
  • ارائه دمو جدید همراه با معرفی یک کلاس واسط به منظور سهولت بیش از پیش در کد نویسی و استفاده از کتابخانه
  • فراهم شدن امکان تعامل پیام درون برنامه ای با برنامه های ویندوز سرویس
  • نمایش تصویر با نرخ فریم برابر با نرخ فریم مبدا با هدف نمایش روان تصویر

نسخه 8.8.7

خرداد 1399
  • رفع مشکل ناپایداری رابط کاربری که در حالت های خاصی رخ می داد.

نسخه 8.8.6

اسفند 1398
  • عدم گزارش حرف “ن” از کلمه “ایران” .این مشکل زمانی رخ می داد که سایز پلاک بسیار بزرگتر از حد معمول بود و قسمت زیادی از عکس را در بر می گرفت.
  • اصلاح گزارش حرف الف در معادل انگلیسی. از “Aef” به “Alef”

نسخه 8.8.5

بهمن 1398
  • گزارش پلاک معلولین با حرف ژ (طبق استاندارد جدید پلیس راهور) بجای ستاره
  • بروز رسانی VLC به نسخه 2.2.8
  • رفع خطا های گزارش شده در پخش با VLC
  • رفع مشکل عدم گزارش رویداد End Of Video که در برخی مدل های دوربین های اکسیس رخ می داد
  • ارتقا موتور بازشناسی پلاک های مناطق آزاد
  • اضافه شدن قابلیت پخش ویدئو هایی با ابعاد غیر ستاندارد
  • ارتقا شیوه گزارش تصویر خودرو بمنظور تطابق کامل مختصات پلاک گزارش شده با تصویر گزارش شده از خودرو

نسخه 8.7.1

مرداد 1398
  • تغییر مکانیسم پردازش موازی و حذفِ تولید مکرر تردها که در شرایط خاصی منجر به خطای بحرانی می شد
  • استفاده بهینه از mutex به منظور جلوگیری از ایجاد شرایط مسابقه در دسترسی به منابع مشترک بین تردها
  • حذف نتیجه busy در فراخوانی تابع anpr_recognize
  • مدیریت بهتر استثنائات با استفاده از قابلیت های جدید C++ 11
  • اصلاح کد ارتباط با دانگل سخت افزاری
  • به روزرسانی نسخه OpenCV از 3.3 به 4.1
  • حذف برخی کدهای اضافی
  • رفع مشکل گزارش پلاک 5 تایی به جای پلاک 8 تایی در حالتی که پلاک استاندارد و پلاک مناطق آزاد فعال است

نسخه 8.6.0

خرداد 1398
  • اصلاح فرایند اتصال به دوربین
  • رفع مشکل هنگِ موقت در حالت استفاده از چند دوربین و قطع و وصل یکی از دوربین ها
  • به روزرسانی کامل کد سی شارپ در نسخه دو دوربینه

نسخه 8.5.1

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

نسخه 8.4.5

اسفند 1397
  • رفع باگی که سبب گزارش نشدن برخی پلاک ها می شد
  • بهبود کد سی شارپ

نسخه 8.4.3

بهمن 1397
  • اضافه شدن رویداد WM_CONNECTED به منظور تشخیص اینکه ارتباط با دوربین یا فایل ویدیویی برقرار شد و پرهیز از حلقه انتظار در سمت میزبان
  • اصلاح باگ ارتباط با دانگل
  • بهبود زمان بارگذاری کتابخانه

نسخه 8.4.1

دی 1397
  • اضافه کردن پارامترهای فیلترهای نرم کننده و ضرایب باینری سازی به کتابخانه
  • اضافه شدن تابع تعیین سطح دیباگ به منظور ذخیره سازی تصاویر باینری شده به منظور انتخاب پارامترهای ایده آل باینری سازی
  • یکی شدن دموی تک پلاکه و چند پلاکه در برنامه سی شارپ و ویژوال بیسیک
  • تبدیل شدن تب تنظیمات در دموی سی شارپ و VB.net به صورت جدول ویژگی (PropertyGrid)
  • جلوگیری از گزارش پلاک های تکراری در حالت چند پلاکه
  • رفع برخی باگ های دیده شده و گزارش شده در کتابخانه و دموی سی شارپ

نسخه 8.3.5

دی 1397
  • تغییرات گسترده به منظور یکی کردن نسخه های تک پلاکه و چند پلاکه
  • تغییر در مجوز به منظور تعیین تک پلاکه یا چند پلاکه بودن
  • بهبود ساختار توابع و الگوریتم ها و حذف کدهای اضافی

نسخه 8.0.0

مرداد 1397
  • تغییر الگوریتم یافتن محل پلاک به منظور بهبود سرعت
  • تغییر الگوریتم تشخیص ورود خودرو به منظور بهبود سرعت
  • اضافه شدن امکان پخش ویدیو توسط OpenGL و SDL به منظور کاهش مصرف پردازنده
  • بهبود مکانیسم تولید مجوزهای سخت افزاری و نرم افزاری
  • به روز رسانی کتابخانه OpenCV به نسخه 3.4.2
  • به روز رسانی کتابخانه libVLC به 2.2.8

نسخه های پیشین

نسخه 7.9.1

فروردین 1397
  • تغییر روش نمایش ویدیو و کاهش حدود ۶% مصرف پردازنده
  • تغییر تنظیمات انکودینگ ویدیو در وی ال سی به منظور صرفه جویی در مصرف پردازنده

نسخه 7.9.0

فروردین 1397
  • اضافه کردن تابع مدیریت رویدادها در کنار مکانیسم استفاده از پیام رسانی ویندوز. با این کار، اگر برنامه میزبان، تابع مدیریت رویداد را تعریف کند، نیازی به استفاده از تابع پیش فرض wndProc نیست.

نسخه 7.8.0

آذر 1396
  • تغییر مکانیسم مجوز به منظور امنیت بیشتر

نسخه 7.7.0

آذر 1396
  • اضافه شدن حروف جدید: ز - ف - ث - ش - S - D
  • به روز رسانی موتورهای بازشناسی
  • تغییر برنامه تولید مجوز به منظور پشتیبانی از حروف جدید

نسخه 7.5.0

آذر 1396
  • ارتقاء به نسخه ۳٫۳ کتابخانه OpenCV
  • تغییر کامپایلر کتابخانه به نسخه ۲۰۱۵ (به منظور استفاده از کتابخانه، باید فایل VC_redist.x86_2015.exe نصب شود)

نسخه 7.4.5

آذر 1396
  • اضافه شدن پارامتری به منظور پخش صدای دوربین: play_audio

نسخه 7.4.0

مرداد 1396
  • اضافه شدن تشخیص جهت ورود یا خروج خودرو

نسخه 7.3.5

تیر 1396
  • اضافه شدن پارامتر مدت زمان پیشگیری از تکرار پلاک

نسخه 7.3.0

تیر 1396
  • رفع باگ کوچک و بسیار مهم در تابع ProcessPlateResult که سبب دسترسی به اندیس -۱ از آرایه و هنگ کردن برنامه می شد

نسخه 7.2.0

فروردین 1396
  • اضافه شدن امکان خواندن پلاک مناطق آزاد
  • اضافه شدن امکان خواندن پلاک موتور
  • تغییر مکانیسم تولید قفل نرم افزاری به منظور پشتیبانی بهتر از محصولات در هنگام تغییر سخت افزار کامپیوتر

نسخه 7.1.0

بهمن 1395
  • بازنویسی کلی کد ها به منظور حذف متغیر های سراسری و بهبود ساختار کد از نظر شیء گرایی
  • اضافه شدن امکان اتصال همزمان به چند دوربین با قابلیت پلاک خوانی
  • رفع یک باگ دیده نشده در ماژول طبقه بند شبکه عصبی که به ندرت رخ می داد

نسخه 6.9.4

آذر 1395
  • اضافه شدن رقم صفر به موتور بازشناسی پلاک خوان
  • اضافه شدن پارامتر skew به منظور پشتیبانی از چرخش های بیش از ۱۵ درجه در صورت نیاز
  • کاهش مشکلات در در تشخیص حروف ت و ب
  • حذف فرمت اسکی در رشته نام در تابع LP_Recognize
  • امکان استفاده از قفل سخت افزاری Mini Tiny به جای قفل نرم افزاری در صورت تمایل

نسخه 6.8.0

شهریور 1395
  • رفع کامل مشکل حروف ب و پ
  • اضافه شدن رویداد CAM_NOT_FOUND برای زمانی که دوربین نیست یا ارتباط با آن برقرار نمی شود
  • اضافه شدن پارامتری برای پیش پردازش بهتر تصاویر نویزی مثل برخی تصاویر ناشی از برخی دوربینهای مادون قرمز

نسخه 6.7.0

اردیبهشت 1395
  • تغییر اساسی الگوریتم جلوگیری از گزارش پلاک تکراری. در این نسخه به هیچ وجه پلاک تکراری گزارش نمی شود
  • رفع مشکل در گزارش تصویر کامل خودرویی که پلاک آن شناسایی شده
  • بهینه سازی ساختار کد ++C و به روزرسانی نسخه OpenCV به ۳٫۰

نسخه 6.6.0

فروردین 1395
  • شروع کار روی نسخه اندروید با پیشرفت بیش از ۵۰%
  • اضافه شدن تکنیک بافر سازی نتایج در فریم های متوالی و اعلام تنها یک نتیجه به عنوان پلاک برای هر خودرو
  • رفع مشکل تابع StartGrabbingVLC در حالت Take Shots
  • اضافه شدن پارامترهای حداقل و حداکثر ابعاد ارقام به منظور تشخیص بهتر ارقام و حروف
  • اضافه شدن پارامتر resize threshold به منظور کاهش اندازه تصاویر بزرگ و به تبع آن کاهش زمان پردازش
  • رفع برخی اشکالات گزارش شده

نسخه 6.0.0

شهریور 1394
  • اصلاح کد ++C و رفع تمام warning های کامپایلر
  • اضافه شدن تکنیک بافر سازی نتایج در فریم های متوالی و اعلام تنها یک نتیجه به عنوان پلاک برای هر خودرو
  • رفع یک باگ مهم در بخش پردازش موازی کتابخانه که گاهی اوقات منجر به بسته شدن کتابخانه می شد
  • امکان تعریف ۴ ناحیه مورد علاقه به منظور پوشش چهار باند مختلف جاده
  • بهبود دقت پردازش برای پلاک های ریز و مخدوش
  • گزارش دادن فریم هایی که حاوی خودرو هستند ولی پلاک آن ها شناسایی نشده است
  • بهینه سازی فرایند نمایش فریمها در سی شارپ
  • ارتقاء نسخه OpenCV به ۲٫۴٫۱۰

نسخه 5.2.0

اردیبهشت 1394
  • بهبود موتورهای بازشناسی با آموزش نمونه های جدید
  • رفع مشکل اشتباه شدن حروف ب و پ و ت
  • کاهش خطا در تشخیص س و ص
  • کاهش خطا در تشخیص ۲ و ۳ و ۴
  • تغییر کد آموزشی سی شارپ به منظور نمایش سریع تر تصاویر
  • اضافه شدن کتابخانه VLC به منظور اتصال بهتر به برخی دوربین ها
  • امکان دریافت و پردازش همزمان تصویر از دو دوربین یا فایل ویدیویی

نسخه 4.3.7

اسفند 1393
  • اصلاحات جزئی
  • رفع برخی باگ های جزئی مانند بسته شدن برنامه در خین پردازش ویدیو دریافتی

نسخه 4.0.0

مهر 1393
  • تغییر الگوریتم تشخیص پلاک و استفاده از پردازش موازی که باعث افزایش سرعت پلاک خوانی می شود

نسخه 3.3.0

خرداد 1393
  • اضافه شدن قابلیت اتصال به دوربین آی پی و پردازش ویدیو دوربین ها

نسخه 2.8.5

اسفند 1392
  • رفع باگ های مختصر مربوط به نشت حافظه

نسخه 2.8.0

دی 1392
  • تغییرات در بخش کد نویسی
  • اضافه شدن قابلیت شناسایی پلاک های جانبازان و معلولین

نسخه 2.5.0

مهر 1392
  • رفع برخی مشکلات در شناسایی پلاک های قرمز و تاکسی ها
  • اضافه شدن قابلیت تشخیص حرف پ
  • کاهش زمان پلاک خوانی

نسخه 2.0.0

مرداد 1392
  • قابلیت شناسایی پلاک های دولتی و کشاورزی