ระบบตรวจจับที่จอดรถ (Parking Space Detection)

ผู้เขียนบทความ : นายโชคชัย แจ่มน้อย COE#12

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

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

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

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

3. ขอบเขต

3.1 โปรแกรมสามารถตรวจจับที่จอดรถได้
3.1.1 เมื่อไม่มีรถจอดอยู่จะเป็นกรอบสี่เหลี่ยมสีเขียว
3.1.2 เมื่อมีรถจอดอยู่จะเป็นกรอบสี่เหลี่ยมสีแดง
3.2 โปรแกรมสามารถรับเข้าข้อมูลที่เป็นภาพและวิดีโอได้
3.3 โปรแกรมสามารถวาดพิกัดสีเหลี่ยมเพื่อบอกพิกัดในการตรวจจับที่จอดรถได้

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

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

5. ความรู้ที่เกี่ยวข้อง

5.1 โมดูล argparse

รูปแบบหนึ่งในการรันผ่านคอมมานด์ไลน์ที่นิยมใช้คือการเติมค่าอาร์กิวเมนต์ คือตัวแปรบางอย่างที่ต้องการลงไป ยกตัวอย่างเช่น ต้องการโปรแกรมที่รับค่าตัวแปรเป็นตัวเลข 2​ ตัวคือ x กับ y โดยเขียนแบบนี้

๛ python alpaka.py -x 3 -y 7

จากชุดคำสั่งข้างต้น จะหมายความว่ารันโปรแกรม alpaka.pyโดยให้ ค่า x เป็น 3 และค่า y เป็น 7 โปรแกรมในลักษณะแบบนี้สามารถเขียนได้โดยใช้ argparse ดังนี้

import argparse

p = argparse.ArgumentParser()
p.add_argument('-x')
p.add_argument('-y')
pa = p.parse_args()
print(pa)
print('x เป็น %s, y เป็น %s'%(pa.x,pa.y))

เมื่อทดสอบการรันโปรแกรม ผลลัพธ์เป็นดังนี้

๛ python alpaca.py -x 2 -y 4
Namespace(x='2', y='4')
x เป็น 2, y เป็น 4
๛ python alpaca.py -x 3 -y 7     
Namespace(x='3', y='7')
x เป็น 3, y เป็น 7

หมายเหตุ(เครื่องหมาย ๛ จะใช้แทนบรรทัดที่พิมพ์ ส่วนบรรทัดถัดมาคือผลลัพธ์ ดังตัวอย่างข้างต้น)

คำอธิบายวิธีการเขียนโดยสรุปมา ดังนี้
เริ่มแรก จะต้อง import โมดูล argparse เพื่อใช้และสร้างออบเจ็กต์ argparse.ArgumentParser ขึ้นมา ออบเจ็กต์นี้จะใช้เพื่อเป็นตัวกลางในการสร้างปรับแต่งการรันในคอมมานด์ไลน์ ต่อมานำออบเจ็กต์นี้มาใช้ โดยการใช้เมธอด .add_argument() จะเป็นการสร้างตัวแปรที่ต้องการรับจากคอมมานด์ไลน์ขึ้นมา จากนั้นใช้เมธอด .parse_args() จะได้ตัวออบเจ็กต์ Namespace ที่เก็บค่าตัวแปรที่รับมา และค่าตัวแปร จะถูกเก็บไว้ในแอตทริบิวต์ของออบเจ็กต์นั้นตามชื่อ สามารถนำมาใช้ในโปรแกรมได้ ชื่อตัวแปรสามารถตั้งชื่อเป็นอะไรก็ได้ แต่มีบางชื่อที่ห้ามใช้ เพราะไปไปซ้ำกับคำสั่งบางคำสั่ง เช่น -h หรือ –help เพราะนี่เป็นคำสั่งสำหรับแสดงคำอธิบายในการใช้

5.2 โมดูล yaml

YAML เป็นรูปแบบข้อมูลแบบอนุกรม (data serialization format) ออกแบบให้มนุษย์สามารถอ่านและโต้ตอบได้ด้วยภาษาสคริปต์ มีนามสกุลไฟล์เป็น .yaml, .yml
โดยมีรูปแบบดังนี้

