หลักๆ ก็จะมี code อยู่ 2 ไฟล์ ไฟล์แรก
- “process_image.py” เป็นไฟล์ api program
- “test_call.py” เป็นไฟล์เอาไว้เทส เรียก api ไปที่ process_image.py ด้วย http request (URL : http://127.0.0.1:5000/process_image)
process_image.py
import numpy as np
from flask import Flask, request, jsonify
import easyocr
import cv2
from PIL import Image, ImageFont, ImageDraw
import io
import base64
app = Flask(__name__)
# OCR ภาษาไทย + อังกฤษ
reader = easyocr.Reader(['th', 'en'])
# ฟังก์ชันในการแปลง Base64 เป็นภาพ
def base64_to_image(base64_str):
    img_data = base64.b64decode(base64_str)
    img = Image.open(io.BytesIO(img_data))
    return np.array(img)
# ฟังก์ชันในการประมวลผลภาพ
def process_image(image):
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    # OCR บนภาพทั้งหมด
    results = reader.readtext(image)
    # แปลง OpenCV เป็น PIL เพื่อเขียนข้อความภาษาไทย
    image_pil = Image.fromarray(image_rgb)
    draw = ImageDraw.Draw(image_pil)
    # โหลดฟอนต์ภาษาไทย
    font_path = "content/Sarabun-Thin.ttf"  # ต้องอัปโหลดฟอนต์ .ttf ก่อน
    font = ImageFont.truetype(font_path, 32)
    # วาดกรอบและแสดงข้อความสำหรับป้ายทะเบียน
    for (bbox, text, prob) in results:
        (top_left, top_right, bottom_right, bottom_left) = bbox
        top_left = tuple(map(int, top_left))
        bottom_right = tuple(map(int, bottom_right))
        draw.rectangle([top_left, bottom_right], outline='green', width=2)
        draw.text(top_left, text, font=font, fill=(255, 0, 0))
    # ตรวจจับชื่อจังหวัด โดยตัดส่วนล่างของป้าย
    h, w = image.shape[:2]
    province_region = image[int(h*0.6):h, 0:w]  # ตัดส่วนล่าง 40% ของภาพ
    # OCR เฉพาะส่วนที่ตัด (ชื่อจังหวัด)
    province_results = reader.readtext(province_region)
    # วาดกรอบและแสดงข้อความสำหรับชื่อจังหวัด
    for (bbox, text, prob) in province_results:
        (top_left, top_right, bottom_right, bottom_left) = bbox
        top_left = tuple(map(int, top_left))
        bottom_right = tuple(map(int, bottom_right))
        draw.rectangle([top_left, bottom_right], outline='blue', width=2)
        draw.text(top_left, text, font=font, fill=(0, 0, 255))
    # แปลงภาพกลับเป็น base64
    buffered = io.BytesIO()
    image_pil.save(buffered, format="JPEG")
    img_base64 = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return img_base64, results, province_results
# API Endpoint สำหรับรับภาพ Base64
@app.route('/process_image', methods=['POST'])
def process_image_api():
    data = request.get_json()
    if 'image' not in data:
        return jsonify({'error': 'No image provided'}), 400
    # รับข้อมูล Base64 จาก request
    image_base64 = data['image']
    
    # แปลง Base64 เป็นภาพ
    image = base64_to_image(image_base64)
    # ประมวลผลภาพ
    processed_image, plate_results, province_results = process_image(image)
    # แปลงค่าจาก numpy.int32 เป็น int
    plate_results = [int(x[1]) if isinstance(x[1], np.int32) else x[1] for x in plate_results]
    province_results = [int(x[1]) if isinstance(x[1], np.int32) else x[1] for x in province_results]
    # ส่งค่าผ่าน jsonify
    return jsonify({
        # 'processed_image': processed_image,  # ส่งภาพที่ประมวลผลกลับใน Base64
        'plate_results': plate_results,      # ผลลัพธ์ของป้ายทะเบียน
        'province_results': province_results # ผลลัพธ์ของชื่อจังหวัด
    })
if __name__ == '__main__':
    app.run(debug=True)
test_call.py
import requests
import base64
# อ่านไฟล์รูปภาพและแปลงเป็น Base64
with open('img_test/1411832192-2014092407-o.jpg', 'rb') as img_file:
    img_base64 = base64.b64encode(img_file.read()).decode('utf-8')
# ส่ง POST request ไปยัง API
response = requests.post('http://127.0.0.1:5000/process_image', json={'image': img_base64})
# ตรวจสอบผลลัพธ์
print(response.json())
ติดตั้ง module จำเป็นที่ code program เรียกใช้ ด้วยคำสั่ง :
pip install opencv-python-headless easyocr matplotlib flask
ตัวอย่างผลลัพท์ที่ได้จาก API response จะมี 3 คีย์ให้เลือกใช้งาน
'processed_image' # ส่งภาพที่ประมวลผลกลับใน Base64 'plate_results' # ผลลัพธ์ของป้ายทะเบียน 'province_results' # ผลลัพธ์ของชื่อจังหวัด


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



















Leave a Reply