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

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 มากกว่าครับ

DVR card

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

ส่วนตัวผมนั้นเล่นเรื่องนี้มาสามสี่ปีแล้วเพราะมีคนมาจ้างทำระบบน่ะครับ แต่จะเน้นเรื่อง image processing มากกว่าการติดตั้งใช้งานปรกติทั่วไป ดังนั้นการซื้อมาเป็นตัวเครื่องเลยจึงไม่ใช่ตัวเลือกของผม อีกตัวเลือกหนึ่ง นั่นคือ การใช้เป็น pci card มาเสียบเข้ากับ pc เพื่อใช้ pc เป็น DVR (Digital Video Recorder) จึงดูเหมาะสมกว่า

วันนี้จึงมาแนะนำกันว่า ไอ้เจ้าการ์ดใบนี้ ซึ่งในตลาดนั่นหาซื้อได้ในราคาตั้งแต่หลักพันต้นๆไปจนถึงหลักหมื่นนั้น อะไรที่ทำให้ราคามันเป็นอย่างนั้นไปได้

ตามรูปเลยครับ ท่านลองส่องการ์ดของท่านดูว่ามีอะไรบ้าง ส่วนใหญ่วางเลย์เอาท์มาคล้ายๆกันละครับ ก็เริ่มด้วยตัวที่ทำหน้าที่เป็น video decoder ไอ้เจ้าชิพตัวนี้ก็จะทำหน้าที่รับสัญญาณ analog จากกล้อง cctv หรือ tv หรือจากเครื่องเล่นวิดิโอก็ได้ครับ แปลงเป็นสัญญาณ digital จะ sampling กันกี่บิตก็แล้วแต่รุ่นและยี่ห้อ โดยทั่วไปเมื่อชิพตัวนี้นำมาใช้กับ dvr ก็จะรับได้ 1 channel ขนาด D1 ตัวอย่างชิพที่เห็นได้ตามท้องตลาดทั่วไปก็เช่น ของ Conexant BT878 หรือ NXP SAA7130 ถ้าเป็นชิพพวกนี้ก็ดูได้เลยว่าถ้าต้องการ full frame rate แบบ realtime จากกล้องกี่ตัว ก็ต้องมีชิพนี้จำนวนเท่านั้นแหละ (แต่ก็อาจมียกเว้นที่รวมมาเป็นชิพตัวเดียวใหญ่ๆสำหรับหลายๆ channel เลยก็เคยเห็นเหมือนกัน) เมื่อเป็นเช่นนั้นก็ต้องมีชิพตัวต่อไปขึ้นมาทำหน้าที่ให้การ์ด pci หนึ่งใบเห็นเป็นเหมือนมี pci เท่าจำนวนกล้อง เจ้าตัวนี้เรียกว่า pci bridge นั่นเอง เจ้าตัวนี้ที่ใช้กันก็คงจะเป็น PLX หรือ P ตัวเดียวของ Pericom

snapshot11

4-channels DVR runs on Linux

ส่วนที่เป็น option เพิ่มเข้าทำให้ราคามันต่างกันออกไปนั้นน่าจะอยู่ที่ ชิพประมวลผลพิเศษ FPGA ที่แต่ละเจ้าใส่โปรแกรมเข้าไปเพื่อให้การ์ดมีความสามารถมากขึ้นเช่น บีบอัดและเข้ารหัสเป็น H.264 โดยที่ไม่ต้องไปพึ่งพา cpu ของ pc นั่นเอง ตัวนี้ที่เคยเห็นก็ของเจ้าใหญ่ XILINX นั่นเอง

ก็คงพอเห็นภาพและเป็นประโยชน์ในการเลือกซื้อและใช้งานนะครับ หวังว่าคงช่วยให้ท่านเสียเงินไปอย่างคุ้มค่ามากขึ้น