SKCONAN

เขียนโปรแกรม Python รับภาพจากกล้องด้วย OpenCV

January 09, 2019

title

คราวที่แล้วเราก็เรียนรู้ วิธีการอ่านไฟล์ภาพ กันไปแล้วเนอะ ใครยังไม่อ่านแนะนำให้ไปอ่านก่อนนะครับ เพราะมีการอธิบายเรื่อง color model ที่ใช้ใน OpenCV ด้วย (ใช้ BGR ไม่ใช้ RGB)

ครั้งนี้เรามาดูวิธีการอ่านไฟล์ video หรือการ capture video จากกล้องกันบ้าง ให้เรามอง video เป็น image sequences ก็คือภาพที่มันต่อๆกันหลายๆภาพ

ซึ่ง video มันจะมีค่า frame rate (Hz) ที่บอกว่า 1 วินาที เราสามารถรับภาพได้กี่ภาพ

สมมติ video มี frame rate อยู่ที่ 30 Hz ก็คือ 1 วินาที รับภาพได้ 30 ภาพ หรือ 30 frame นั้นเอง

ส่วนของโค้ดนะครับ เราจะเขียนให้ capture video จาก webcam หรือกล้องบน Laptop เรา แล้วก็นำมาเสนอผลเป็นภาพสี และภาพขาวดำ ลองดูโค้ดด้านล่างเลยครับ

import cv2 

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame_gray',gray)
    cv2.imshow('frame_bgr',frame)

    # Check press key == q -> break
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

หลายๆคนอาจจะพอเดาได้ว่า แต่ละคำสั่งใช้ทำอะไรใช่มั้ยครับ คราวนี้มาดูกันว่าเราเข้าใจถูกแล้วรึยัง

cv2.VideoCapture(0)

อันนี้จะเป็น object ที่ประกาศขึ้นมาเพื่อใช้ในการ capture video ต่อไปมาดู parameter ที่เราใส่เข้าไปกันบ้างจะมี 2 แบบ ดังนี้

Parameters Description
Camera index Index ของกล้องที่เราต้องการ connect โดยเริ่มที่ 0 (ถ้าเรามีกล้องต่อกับ Laptop 2 ตัว เราก็ลองใส่ค่า 0 กับ 1 ดูก็จะรู้ว่า Index ของกล้องแต่ละตัว คือค่าอะไร)
File Path Path ของไฟล์วิดีโอที่เราต้องการจะ capture

ถ้าอยาก capture video file ก็แค่เปลี่ยนเป็นแบบนี้

cap = cv2.VideoCapture("./relative_path/vdo_skconan.avi")

หลังจากนั้นเราก็จะวน while เพื่อรับภาพโดยใช้

cap.read()

function นี้จะ return ค่าออกมา 2 ค่า ดังนี้

Variable Description
ret ค่า Boolean (True/False) ถ้าอ่าน frame ได้ถูกต้อง จะเป็น True ส่วนกรณีอื่นๆ ก็เป็น False
frame ถ้า ret เป็น True จะได้ภาพที่เรา capture มาจาก video ถ้าเป็น False จะมีค่าเป็น None

ทั้งหมดนี้ก็เป็นการ capture video แบบ basic นะครับ ซึ่งจริงแล้วเรายังสามารถตั้งค่า ขนาดของภาพ หรือคุณสมบัติต่างๆได้อีกมากมาย โดยการใช้คำสั่ง cap.set(propId, value)

โดยตัว propId จะมีค่า 0-18 โดยบาง property ก็ไม่สามารถใช้งานขึ้นอยู่กับกล้อง และไฟล์วิดีโอของเรานะครับ

ใครอยากรู้ว่าแต่ละ Id คืออะไร สามารถเข้าไปดูได้ตามลิ้งนี้นะครับ videocapture-propId ลองไปเล่นกันดูนะครับ

หากใครชอบเนื้อหาที่ผมเขียน สามารถร่วมกัน Donate เพื่อเป็นค่ากาแฟได้นะครับ ^^


ใครที่สงสัยจุดไหน หรือพบว่าจุดไหนที่ผมอธิบายผิด สามารถเข้ามาพูดคุยกันได้นะครับ inbox มาที่ Facebook หรือ e-mail: supakit.kr@gmail.com จะยินดีมากเลยครับ



รับพัฒนาโปรแกรมทางด้าน Image Processing, Computer Vision และ Machine Learning สามารถติดต่อ สอบถาม และปรึกษาได้ฟรีครับ

Written by Supakit Kriangkhajorn

© 2019, Built with