โปรแกรมตรวจจับป้ายทะเบียนรถ

ผู้เขียนบทความ: นายกอมารุดดีน บูเก็ม

1. ความเป็นมา

ได้รับมอบหมายงานจากอาจารย์รายวิชาซึ่งเป็นรายวิชา ปฏิบัติการการโปรแกรมคอมพิวเตอร์ขั้นสูง ซึ่งอยู่ในหลักสูตร วิศวกรรมคอมพิวเตอร์ ระดับปริญญาตรี สาขาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเทคโนโลยีราชมงคลศรีวิชัย วิทยาเขต สงขลา ซึ่งอาจารย์รายวิชาให้แต่ละคนในคลาสคิดโครงงานย่อยขึ้นมาคนละหนึ่งโครงงานเป็นผลทำให้เกิดโปรแกรมนี้ขึ้นมาเนื่องจากผู้จัดทำมีความสนใจในเรื่องการอ่านตัวอักษรบนรูปภาพ จึงเกิดความคิดที่ว่า เราจะสามารถนำเรื่องที่เราสนใจไปใช้ประโยชน์อย่างไร จึงได้เกิดโปรแกรมอ่านป้ายทะเบียนรถขึ้น ผู้จัดทำหวังเป็นอย่างยิ่งว่าโปรแกรมนี้สามารถนำไปพัฒนา และใช้ประโยชน์ได้จริง และเป็นประโยชน์ต่อผู้ที่มาศึกษาต่อรวมไปถึงเป็นประโยชน์ต่อสังคมด้วยเช่นกัน

2.วัตถุประสงค์

2.1 เพื่อศึกษาหาความรู้ในการใช้ภาษา python
2.2 เพื่อที่จะทำให้โปรแกรมอ่านป้ายทะเบียนรถได้
2.3 เพื่อทำให้โครงงานสารมารถที่จะนำไปใช้จริงได้


3.ขอบเขต

3.1 สามารถอ่านป้ายทะเบียนรถ และแสดงผลออกมาเป็นตัวอักษรได้
3.2 ใช้ภาษา python ในการสร้างโปรแกรม


4. ประโยชน์ที่คาดว่าจะได้รับ

4.1 ได้รับความรู้จากการศึกษาขั้นตอนในการทำงานของโปรแกรม
4.2 สามารถที่จะนำตัวอักษรที่อยู้ในรูปภาพออกมาแสดงได้


5. ความรู้ที่เกี่ยวข้อง
5.1 ภาษา python
python เป็นภาษาระดับสูงที่ใช้สำหรับเขียนโปรแกรม ซึ่งในปัจจุบัน ภาษา python นั้นเป็นที่นิยมมาก เพราะมีความยืดหยุ่น เขียนงายอ่านง่ายยังสามารถเข้าใจได้ง่ายด้วยเช่นกัน การติดติดตั้งใชช้งานนั้นสามารถทำได้ง่ายตามขั้นตอนจาก Link อ้างอิงด้านล่าง
5.2 open cv
open cv  เป็นซอฟต์แวร์โอเพนซอร์ซที่เราไว้ใช้จัดการรูปภาพ ซึ่งมีความสามารถหลากหลายนอกจากจะสามารถจัดการรูปภาพได้แล้วยังสามารถที่จัดการกับภาพเคลื่อนไหว หรือวีดิโอได้ด้วย ซึ่งในโปรแกรมนี้จะใช้ open cv ร่วมกับ ภาษา python เพื่อใช้ในการหาขอบ และปรับแต่งความคมชัดของรูปภาพ
5.3 numpy
numpy เป็นมอดูลที่ใช้คำนวณทางคณิตศาสตร์ที่อยู่ในรูปแบบของอาเรย์ ซึ่งในโปรแกรมนี้จะใช้ numpy ในการหาตำแหน่งของเส้นขอบของรูปภาพ
5.4 Tesseract หรือ OCR
Tesseract เป็นซอฟต์แวร์ที่ช่วยในการแปลงข้อความที่อยู่บนรูปภาพที่มนุษย์เข้าใจ ออกมาเป็นข้อความที่คอมพิวเตอร์เข้าใจ หรื่อที่เรียกว่า OCR การติดตั้งและการใช้งานนั้นสามารถทำได้ง่ายตามข้อมูลอ้างอิงด้านล่าง
การเปรียบเทียบการใช้โปรแกรม Tesseract กับระบบอื่น

