کیوآرکد (QR code) : آشنایی، ساخت و رمزگشایی

نویسندگان: نرگس منتظری، مهدی کریمی، بهار دیبایی‌نیا، و پرتو سبزواری

تا حالا حساب واتس‌اپتون را روی لپ‌تاپ یا کامپیوتر شخصی‌تون باز کردید؟ فکر کردید که چطوری وقتی این کار را انجام می‌دهید نرم افزار واتس‌اپ هویتتون را تأیید می‌کنه؟ یا تا حالا شده سوار تاکسی بشید و پول خرد همراهتون نباشه؟

و یا توی رستوران برای جلوگیری از انتقال آلودگی نخواهید از منوی کاغذی استفاده کنید؟ تا به حال فکر کردید چطوری می‌توانیم با ماشین‌ها صحبت کنیم و اطلاعات‌مان را به آن‌ها منتقل کنیم؟

یک راهکار مشترک برای همه این مشکلات QR codeها هستند.

qr code

QR code چیست؟

کیوآرکد‌ها یا (Quick Response code) به معنی رمزینه پاسخ سریع در سال ۱۹۹۴ توسط شرکت خودروسازی تویوتا ژاپن اختراع و مورد استفاده قرار گرفتند. نیاز به نوعی رمز که محتوا آن با سرعت زیاد رمزگشایی شود، انگیزه اصلی این شرکت برای سرمایه‌گذاری در تحقیق و اختراع و توسعه این نوع رمز بوده است.

این رمزینه‌ها در واقع بارکدهای دوبعدی هستند که به دلیل قابلیت ذخیره سازی ۲۰۰ برابر بیشتر از بارکدها و خوانده شدن آنها توسط ماشین‌ها محبوبیت زیادی پیدا کرده‌اند. آن‌ها می‌توانند مطالب مختلفی مانند نام، ایمیل، آدرس سایت، کد محصول، توضیحات و … را رمز و به یک تصویر مانند شکل زیر تبدیل کنند.

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

همچنین QR codeها در زمینه‌های مختلف علمی مانند رباتیک نیز کاربرد دارند.

به طور مثال از کاربرد QR codeها می توانیم به هدایت ربات‌ها اشاره کنیم که یکی از مسایل خیلی مهم در رباتیک است. در این زمینه برای اینکه ربات از مبدأ معینی به مقصد معینی برسد مکان‌های مختلف را برچسب می‌زنند که ربات در هر یک از مکان‌ها با دوربین‌های خود QR codeها را اسکن می‌کند و مکان فعلی‌اش را تشخیص می‌دهد.

QR codeهایی که از رمزشدن اطلاعات ما بدست می‌آیند دارای بخش‌های مختلفی هستند:

  1. سه مربع بزرگ درسه گوشه QR code به منظور تراز تصویر عمل می‌کنند به همین دلیل با چرخش QR codeها در هر جهتی نیز کماکان می‌توان  اطلاعات موجود در آن‌ها را خواند (اسکن کرد) و این مورد اثری در استخراج داده‌های موجود در آن‌ها ندارد. به طور مثال در شکل زیر تمامی QR codeها به ما اطلاعات یکسانی می‌دهند.
  2. در همه QR codeها بین سه مربع بزرگ دو خط قرار دارد که به صورت یک در میان سیاه و سفید هستند.
  3. خواندن اطلاعات در QR codeها از گوشه پایین سمت راست و از خانه Enc که در شکل زیر مشخص شده است آغاز می‌شود. (محتوای داخل خانه Enc برای مشخص کردن چگونگی رمز شدن اطلاعات در QR codeها است.)
  4. قسمت بعدی که در QR code خوانده می‌شود (مستطیل Len در شکل زیر) دربرگیرنده اندازه مطالب رمزشده در QR code به صورت باینری است. اگر با اعداد باینری آشنایی ندارید حتماً به خواندنی به دنیای صفر و یک خوش آمدید نگاهی بیندازید.
  5. سپس به ترتیب مشخص شده در عکس زیر، مطالب QR code به اندازه طول مطالب که در قسمت قبل مشخص شده است خوانده می‌شوند و پایان آن‌ها در QR code با خانه End مشخص می‌شود.
  6. در آخر پس از خوانده‌شدن اطلاعات رمزشده در QR code قسمت‌های مربوط به error correction قرار دارد (مستطیل‌های E1 تا E7 در شکل زیر). این بخش قابلیت تصحیح خطا و امکان بازیابی داده‌ها را حتی پس از تحریف، کثیفی یا آسیب‌دیدگی فراهم می‌کند. از این رو، QR Code حتی زمانی که بخشی از آن برداشته می‌شود، آسیب می‌بیند یا حتی با انگشت پنهان می‌شود، عملکرد خود را ادامه می‌دهد.

 

 