object:
    attributes:
        - attr1
        - attr2
        - attr3
    methods: [ getter, setter ]

หากถูกแปลงออกมาเป็น python จะมีรูปแบบดังนี้

{'object': {'attributes': ['attr1', 'attr2', 'attr3'],
            'methods': ['getter', 'setter']}}

จะเห็นได้ว่า สามารถเข้าใจรูปแบบข้อมูล YAML ได้ไม่ยากนักและมีระเบียบมากกว่า ในการใช้งานรูปแบบข้อมูล YAML ใน Python นี้ ได้มีนักพัฒนาได้พัฒนาโมดูลที่ชื่อว่า PyYAML ใช้ License: MIT เป็นโมดูลสำหรับไว้แยกวิเคราะห์และ emitter สำหรับ YAML ใน Python
การใช้งาน PyYAML
ให้ทำการ import yaml เข้ามา
ตัวอย่างที่ 1 แปลงรูปแบบข้อมูล YAML ไปเป็นรูปแบบข้อมูลของ Python
ไฟล์ test.yaml

object:
attributes:
 - attr1
 - attr2
 - attr3
methods:
 - getter
 - setter

ไฟล์คำสั่ง 1.py

import yaml
import pprint
for project in 
yaml.load_all(open('test.yaml')):
    pprint.pprint(project)

เมื่อรัน python 1.py จะได้ผลลัพธ์
{‘attributes’: [‘attr1’, ‘attr2’, ‘attr3’],
 ‘methods’: [‘getter’, ‘setter’],
 ‘๏ปฟobject’: None}
ตัวอย่างที่ 2 แปลงกลับไปเป็น YAML ไม่เอารูปแบบ flow

import yaml 
mydata = {'object': {'attributes': ['attr1', 'attr2', 'attr3'],'methods': ['getter', 'setter']}}
print(yaml.dump(mydata))

ผลลัพธ์
object:
  attributes: [attr1, attr2, attr3]
  methods: [getter, setter]
ตัวอย่างที่ 3 แปลงกลับไปเป็น YAML รูปแบบ flow

import yaml 
mydata = {'object': {'attributes': ['attr1', 'attr2', 'attr3'],'methods': ['getter', 'setter']}}
print(yaml.dump(mydata, default_flow_style=False))

ผลลัพธ์
object:
  attributes:
  – attr1
  – attr2
  – attr3
  methods:
  – getter
  – setter

5.3 โมดูล Logging

Logging เป็น Built-in Package ที่มากับ Python ทำให้ผู้ใช้สามารถทำ Log ได้ง่ายขึ้น โดยเริ่มจากการ Import โมดูลเข้ามา ดังตัวอย่างด้านล่างนี้

import logging

เมื่อต้องการใช้งานจาก Logging Module ผู้ใช้จะสามารถใช้ Default Configuration ได้ คือ เมื่อสั่ง Log ออกมา จะแสดงผลออกมาทางหน้าจอ แต่ถ้าหากต้องการ Config มากกว่านั้น ผู้ใช้จำเป็นต้องสร้าง ออกเป็น Object โดยใช้ Code ดังต่อไปนี้

logger = logging.getLogger('my-app')

และสุดท้าย ก็จะสามารถ Log ด้วยการใส่ ข้อความที่ต้องการ โดยที่มีการแบ่ง Level ของการ Log ออกเป็น 5 Level ด้วยกัน ตามความร้ายแรง ดังนี้

  • CRITICAL เรียกได้จาก logger.critical(<content>)
  • ERROR เรียกได้จาก logger.error(<content>)
  • WARNING เรียกได้จาก logger.warning(<content>)
  • INFO เรียกได้จาก logger.info(<content>)
  • DEBUG เรียกได้จาก logger.debug(<content>)

หากต้องการให้โปรแกรมเขียนไปยังไฟล์ เราก็สามารถทำได้เช่นกันผ่านสิ่งที่เรียกว่า Handlers

5.3.1 Handlers

Handlers ทำหน้าที่ในการ Handle Log แล้ว Default Handlers ที่ใช้สำหรับในการแสดงผลบนหน้าจอ ชื่อ StreamHandler หากต้องการที่จะจัดการ Handlers เอง สามารถทำได้เช่นกัน เช่น อยากเขียน Log ลงไปใน File ด้วย

