คลังเก็บหมวดหมู่: Linux

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 อยู่สามสี่วัน หลังจากไม่ได้ทำมานานหลายปี

Streaming Server : beta version

ตัว beta เสร็จละครับ ลองดูการทำงานของมันจากวิดิโอดูนะครับ แผนงานต่อไป คือ ทำ โปรแกรม signage ฝั่ง client ให้เนียนๆ ใช้งานง่าย

Linux DVR demo program

ความเดิมจากตอนที่ แนะนำ ฮาร์ดแวร์ซึ่งก็คือ DVR card จาก Adlink และ Yuan  ไปแล้ว วันนี้จะมาเดโมให้ดูกับโปรแกรมที่เพิ่งเขียนขึ้นมาใหม่ครับ ( เขียนตอนหยุดปีใหม่นี่เอง เสร็จตอนเวลาข้ามเที่ยงคืนวันสิ้นปีมาหน่อยเดียว อิอิ ) โดยโปรแกรมนี้รันบน Kubuntu ด้วยเครื่อง VIA VB8001 จับคู่กับ Yuan ตัวเก่านั่นแล

จริงๆ ตอนแรกจะเขียนเรื่อง การเขียนโปรแกรมด้วย DBUS ที่เคยเกริ่นเอาไว้เมื่อนานมาแล้ว ก็เลยเอาโปรแกรมที่เขียนแล้วใช้ DBUS มาโชว์ให้ดูด้วย จะได้เห็นภาพการใช้งานได้ง่ายขึ้น ก็เลยยกยอดเอาไปตอนหน้าละกัน อิอิ สำหรับการเขียนโปรแกรม

ระบบนี้ประกอบด้วยสองโปรแกรม ตัวแรกรันเป็น backend รับสัญญาณภาพจาก DVR มาทั้ง 4 แชนแนล โปรแกรมตัวที่สอง คือตัวแสดงผลภาพที่ส่งมาจากโปรแกรม backend และรอรับอินพุตจากคีย์บอร์ด ที่สามารถกดคีย์เพื่อเลือกดูทีละแชนแนลก็ได้ หรือ ดูรวม 4 แชนแนลก็ได้ โดยผมใช้ DBUS ตรงนี้แหละ เมื่อมีการกดคีย์บอร์ดในโปรแกรมแสดงผล ก็จะเป็นการเรียกเมธอดแบบข้ามโปรเซสไปที่โปรแกรม backend เพื่อเป็นการเลือกแชนแนลของสัญญาณภาพจะที่ส่งออกมา ผมใช้วิธีนี้เพราะเดี๋ยวจะเอาไปไว้ควบคุมโปรแกรมที่ใช้บันทึกวิดิโอด้วย

ก็ดูผลลัพธ์ของตัวโปรแกรมทั้งสองเอาละกันครับ จริงๆ ผมทดลองเอา module GPS + บอร์ด Arduino ใช้ส่งตำแหน่ง ความเร็ว ออกมาได้แล้ว ( อันนี้ไม่ได้เขียนโปรแกรมเองเลย เอาโค้ดเค้ามาใช้ทั้งหมด แค่ออกแรงบัดกรีนิดหน่อย ) ว่าจะเอามาเขียน overlay ทับลงบนภาพวิดิโอ แต่ขอยกไว้ตอนต่อๆไปละกัน เพราะโมดูล GPS ที่ว่ามันของถูกๆจากบ้านหม้อ พอเข้าบ้านแล้วมั่วเลย (แต่ลองบนรถตอนขากลับมาจากต่างจังหวัด ก็ถูกต้องรวดเร็วดีนะ)

หมายเหตุ : ผมขอแก้หน่อย ชอบบอกว่า DBUS คล้าย DCOM อยู่เรื่อย จริงๆแล้วยังไม่ใช่นะครับ ยังไม่ถึงขนาดนั้น ถ้าให้เจาะจงจริงๆ มันเหมือน COM แบบ out of process มากกว่าครับ