چگونه QR code بسازیم؟

برای ساخت QR code با پایتون اول ماژول qrcode را با زدن دستور زیر در محیط cmd نصب می‌کنیم. (اگر با نصب ماژول‌ها آشنا نیستید می‌توانید راه نصب ماژول را در این خواندنی ببینید.)

pip install qrcode

در ادامه برای ساخت QR code به روش ساده می‌توانیم از دستورات زیر استفاده کنیم:

ولی اگر بخواهیم QR code را با جزئیات بیشتر و روشی پیشرفته‌تر بسازیم می‌توانیم با استفاده از دستور QRcode مانند زیر این کار را انجام دهیم.

که توضیحات هر یک از پارامترهای بالا به صورت زیر می‌باشد:

  • version: یک عدد صحیح از 1 تا 40 است که اندازه QR Code را کنترل می‌کند. (کوچکترین نسخه (version = 1) جدول 21×21 است و نسخه آخر (version = 40) جدول 177×177 است)

  • error_correction: همان‌طور که در قسمت قبل گفته‌ شد، این بخش برای بازیابی اطلاعات در QR code است که به 4 سطح تصحیح خطا تقسیم می‌شود:
      1.سطح L: تا ٪7 قابلیت اصلاح خطا
      2.سطح M: تا ٪15 قابلیت اصلاح خطا
      3.سطح Q: تا ٪25 قابلیت اصلاح خطا
      4.سطح H: تا ٪30 قابلیت اصلاح خطا

    بالابردن سطح، تصحیح خطا را بهبود می‌بخشد. اما باید توجه داشت که این امر باعث متراکم‌شدن QR code نیز می‌شود.

  • box_size: کنترل می‌کند که هر QR code چند پیکسل باشد.
  • border: ضخامت حاشیه QR code را مشخص می کند که در حالت پیش فرض مساوی 4 قرار دارد.
  • ( )fit = True: در دستور make تضمین می‌کند که از کل QR Code استفاده می‌شود، حتی اگر داده‌های ورودی ما مقدار کمی باشد.
  • fill_color و back_color: در دستور make_image رنگ‌های QR code را مشخص می کنند که در حالت استاندارد این رنگ‌ها سفید و سیاه هستند.

به همین راحتی الان کافی است برویم به آدرسی که فایل برنامه‌مان را در آن‌جا ذخیره کرده‌ایم و QR codeمان را ببینیم.

چگونه QR code را اسکن کنیم؟

برای اطمینان می‌توانیم QR code ساخته‌شده را با استفاده از نرم‌افزارها و سایت‌های مختلف مثل این‌ سایت امتحان کنیم ولی احتمالاً دوست دارید مانند قسمت قبل خودتان برنامه‌ای با پایتون بنویسید و QR code را رمزگشایی کنید.

برای این کار از ماژول cv2 استفاده می‌کنیم و در ابتدا مثل همیشه باید این ماژول را با زدن دستور زیر در محیط cmd نصب کنیم:

pip install opencv-python

سپس آن را صدا می‌زنیم و از دستورات زیر استفاده می‌کنیم.

در این کد ابتدا یک detector را مقداردهی می‌کنیم و سپس در خط سوم فایل QRcode.jpg که عکس QR code مورد نظر ماست را خوانده و آن را رمزگشایی می‌کنیم. این دستور به ما سه خروجی می‌دهد.

  • data: همان متن رمزشده مورد نظر می‌باشد. (خروجی اصلی)
  • point: آرایه خروجی راس‌های چهارضلعی QR code می‌‌باشد که اگر قادر به پیدا کردن QR code نباشد آرایه خالی برمی‌گرداند.
  • straight_qrcode: یک تصویر خروجی حاوی QR code اصلاح‌شده و باینری شده است.

در پایان برنامه، متن رمزشده را با دستور print چاپ می کنیم.

دیدیم که با QR codeها می‌توانیم اطلاعات زیادی را به صورت تصویر درآورده و آن‌ها را با کمک ماشین‌ها رمزگشایی کنیم و بخوانیم که در همه زمینه‌ها کاربرد بسیاری دارند و می‌توانند به ما کمک کنند.

در ادامه با مطالبی که گفته‌شد ممکن است شما QR codeهایی دیده باشید که یک تصویر مانند لوگو شرکت ها قسمتی از آن را اشغال کرده باشد به نظرتان چطور می‌توان این QR codeها را رمزگشایی کرد؟

درآخر اگر در قسمتی از متن ابهامی دارید حتما آن را در پایین این متن برای ما بنویسید.


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