ตัวอย่างเช่น ต้องการจะให้เขียน Log ลงไปในไฟล์ด้วย ต้องใช้ Handlers ที่ทำงานนั้น ไม่ต้องเขียนเอง ให้ใช้ FileHandlers โดยจะรับ ค่า 4 ค่าเข้ามาคือ

FileHandler(filename, mode='a', encoding=None, delay=False)

สิ่งที่อยากเน้นย้ำ คือ ชื่อไฟล์ คือที่อยู่ของ Log File ที่ต้องการจะเขียน และ สุดท้ายคือ Delay ที่จะต้องใส่ Boolean ลงไปคือ ถ้าค่าเป็น True ตัว Log File มันจะเปิดเมื่อโปรแกรมต้องเขียน Log และ ถ้าเป็น False คือ ไฟล์จะถูกเปิดเมื่อ FileHandler นี้ถูกสร้างขึ้นมา

เมื่อได้ Handler ให้ใช้คำสั่งที่ชื่อว่า addHandler()

logger = logging.getLogger('my-app')
log.addHandler(logging.StreamHandler())
log.addHandler(logging.FileHandler('my_log.log'))

log.info('I am a log')

จาก Code ด้านบน จะเห็นว่า สามารถทำการเพิ่ม Handler เข้าไป 2 ตัวคือ SteamHandler สำหรับการแสดงผลที่หน้าจอ และ FileHandler สำหรับการอัด Log ใส่ลงไปในไฟล์ที่ชื่อว่า my_log.log

5.3.2 Formatter

หากต้องการใส่วันที่ หรือต้องการจัดให้มีความอ่านง่าย เดิมที อาจจะต้องเขียน Function เอง ให้มันจัดมาให้ แล้วยัดใส่ Logger ได้เลย แต่แน่นอนว่า เขาทำมาให้เราแล้วคือ Formatter ซึ่งมันอยู่ใน Handler นั่นแปลว่า ถ้าเรามี Handler สำหรับการแสดงออกหน้าจอ กับ ออกเป็นไฟล์ เราสามารถใช้ Formatter แยกกันได้ ตัวอย่างเช่น

s_handler = logging.StreamHandler()
s_handler.setFormatter(logging.Formatter('%(asctime) - %(levelname) | %(message)'))

logger.addHandler(s_handler)
logging.info('Connecting to Database')

ก่อนหน้านี้ หลาย ๆ คนอาจสงสัยว่า หากบอกว่า StreamHandler เป็น Default มาให้อยู่แล้ว ทำไมผู้ใช้ถึงยังเพิ่มเองได้อยู่ เพราะเราสามารถที่จะ Format Log ที่ออกบนหน้าจอได้ เลยต้องทำออกมาเป็นเช่นนี้ และกับ Handler อื่น ๆ ก็สามารถที่จะ Format ได้เหมือนกัน

จากตัวอย่างทำให้ Log ออกมาเป็น ตามด้านล่างนี้

2020-06-14 17:49:34,614 - INFO | Connecting to Database

ส่วน asctime, levelname และ message ที่เขียนลงไปก็คือ วันที่ และ Info ตรงที่เห็นจากใน Log สามารถดูเพิ่มเติมได้ใน Document 

5.4 โมดูล opencv (cv2)

opencv เป็นซอฟต์แวร์โอเพนซอร์ซที่เอาไว้ใช้จัดการรูปภาพ เริ่มพัฒนาขึ้นโดยบริษัทอินเทล (Intel) ในปี 1999 คำว่า opencv ย่อมาจาก open source computer vision ขอบเขตการใช้งานของ opencv ค่อนข้างกว้าง มีความสามารถหลากหลายหลากหลาย นอกจากรูปภาพธรรมดาแล้วยังใช้จัดการกับวีดีโอภาพเคลื่อนไหว อัลกอริธึมที่ใช้มีตั้งแต่แบบง่ายๆไปจนถึงระดับสูงซึ่งรวมถึงการใช้เทคนิคการเรียนรู้ของเครื่อง ด้วย opencv เขียนขึ้นจากภาษาซี แต่สามารถเรียกใช้ผ่านภาษาอื่นเช่น ไพธอน, จาวา, แมตแล็บ ได้ด้วย ใช้ได้ในระบบปฏิการหลากหลายทั้ง Windows, Linux, OS X, Android, iOS
opencv-python คือมอดูลในภาษาไพธอน ซึ่งใช้สำหรับเขียนโปรแกรมใช้งาน opencv ผ่านภาษาไพธอนได้ ตราสัญลักษณ์ของ opencv เป็นวงล้อสีแดงเขียวน้ำเงิน โดยด้านบนสีแดงเป็นสัญลักษณ์ของโอเพนซอร์ซ ส่วนสีเขียวทำเป็นตัว c สีน้ำเงินคล้ายตัว v

