คลังเก็บป้ายกำกับ: gstreamer

เกริ่น QML animations & transitions

Screenshot from 2015-08-06 23:05:48 Screenshot from 2015-08-06 16:59:47

เคยเขียนไปเมื่อนานมาแล้วว่า สิ่งที่น่าสนใจของ QML อีกอย่างหนึ่งที่สำคัญก็คือ animation & transitions วันนี้ก็ได้มีโอกาสลองเล่นและเรียนรู้ ก็ต้องทำความเข้าใจกับมันพอสมควรเมื่อเริ่มต้น ตอนนี้ผมก็ยังงูๆปลาๆอยู่เลยครับ อิอิ

ด้วยความตั้งใจแต่เริ่มแรกคือ คำถามที่ค้างคาใจมานานว่า ไม่มีอะไรมาแทน flash และ action script เลยเหรอ สำหรับการทำ cg บน tv เพราะโปรแกรมอย่าง CasparCG นั้นก็ใช้ flash ที่นี้ถ้าเราต้องการทำระบบ live streaming เองละ จะใส่กราฟิกและอนิเมชั่นลงไปได้ยังงัย

คราวก่อนผมลอง cairo overlay ลงบน gstreamer element แค่ใช้เวลาเอา svg ขึ้นเนี่ยก็นานแล้วครับ และถ้าต้องโหลดเยอะๆ ดูเหมือนก็จะมีผลต่อ performance เหมือนกัน

คราวนี้เลยลองใหม่ ใช้วิธีเขียน QML application เลย แล้วค่อยทำ screencast เฉพาะส่วน ผมลองเอาไปถ่ายทอดสดลงบน youtube ก็ได้ดังที่เห็น

อ่าว หมดแรงเล่าซะละ ต่อคราวหน้าครับ

credit : กราฟิกสนาม Designed by Freepik.com

Video Compositing with LibCairo

ในที่สุดก็ได้ฤกษ์เอา BlackMagic DeckLink Studio ออกมาเล่นอะไรสักอย่างสักทีครับ ดองไว้เป็นปีละ จริงๆซอฟแวร์ทำ Cg ฟรีๆก็มี ดูน่าจะดีด้วย นั่นคือ CasparCG ซึ่งรองรับ DeckLink ซะด้วย เพียงแต่มันไม่มีเวอร์ชั่นบน Linux ก็เลยปล่อยผ่านไปก่อน

วันนี้จึงได้ทำการทดลองเขียนโปรแกรม เอาภาพวิดิโอจาก webcam USB นี่ละ เพราะรอ กล้อง SDI 720p จากจีนอยู่ยังไม่มาสักที ไม่งั้นคงได้ทดสอบการ์ด DeckLink ในการรับอินพุตด้วยแล้ว ซึ่งการ์ดในตระกูล DeckLink นั้นมี driver รองรับสามารถใช้กับ Linux ได้เกือบทุกรุ่นครับ แม้กระทั่งรุ่นเล็กราคาไม่กี่พันบาท จึงเป็นทางเลือกที่ีดีทางหนึงในการเอามาใช้งาน

IMG_0080-s

ส่วนประกอบหลักของโปรแกรมก็คือ GStreamer ครับ ผมเขียนด้วย C โดยมี Elements หลักๆก็คือ v4l2 source, libcairo และ decklink sink นั่นเอง เพื่อทดสอบว่าเราก็สามารถทำ graphics บน tv แบบง่ายๆได้โดยใช้เครื่องมือไม่ต้องมากมายหรือแพงๆ ตัวอย่างนี้ผมลองใส่ตัวอักษรวิ่งกับนาฬิกาเข้าไป ซึ่งส่วนประกอบของนาฬิกานั้นมาจากไฟล์ svg

ลองนึกถึงการถ่ายทอดสดลง youtube เล่นๆเวลามีกิจกรรมอะไร หรืออยากทำรายการเป็นของตัวเอง แล้วใส่กราฟิกเข้าไปแบบเรียลไทม์ได้ ก็ทำให้ดูโปรขึ้นมากเลยทีเดียว อิอิ (ผมคิดเอาเองนะครับ)

libcairo ค่อนข้างเป็น lib พื้นฐานต้องเหนื่อยเหมือนกันหากอยากได้กราฟิกที่ซับซ้อนเหมือน flash ก็หวังไว้ว่าอีกไม่นาน จะมีปลั๊กอิน QML ทำได้ในลักษณะอย่างนี้เหมือน libcairo ซึ่งก็น่าจะทำให้ทำอะไรได้ง่ายขึ้นอีกไม่น้อยเลยครับ

Machine Vision

