การงาน Raspberry Pi3 ในการถ่ายทอดสด ด้วย USB WebCam

การงาน Raspberry Pi3 ในการถ่ายทอดสด ด้วย USB WebCam

        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 รองรับ
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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’ บนแป้นพิมพ์
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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.50.501, 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 อย่างง่าย โปรแกรมนี้สามารถนำไปประยุกต์ใช้กับโครงงานที่ต้องการถ่ายภาพได้เป็นอย่างดี

ที่มา https://learninginventions.org/?page_id=1163

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

WEEK 1 Arduino – Basic I/O (Digital Input/Output, Shields, Sensors)

Raspberry Pi III คืออะไร

WEEK 9 NI labview 2014