สำหรับไพธอนสามารถติดตั้งได้โดย

pip install opencv-python

เมื่อต้องการเรียกใช้ จะต้อง import ชื่อ cv2

import cv2

ตัวอย่างงานที่ทำได้ด้วย opencv

การจัดการกับรูปภาพ

  • แปลงสีภาพ
  • นำภาพมาย่อ ขยาย บิด หมุน พลิก ฯลฯ
  • ทำการแปลงสัณฐาน (morphology) ของรูปภาพ
  • คอนโวลูชันกับตัวกรอง
  • ค้นหาขอบหรือมุมในรูปภาพ
  • วิเคราะห์ฮิสโทแกรม
  • เชื่อมโยงภาพ
  • แบ่งเขตภาพ
  • หาเค้าโครงภาพ
  • ค้นหาสิ่งที่ต้องการภายในภาพ
  • ปรับแต่งภาพที่ถ่ายด้วยกล้อง
  • คืนภาพจากสามมิติกลับเป็นสองมิติ

การจัดการภาพเคลื่อนไหว

  • จับการเคลื่อนไหวของวัตถุ
  • วิเคราะห์แยกฉากหลัง
  • ออปติคัลโฟลว์ (optical flow)
  • อ่านเขียนวีดีโอ

การเรียนรู้ของเครื่อง

  • ตัวจำแนกแบบเบย์อย่างง่าย (naive Bayes classifier)
  • วิธีการเพื่อนบ้านใกล้สุด k ตัว (k nearest neighbors)
  • เครื่องเวกเตอร์ค้ำยัน (SVM)
  • ต้นไม้ตัดสินใจ (desicion tree)
  • ป่าสุ่ม (random forest)

สามารถศึกษาได้ใน document

5.5 โมดูล NumPy

เป็นโมดูลส่วนเสริมของภาษา Python สำหรับใช้คำนวณทางคณิตศาสตร์และวิทยาศาสตร์ โดยมีคำสั่งพร้อมใช้งานจำนวนมากมาย และโมดูลนี้สามารถสร้างข้อมูลชนิดอาร์เรย์ (ที่ภาษา Python ไม่มี) และคำนวณอาร์เรย์ของตัวเลข สตริงและวัตถุได้ครับ

โมดูล NumPy รองรับทั้ง Python 2 , Python 3 และใช้ License: BSD

คลังคำสั่ง NumPy
1. การสร้างอาร์เรย์
2. การเข้าถึง
3. การใช้งานทางคณิตศาสตร์ (element-wise)
4. การใช้งานด้วยฟังก์ชั่นเฉพาะ เช่น sum, mean, max, min การคูณเมทริกซ์ (dot operator)

การติดตั้งโมดูล NumPy
สามารถติดตั้งได้โดยใช้คำสั่ง pip: (ตรวจสอบการตั้งค่า c compiler กับ Python ให้เรียบร้อยก่อนติดตั้งครับ)

$ pip install numpy

สำหรับผู้ใช้ Windows สามารถโหลดไฟล์ .whl มาติดตั้งได้จาก http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

การใช้งาน

ในการใช้งานต้อง import NumPy เข้ามาครับ

import numpy as np

จะยกตัวอย่างข้อมูลชนิดอาร์เรย์กับ NumPy

ภาษา Python ไม่มีข้อมูลชนิดอาร์เรย์ สามารถใช้ list แทนได้ แต่หากใช้โมดูล NumPy เราจะสามารถใช้ข้อมูลชนิดอาร์เรย์ได้ดังนี้

