การงาน Raspberry Pi3 ในการถ่ายทอดสด ด้วย USB WebCam
การงาน Raspberry Pi3 ในการถ่ายทอดสด ด้วย USB WebCam
Web Cam เป็นอุปกรณ์หนึ่งที่มีประโยชน์มากในการทำโครงงาน โดยเฉพาะกับคอมพิวเตอร์ขนาดเล็กเช่น Raspberry Pi ซึ่งสามารถนำไปประยุกต์ทำอุปกรณ์อัตโนมัติและหุ่นยนต์ได้มากมาก บทความนี้จะนำเสนอวิธีการเขียนโปรแกรม Python อย่างง่ายเพื่อใช้งาน Web Cam
อุปกรณ์ที่ต้องใช้
- USB Web Cam – หากใช้กับ Raspberry Pi ก็ต้องใช้รุ่นที่ Raspberry Pi สนับสนุนบทความนี้ใช้กล้องของ Logitech ราคาประหยัดรุ่น C110 ซึ่งมีความละเอียดสูงสุด 640×480 จุด
- 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 sizeimageWidth = 320imageHeight = 240# create a window objectcv.NamedWindow("window1", cv.CV_WINDOW_AUTOSIZE)camera_index = 0# create a camera objectcapture = cv.CaptureFromCAM(camera_index)# set capture width and heightcv.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 cvimport datetime# ---------------------------# Setup the webcam and font# ---------------------------# define image sizeimageWidth = 320imageHeight = 240# create a window objectcv.NamedWindow("window1", cv.CV_WINDOW_AUTOSIZE)camera_index = 0# create a camera objectcapture = cv.CaptureFromCAM(camera_index)# set capture width and heightcv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FRAME_WIDTH, imageWidth );cv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FRAME_HEIGHT, imageHeight );# create a fontfont = 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) |
ตัวอย่างไฟล์ภาพที่ได้จากการบันทึกของโปรแกรม แสดงไว้ในภาพด้านล่าง
ข้อแนะนำ
- การตั้งเวลาและ 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
ที่มา https://learninginventions.org/?page_id=1163

ความคิดเห็น
แสดงความคิดเห็น