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 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.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