>>> x = np.array([1,2,3])
>>> x
array([1, 2, 3])

ต่อไป คือ การสร้าง array เก็บข้อมูลระหว่าง 0 – 10

>>> x = np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

เมื่อนำ x ที่เก็บข้อมูลอาร์เรย์ของตัวเลข มาบวกกับ 10 และนำมาบวกกับตัวมันเอง

>>> x = np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> y = x + 10 # มาบวกกับ 10
>>> y
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> z = x + x # บวกกับตัวมันเอง
>>> z
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])

การเรียกใช้ข้อมูลจากอาร์เรย์ และแทนที่ข้อมูลในอาร์เรย์ได้ดังนี้

>>> x = np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> x[1]
1
>>> x[8]
8
>>> x[9]
9
>>> x[0] = 99
>>> x
array([99, 1, 2, 3, 4, 5, 6, 7, 8, 9])

และสามารถศึกษาเพิ่มเติมที่นี้

5.6 Hough Transform

เป็นเทคนิคยอดนิยมการแยกคุณลักษณะของเส้น สำหรับใช้ในการตรวจจับเส้น โดยมีขั้นตอนดังนี้

เริ่มจากการอ่านรูปภาพ

img = cv2.imread(filename='examples/hough_lines/p_lots.jpg')

แปลงเป็นภาพสีเทาเพื่อลดข้อมูลในรูปภาพ

gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)

และใช้คำสั่ง ให้Gaussian เบลอ เพื่อลบสิ่งรบกวนที่ไม่จำเป็นออกไปอีก

blur_gray = cv2.GaussianBlur(src=gray, ksize=(5, 5), sigmaX=0)

จากนั้น ตรวจจับขอบด้วย คำสั่ง Canny

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

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

ผังการทำงานของระบบ

วิธีการใช้งานโปรแกรม

ก่อนเริ่มต้นใช้งานโปรแกรมตรวจจับที่จอดรถ จะต้องนำเข้าชื่อข้อมูล รูปภาพ และวิดีโอ ที่ต้องการตรวจจับก่อน ดังตัวอย่างนี้

python main.py --image images/parking_lot_5.png --data data/coordinates_1.yml --video videos/parking_lot_5.mp4 --start-frame 400

จากนั้นก็ปรากฎหน้าต่างรูปที่เราต้องทำการวาดพิกัดเพื่อตรวจจับที่จอดรถ

ก็ทำการวาดพิกัดเป็นพื้นที่สี่เหลี่ยม ตามที่ผู้ใช้ต้องการ ในตัวอย่างจะวาดพิกัดไว้ทั้งหมด 3 ที่ด้วยกัน

หลังจากนั้นกด “Q” เพื่อสั่งให้โปรแกรมเริ่มทำงาน ในรูปจะเห็นว่าทั้ง 3 พื้นที่ยังเป็นสีเขียวเนื่องจากยังไม่มีรถมาจอดอยู่

แต่เมื่อมีรถมาจอดที่พิกัดที่ 1 สีก็จะเป็นสีแดง แสดงให้เห็นว่า ที่จอดรถตรงนี้ไม่ว่าง

และเมื่อรถถอยออกไปก็จะกลับมาเป็นสีเขียว แสดงให้เห็นว่าที่จอดรถตรงนี่ว่าง

การทดลอง

การทดลองที่ 1 ทดลองนำระบบตรวจจับที่จอดรถ ให้ทำงานโดยรับเข้าภาพและวิดีโอที่ถ่ายจากมุมด้านบน โดยทำการทดลองทั้งหมด 30 ครั้ง โดยตรวจจับพื้นที่ทั้งหมด 6 จุด

ผลการทดลองที่ได้

การทดลองที่ 2 ทดลองนำระบบตรวจจับที่จอดรถ ให้ทำงานโดยรับเข้าภาพและวิดีโอที่ถ่ายจากมุมเอียง โดยทำการทดลองทั้งหมด 30 ครั้ง โดยตรวจจับพื้นที่ทั้งหมด 6 จุด ระยะใกล้ – ไกล

ผลการทดลองที่ได้

