การเขียนโปรแกรม Python เพื่อใช้งานกล้อง Web Cam เบื้องต้น


Web Cam เป็นอุปกรณ์หนึ่งที่มีประโยชน์มากในการทำโครงงาน โดยเฉพาะกับคอมพิวเตอร์ขนาดเล็กเช่น Raspberry Pi ซึ่งสามารถนำไปประยุกต์ทำอุปกรณ์อัตโนมัติและหุ่นยนต์ได้มากมาก บทความนี้จะนำเสนอวิธีการเขียนโปรแกรม Python อย่างง่ายเพื่อใช้งาน Web Cam

อุปกรณ์ที่ต้องใช้

  1. USB Web Cam – หากใช้กับ Raspberry Pi ก็ต้องใช้รุ่นที่ Raspberry Pi สนับสนุน (ดูรายการได้ที่นี่) บทความนี้ใช้กล้องของ Logitech ราคาประหยัดรุ่น C110 ซึ่งมีความละเอียดสูงสุด  640×480 จุด
  2. Raspberry Pi – หรือจะใช้คอมพิวเตอร์ทั่วไปที่ติดตั้ง Python ก็ได้ บทความนี้ทดสอบกับระบบปฏิบัติการ Linux เป็นหลัก แต่ก็น่าจะใช้งานได้บนระบบปฏิบัติการอื่นเช่นกัน

ติดตั้งโปรแกรมที่จำเป็น

บทความนี้ใช้ OpenCV เป็นเครื่องมือหลักในการติดต่อกับ Web Cam เนื่องจากมีความสามารถสูงและใช้งานได้ง่ายมาก OpenCV เป็นเครื่องมือที่ได้รับความนิยมสูง มีแหล่งอ้างอิงในอินเตอร์เน็ตมากมาย การติดตั้ง OpenCV ให้เรียกใช้คำสั่งต่อไปนี้จาก terminal

sudo apt-get install  python-opencv

อย่าลืมว่าขณะเรียกใช้คำสั่งติดตั้งโปรแกรมนี้ Raspberry Pi จะต้องต่ออินเตอร์เน็ตอยู่ถึงจะไปดึงข้อมูลมาติดตั้งได้

ทดลองติดต่อกับ Web Cam

โปรแกรมต่อไปนี้จะดึงภาพจาก Web Cam และวนแสดงภาพขึ้นบนจอ ขนาดของภาพที่กำหนดไว้คือ 320×240 จุด หากเพิ่มค่านี้ขนาดภาพก็จะโตขึ้น แต่กล้อง Web Cam จะต้องสนับสนุนความละเอียดที่กำหนดด้วย ยิ่งภาพมีขนาดใหญ่โปรแกรมก็จะทำงานช้าลง ดังนั้นควรพิจารณาเลือกความละเอียดให้เหมาะสมกับงาน

โปรแกรมนี้จะตรวจรับค่าจากคีย์บอร์ดด้วย โดยเมื่อต้องการจบการทำงานให้กดปุ่ม ‘q’

อย่าลืมว่าจะต้องเรียกใช้โปรแกรมนี้จาก graphics terminal ไม่ใช่จาก text terminal เพราะมีการแสดงผลภาพ และต้องมีระบบ GUI รองรับ

import cv

# ---------------------------
# Setup the webcam and font
# ---------------------------

# define image size
imageWidth = 320
imageHeight = 240

# create a window object
cv.NamedWindow("window1", cv.CV_WINDOW_AUTOSIZE)
camera_index = 0

# create a camera object
capture = cv.CaptureFromCAM(camera_index)

# set capture width and height
cv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FRAME_WIDTH, imageWidth );
cv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FRAME_HEIGHT, imageHeight );

while True:

    # get image from webcam
    frame = cv.QueryFrame(capture)

    # -----------------------------
    # show the image on the screen
    # -----------------------------
    cv.ShowImage("window1", frame)

    # -----------------------
    # wait for user command
    # -----------------------
    command = cv.WaitKey(10)

    # if press 'q' -> exit program
    if command == ord('q'):
        print "Ending program"
        break  # end program

เพิ่มข้อความบนภาพ และบันทึกภาพเป็นไฟล์ JPEG