วันก่อนได้มีโอกาสทำชุดเดโม machine vision ด้วย Linux, Qt, OpenCV ครับ เลยมีโอกาสได้เปรียบเทียบการใช้งานระหว่างกล้อง usb webcam ธรรมดา กับ กล้องที่ใช้ในงานอุตสาหกรรม

ผมคิดว่าส่วนที่แตกต่างกันมันก็คือเรื่องของ hardware นั่นละครับ เพื่อให้ได้ภาพที่ดีที่สุดเอาไปประมวลผล ซึ่งก็จะทำให้ลดเวลาในการทำ pre-processing ไปได้เยอะ ซึ่งตรงนี้สำคัญมากครับ เพราะแต่ละขั้นตอนหมายถึงเวลาที่ต้องใช้ cpu ประมวลผล ถ้าใช้ขั้นตอนมากก็เสียเวลามาก อาจชดเชยด้วยการใช้คอมสเป็คสูงๆ แต่ก็ไม่แน่ว่าจะช่วยได้เสมอไป ที่สำคัญงานส่วนใหญ่ต้องการความเร็วในการประมวลซะด้วยสิ ดูได้จากเสป็คของกล้องที่มีการรองรับ fps สูงๆ ระดับ 100 fps ขึ้นไป แต่ถามว่าจะทำยังงัยเพื่อให้ประมวลผลแล้วยังได้เฟรมเรทที่ระดับนี้อยู่ ซึ่งกล้องอุตสาหกรรมก็สามารถตอบโจทย์ตรงนี้ได้(ราคาก็สูงกว่ามาก) แต่ถ้าเพื่อการศึกษาหรือทดลอง OpenCV ผมว่าใช้กล้องธรรมดาก็พอได้ครับ

อีกเรื่องคือการ support Linux ของกล้องยี่ห้อต่างๆ มันไม่ใช่แค่ driver ยังต้องรวมถึง sdk ด้วย อย่างที่ผมได้ทดลองทำเดโม เป็นการใช้งานกล้อง Basler ที่มี interface แบบ GigE ก็จะมี pylon sdk มาให้ซึ่งเป็น c++ framework ก็ต้องนั่งศึกษากันไป หรืออย่างของ Imaging Source ก็ค่อนข้างจะสนับสนุนระบบพื้นฐานของ Linux โดยทั่วไปไม่ต้องลง driver ให้ยุ่งยาก เช่น interface USB ก็ใช้ uvc driver กับ v4l2 เนี่ยแหละ แถมยังมี gstreamer plugin ให้ใช้ด้วย ซึ่งส่วนตัวค่อนข้างประทับใจ

อย่างไรก็ดี หากเราได้ภาพมาแล้วเรื่อง api ของกล้องคงไม่ใช่ประเด็นแล้วครับ อย่างกล้องที่ผมได้มีโอกาสใช้งานทำเดโม ก็คือของ Basler ซึ่งใช้ interface แบบ GigE ก็เสียเวลาศึกษาและเขียนโมดูลเพื่อจะเอาภาพออกมาจากกล้องส่งต่อให้ OpenCV เพิ่มขึ้นนิดหน่อย

อีกส่วนหนึ่งก็คือ GUI ครับ เมื่อตะกี้เราพูดถึงการนำภาพจากกล้องผ่าน api ของมันมาส่งให้ OpenCv แน่นอนก็ต้องมีการ copy memory หรือก็อปปี้เฟรมมา ในระหว่างการทำ image processing เรายังอาจต้องมีการ copy ภาพทั้ง frame อีก รวมถึงเมื่อส่งต่อให้ GUI มาวาดทำการแสดงผล อย่างเช่นที่ผมทำไป อย่างน้อยก็มีการ copy จาก api ของกล้องมาเป็น cv::Mat และในขั้นตอนสุดท้ายอยากเอาไปแสดงผล ก็ต้อง copy เป็น QImage สำหรับ Qt อีกที จากที่ลองทำ ซึ่งใช้ thread และ buffer เพื่อแยกระหว่าง การรับภาพเข้ามา และ การประมวลผล ก็ยังดูว่าใช้ cpu มากพอควร

สิ่งที่อยากทำต่อไปคือ ทดลองเอา gpu เข้ามาช่วยทั้งในเรื่องของการแสดงผลและการทำ image processing เช่น OpenGL, cuda หรือ OpenCL ซึ่ง OpenCV ก็ดูจะ support ตรงนี้ด้วย คงต้องไปศึกษาเพิ่มเติมก่อนครับ

ก็ประมาณนี้ จากการที่ได้กลับมาทำ image processing อยู่สามสี่วัน หลังจากไม่ได้ทำมานานหลายปี