การทดลองที่ 3 ทดลองนำระบบตรวจจับที่จอดรถ ให้ทำงานโดยรับเข้าภาพและวิดีโอที่ถ่ายจากมุมเอียง โดยทำการทดลองทั้งหมด 30 ครั้ง โดยตรวจจับพื้นที่ทั้งหมด 6 จุด ระยะใกล้

ผลการทดลองที่ได้

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

1.สรุปผล
โปรแกรมตรวจจับที่จอดรถสามารถทำงานได้ถูกต้องแม่นยำมาก ซึ่งความแม่นยำ หรือประสิทธิภาพที่โปรแกรมจะทำได้ จะมีส่วนที่ขึ้นอยู่ตัวผู้ใช้ด้วย ซึ่งจากการทดลองที่ 2 ที่นำเข้าวิดีโอมุมกล้องเอียง โดยตรวจจับในระยะที่ไกลขึ้น ทำให้การวาดพิกัดลำบาก ระบบจึงมีการทำงานที่ผิดพลาดตามไปด้วย จากการทดลอง พบว่าระบบสามารถทำงานได้อย่างประสิทธิภาพในมุมกล้องด้านบนและมุมเอียง ระยะใกล้ ซึ่งจะทำให้ผู้ใช้วาดพิกัดได้อย่างชัดเจน สังเกตได้จากการทดลองที่ 1 และที่ 3

2.ข้อเสนอแนะ
2.1 เชื่อมต่อเว็บแคมเข้ากับ Raspberry Pi และสามารถตรวจสอบที่จอดรถได้ที่บ้าน!
2.2 ประยุกต์และทดลองเพื่อตรวจจับบุคคลหรือวัตถุอื่น ๆ ที่น่าสนใจ

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

8.1 รหัสต้นฉบับ
orgarose.(2561). Parking Space Detection in OpenCV. สืบค้นเมื่อ 30 มกราคม 2564,
จาก https://olgarose.github.io/ParkingLot/

8.2 opencv
opencv-python เบื้องต้น บทที่ ๑: บทนำ
Hough Line Transform
OpenCV: Image Filtering
Canny
How to detect lines in OpenCV?
High-level GUI
Mouse as a Paint-Brush
open cv พื้นฐาน
เริ่มต้นทำวิดีโอด้วย OpenCV กับ Python
ขียนโปรแกรม Python รับภาพจากกล้องด้วย OpenCV
VideoCapture::get
Perspective Warping คืออะไร? | OpenCV และ Python
Python cv2.EVENT_LBUTTONDOWN Examples
opencv-python เบื้องต้น บทที่ ๕: การเติมรูปร่างต่างๆลงไปในภาพ
Learning the OpenCV and NumPy Image Coordinate Systems
opencv-python เบื้องต้น บทที่ ๑๓: การหาเส้นเค้าโครง
opencv-python เบื้องต้น บทที่ ๑๕: การวิเคราะห์องค์ประกอบของเส้นเค้าโครง
ฟังก์ชัน Drawing ใน OpenCV กับ Python
Drawing Functions
Flags for video I/O
Save Video from Opencv

8.3 argparse
การปรับแต่งการรัน python ผ่านคอมมานด์ไลน์โดยใช้มอดูล argparse
อาร์กิวเมนต์ใน Python
argparse — Parser for command-line options, arguments and sub-commands

8.4 Python
ทำความรู้จักกับภาษา python (9) : ฟังก์ชันการแปลงชนิดข้อมูลใน python
Input/output with files
python if name == main คืออะไร ?
การใช้งาน range ใน Python
List methods
Lists ในภาษา Python
รวม syntax พื้นฐานของภาษา Python ฉบับรวบรัด
คำสั่ง enumerate ใน Python

8.5 PyYAML
PyYAML yaml.load(input) Deprecation
ทำความรู้จัก YAML ไฟล์ นามสกุล .yml กับ Symfony Framework
PyYAML Documentation
ใช้รูปแบบข้อมูล YAML ใน Python

8.6 Logging
Log Level สำคัญไฉน
logging — Logging facility for Python
ฮาวทู Logging ไลค์อะโปร ใน Python
How To Use Logging in Python 3

8.7 Numpy
จับภาพวิดีโอจากกล้องด้วย Python
พื้นฐานการใช้ NumPy ใน Python 3


Share

You may also like...

Leave a Reply