โปรแกรมต่อไปนี้เพิ่มการทำงานสองอย่างคือ (1) ฝังข้อความแสดงวันและเวลาปัจจุบันลงในภาพ โดยจะวาดกล่องสี่เหลี่ยมผืนผ้าสีขาวแล้ววางข้อความวันเวลาสีดำทับ (2) บันทึกภาพเป็นไฟล์ JPEG เมื่อผู้ใช้กดปุ่ม ‘s’ บนแป้นพิมพ์

import cv
import datetime

# ---------------------------
# Setup the webcam and font
# ---------------------------

# define image size
imageWidth = 320
imageHeight = 240

# create a window object
cv.NamedWindow("window1", cv.CV_WINDOW_AUTOSIZE)
camera_index = 0

# create a camera object
capture = cv.CaptureFromCAM(camera_index)

# set capture width and height
cv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FRAME_WIDTH, imageWidth );
cv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FRAME_HEIGHT, imageHeight );

# create a font 
font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX_SMALL , 0.5, 0.5, 0, 1, cv.CV_AA)

while True:

    # get image from webcam
    frame = cv.QueryFrame(capture)

    # -------------------------------------------
    # Draw the time stamp on a white background
    # -------------------------------------------	
    cv.Rectangle(frame, (0,0), (imageWidth, 15), (255,255,255),cv.CV_FILLED,8,0)
    # get the current date and time
    timeStampString = datetime.datetime.now().strftime("%A %Y-%m-%d %I:%M %p")
    # insert the date time in the image
    cv.PutText(frame, timeStampString, (10,10), font, (0,0,0))

    # -----------------------------
    # show the image on the screen
    # -----------------------------
    cv.ShowImage("window1", frame)

    # -----------------------
    # wait for user command
    # -----------------------
    command = cv.WaitKey(10)

    # if press 'q' -> exit program
    if command == ord('q'):
        print "Ending program"
	break  # end program

    # if press 's' -> save the image 
    elif command == ord('s'):
	print "Saving image"
	cv.SaveImage("test.jpg",frame)

วิดีโอต่อไปนี้เป็นการสาธิตการทำงานของโปรแกรมข้างต้น

ตัวอย่างไฟล์ภาพที่ได้จากการบันทึกของโปรแกรม แสดงไว้ในภาพด้านล่าง

webcam test

 

 ข้อแนะนำ

  • การตั้งเวลาและ Time Zone – ปกติหากเครื่องคอมพิวเตอร์ต่ออยู่กับอินเตอร์เน็ต เวลาของระบบจะถูกต้องเสมอ แต่ถ้าไม่เป็นเช่นนั้นก็เป็นไปได้ว่ายังไม่ได้กำหนดค่า Time Zone ให้เป็นเขตเวลาของประเทศไทย การตั้งค่า Time Zone บนคอมพิวเตอร์ Raspberry Pi สามารถทำได้โดยการใช้คำสั่งsudo raspi-configแล้วเลือกเมนูหมายเลข 4 “Internationalization Options” แล้วเลือก “Change Timezone” ตามด้วยการเลือกโซนเป็น Asia และเมืองชื่อ Bangkok
  • ให้เวลากล้องปรับค่าแสงก่อนบันทึก – หากจะนำโปรแกรมไปประยุกต์ใช้เพื่อทำการบันทึกภาพตามเงื่อนไขที่กำหนด การบันทึกภาพทันทีหลังจากเชื่อมต่อกับ Web Cam อาจพบว่าภาพที่ได้มีค่าแสงที่สว่างหรือมืดเกินไป สาเหตุเป็นเพราะกล้อง Web Cam โดยทั่วจะต้องใช้เวลาในการปรับค่าแสงให้เหมาะสมสักพักหนึ่ง ดังนั้น ผู้พัฒนาอาจต้องเขียนโปรแกรมวนเรียกใช้ภาพจาก Web Cam สักพักหนึ่งก่อนประมาณ 1-2 วินาที  แล้วค่อยอ่านและบันทึกภาพลงไฟล์

 สรุป

บทความนี้ได้แสดงวิธีการติดต่อกับ Web Cam เพื่อแสดงภาพ, ฝังข้อความ, และบันทึกภาพเป็นไฟล์ JPEG โดยทำงานผ่าน Open CV อย่างง่าย โปรแกรมนี้สามารถนำไปประยุกต์ใช้กับโครงงานที่ต้องการถ่ายภาพได้เป็นอย่างดี