ใช้โปรแกรมตรวจจับป้ายทะเบียนรถที่ได้เขียนขึ้นในการรันโปรแกรม
OUTPUT ที่ได้จากการใช้โปรแกรม Tesseract ซึ่งการใช้ Tesseract นั้นจะต้องมีการปรับความละเอียดของภาพให้ละเอียดที่สุดเท่าที่จะทำได้ OUTPUT ที่ออกมาจะมีความถูกต้องเป็นอย่างมาก กล่าวได้คือ ยิ่งรูปภาพมีความคมชัดก็จะมีความถูกต้องมากตามไปด้วย
ที่มาของรูปภาพ กูเกิลเปิด Cloud Vision API สำหรับแยกแยะรูปภาพผ่านกลุ่มเมฆ ใช้เอนจินเดียวกับ Google Photos | Blognone
รูปภาพนี้เป็นการใช้ Cloud Vision API ซึ่งเป็นบริการของ Google


5.5 matplotlib
matplotlib เป็นมอดูลสำหรับวาดกราฟที่ใช้งานได้หลากหลายยืดหยุ่น และยังทำความเข้าใจได้ โดยส่วนใหญ่จะใช้ควบคู่กับ numpy ทำให้ประสิทธิภาพในการทำงานสูง
5.6 image processing
image processing นั้นเป็นการจักการเกี่ยวกับรูปภาพ เกี่ยวกับการนำรูปภาพที่ที่มนุษย์เห็นด้วยตานำไปวิเคราะห์ประมวลผลภาพให้เป็นรูปแบบดิจิทัลด้วยคอมพิวเตอร์เพื่อที่จะให้ได้ผลลัพธ์ตามความต้องการของผู้ใช้
5.7 Anaconda
Anaconda เป็นโอเพนซอร์ดที่ช่วยในการพัฒนาโปรแกรมทางด้าน data science และ machine learning ได้ง่ายขึ้น โดยมีการรวยรวมเครื่องมีต่าง ๆ ที่ใช้ในการจัดการสภาพแวดล้อมในการเขียนโปรแกรมให้ใช้งานได้ตามที่ต้อวการ

#โค้ด
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pytesseract
from PIL import Image, ImageGrab
pytesseract.pytesseract.tesseract_txt = r'C:\Program Files\Tesseract-OCR\tesseract'
#print(pytesseract.image_to_string(r'C:\Users\Deen\Desktop\testocr\tess.png'))

def convertImage(image): #ฟังก์แปลงค่าสี
    gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY) #แปลงภาพเป็นเกรย์สเกล
    blur = cv2.GaussianBlur(gray,(5,5),0) #การเลอภาพ
    canny = cv2.Canny(blur,100,200) #ฟังก์แปรงภาพเดป็นขาว-ดำ
    return canny 

img = cv2.imread("deen6.jpg") #ส่งภาพไปยังฟังก์ชั่นก่อนหน้า
processed_img = convertImage(img)
original_img = img.copy() #สร้างตัวแปรเพื่อที่จะไปตัด

contour_img = processed_img.copy() #การกอปปี้ภาพ

contours, heirarchy = cv2.findContours(contour_img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) #contour การหาเส็นคอบ บรรทัดการหา
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10] #การ sort contour แค่ 10 ตัวที่สมบูรที่สุด

for contour in contours: #การแตกcontour 
    p = cv2.arcLength(contour,True)
    approx = cv2.approxPolyDP(contour,0.02*p,True) #การมองให้มันเป็นมุม

    if len(approx) == 4: #ถ้าcontour ที่แตกออกมี 4 มุมจะเข้าอีฟนี้
        
        x,y,w,h = cv2.boundingRect(contour) #การแตกcontour ค่าเป็น แกน x y 
        license_img = original_img[y:y+h,x:x+w] #เป็นการตัดรูปที่อยู่ในกรอบ
        cv2.namedWindow("License Detected : ", cv2.WINDOW_NORMAL)
        cv2.imshow("License Detected : ",license_img) #โชว์รูปที่ถูกตัด
        cv2.drawContours(img, [contour],-1,(0,255,255),3) #การวาด contour 
        gg=pytesseract.image_to_string(license_img, lang='tha+eng')
        print(gg)

cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
cv2.imshow("Image",img) #โชว์รูป
cv2.waitKey(0)


6.ผลการดำเนินงาน

เป็นการค้นหาป้ายทะเบียนว่าป้ายทะเบียนอยู่จุดไหนของรูปภาพ
เป็นการเอาตัวอัหษรที่อยู่ในป้าบทะเบียที่ได้ตัดออกมา จะเห็นได้ว่าการแสดงผลออกมานั้นไม่ได้ถูกต้อง 100% เนื่องจากความสามารถของผู้ที่ได้ทำการศึกษาในตอนนี้มีไม่มากพอ

แผนผังการทำงานของโปรแกรม


7.สรุปผลและข้อเสนอแนะ

สรุป
การทำงานของโปรแกรมนั้นมีความถูกตองในการแสดงผลถึง 80 % เนื่องจากเป็นการทำโปรแกรมที่ไม่ได้ผ่านการจดจำข้อมูลที่มากนัก จึงทำให้การประมวลผลของโปรแกรมมีความผิดพลาดอยู่พอสมควร
ข้อเสนอแนะ
โปรแกรมนี้ยังสามารถที่จะพัฒนาาต่อได้อีกมาก ไม่ว่าจะเป็นเรื่องความถูกต้องในการแสดงผล และรูปแบบการแสดงผล โปรแกรมนี้เป็นโปรแกรมที่ไม่มีค้าใช้จ่ายในการสร้างเลย แต่ถ้าหากใครลงทุนสักนิดเพื่อที่จะใช้บริการของ Google ก็สามารถทำได้เช่นเดียวกัน


8.ข้อมูลอ้างอิง

  1. การติดตั้ง Tesseract OCR และความรู้เรื่อง Tesseract
    https://medium.com/@navapat.tpb/python-3-%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B8%B1%E0%B9%89%E0%B8%87%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-tesseract-ocr-%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A-window-%E0%B9%80%E0%B8%9E%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%AA%E0%B8%81%E0%B8%B1%E0%B8%94%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%88%E0%B8%B2%E0%B8%81%E0%B8%A0%E0%B8%B2%E0%B8%9E-734dae2fb4d3

    https://ichi.pro/th/thakar-cdca-xakkhra-dwy-saeng-dwy-python-laea-pytesseract-doy-chi-anaconda-83554812208991

    https://medium.com/@warapetch.rpvs/%E0%B8%97%E0%B8%94%E0%B8%AA%E0%B8%AD%E0%B8%9A-tesseract-ocr-%E0%B8%95%E0%B8%AD%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88-1-87462a556404

    https://ichi.pro/th/withi-kar-yaek-khxkhwam-cak-rupphaph-dwy-python-241461048001323

2. วิธีการติดตั้ง python โดยใช้ Anaconda python ที่ใช้คือ 3.9
https://towardsdatascience.com/manage-your-python-virtual-environment-with-conda-a0d2934d5195

3. การใช้ pip install ใน Anaconda ใช้ pip ติดตั้ง packages ใน Python | by stackpython | Medium

4. ความรู้เรื่อง opencv opencv-python เบื้องต้น บทที่ ๑: บทนำ :: บล็อกของ phyblas ;囧; いつか見えた空 ~ φυβλαςのブログ (hinaboshi.com)

5. ความรู้เรื่อง numpy เริ่มต้นกับ NumPy ~ Python 3 (wannaphong.com)

6. ความรู้เรื่อง matplotlib  numpy & matplotlib เบื้องต้น บทที่ ๕: การวาดกราฟเบื้องต้น :: บล็อกของ phyblas ;囧; いつか見えた空 ~ φυβλαςのブログ (hinaboshi.com)

Share

You may also like...

1 Response

  1. User Avatar สันติ สถิตวรรธนะ says:

    เพื่มเติมเนื้อหาเรื่อง Tesseract ให้เห็นถึงการนำมาใช้งานและมีการเปรียบเทียบประสิทธิภาพกับระบบอื่น

Leave a Reply