สวัสดีปีใหม่คร้าบ ปีใหม่ก็เอาข่าวล่าสุด สำหรับการเตรียมความพร้อมในการเปิดให้บริการ motion capture studio ของเรามาฝากกันนะครับ อีกไม่นานนี้แน่นอน
เพื่อเป็นการทดสอบและเก็บข้อมูลเพื่อการเตรียมความพร้อมก่อนการเปิดให้บริการ รวมไปถึงจะได้เอาข้อมูลไปใช้ทำ show reel เพื่อการประชาสัมพันธ์ต่อไป เราจึงทำการทดสอบการทำ motion capture ด้วยท่ารำหนุมานของโขน การแสดงซึ่งเป็นเอกลักษณ์ประจำชาติไทยของเรา และมีท่วงท่าที่ซับซ้อนเหมาะกับการทดสอบใช้งานครับ ตัววิดิโอข้างล่างนี้เป็นการเก็บ raw data กำลังรอ โมเดล 3d หนุมาน มาเพื่อจะใส่ท่ารำที่ได้จากการทำ mocap นี้เข้าไปครับ โปรดติดตาม
คลังเก็บหมวดหมู่: Development
motion capture กับ kinect
ช่วงนี้กลับมาดำเนินการเรื่องการเปิดให้บริการ motion capture ต่อครับ ในสภาวะที่วงการเงียบๆไป อาจเป็นอีกแรงที่ช่วยปลุกกระแสขึ้นมาใหม่จากบริการที่มีคุณภาพและราคาไม่แพง ผมโฟกัสที่สตูดิโอไม่ใหญ่หรือเป็นพวกนักพัฒนาเกมอิสระ ต้องการทำเดโม หรือ งานที่แข่งกับเวลา เช่นงาน อีเว้นท์ การนำเอาเทคโนโลยีเข้ามาช่วยทำในเรื่องของ digital art นั้น ผมว่าบ้านเรายังมีพื่นที่ให้ไปต่ออีกเยอะครับ
ข้างบนนี้ก็เป็นการนำเอา kinect มาทดลองเล่นกับ product ที่มีอยู่ในตลาด เพื่อจะดูว่าจะนำตัวไหนเข้ามาให้บริการได้บ้างครับ ก็สนุกดี อิอิ ยังมีอุปกรณ์อีกหลายตัวที่แพลนว่าจะเอาเข้ามาจำหน่ายและใช้สำหรับงาน 3d ครับ โปรดติดตาม
ทดลองทำ OCR บน Raspberry Pi 2
วันก่อนได้ทดลองทำงานต้นแบบอ่านตัวเลข หรือการทำ OCR ด้วย tesseract โดยเริ่มจากขั้นตอนที่ขาดไม่ได้ คือ การปรับปรุงภาพให้สามารถทำการอ่านได้ดีที่สุด โดยการใช้ OpenCV และทำการแสดงผลบนจอ LCD โดยเขียนโปรแกรมบน Qt รันบน Linux และใช้ Raspberry Pi 2
ก็เป็นการหยิบ r-pi 2 มาใช้เป็นครั้งแรกเลย ตอนแรกว่าจะเอามาลอง Windows 10 ซะหน่อย แต่จนแล้วจนรอดก็ยังไม่มีโอกาสเลยครับ เลยเอามาลองกับงานนี้ก่อน ขั้นตอนการทำงานของผม เป็นดังนี้ครับ
1. ทดสอบการเก็บภาพก่อน ว่าต้องใช้แหล่งกำเนิดแสง ช่วยมั้ย ต้องใช้เลนส์ขนาดเท่าไร ระยะติดตั้งควรเป็นเท่าไร เสร็จแล้วก็ลองทำออกมา
2. จากนั้น ก็เริ่มหาขั้นตอนการทำ image processing ตรงนี้โปรแกรมอย่าง gimp ช่วยได้มากเลยครับ ทดลองปรับปรุงภาพด้วย filter แบบต่างๆ จดบันทึกขั้นตอนเอาไว้ แล้วก็ลองเขียนด้วย OpenCV และลองเอาไปทำ OCR ด้วย tesseract เมื่อได้ผลลัพธ์ที่ต้องการแล้วก็ เขียนโปรแกรมด้วย Qt
3. เดี๋ยวนี้ผมไม่ค่อยอยากเขียน UI ด้วย widget ละ ใช้ QML เป็นหลัก ก็เลยใช้ Qt ซึ่งเวลามีน้อย ก็เลยไม่ได้ build Qt เอง ไป download จากคนที่เค้า build มาแล้วเอามาเผยแพร่ แต่ก็เจอปัญหาคือ เค้า build มาแบบ cross platfom ตัว utility ของ Qt เช่น qmake moc ก็จะอยู่บน PC ทางแก้คือ ต้องหัดใช้ cmake เพื่อ build โปรแกรม แทน
4. จากนั้นจึงใส่ sensor และ LED RGB เข้าไปโดยควบคุมผ่าน library ชื่อ WiringPi ซึ่งก็ใช้งานง่ายดีครับ ยกเว้นต้องรัน โปรแกรมด้วย sudo
ก็ประมาณนี้ละครับ ผมไม่ค่อยได้ใส่โค้ดเข้ามาในบล็อก เพราะสามารถหาเอาจากที่อื่นได้อยู่แล้ว ส่วนที่สำคัญคือการเรียนรู้ ไม่ใช่ผลลัพธ์ครับ
เกริ่น QML animations & transitions
เคยเขียนไปเมื่อนานมาแล้วว่า สิ่งที่น่าสนใจของ 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
Barcode scanner hooking
กลับมาหัดเขียน win32 API อีกครั้ง หลังจากมาเขียน Qt อยู่นาน (เมื่อ 15-16 ปีก่อน บ้ามากถึงขนาดไปสอบจนได้ cer MCSD Visual C++ มา แล้วหลังจากนั้นไม่นานมันก็ออก .net มา ฮือ ฮือ) เป็นโปรแกรมเล็กๆตัวนึง ทำอะไรไปบ้าง จะมาเล่าให้ฟังครับ อิอิ
requirement คือต้องการโปรแกรมที่เอาไปดักจับข้อมูลจากเครื่องสแกนบาร์โค้ด โดยที่ระบบเค้าก็ทำงานไปปกติ โดยข้อมูลจะเอาไปล็อกไว้ผ่านทาง TCP
จริงๆ SI ก็หาโซลูชั่นได้แล้วใช้แอพสองตัวช่วยกันแต่ติดที่ลิขสิทธิ์เพราะต้องไปลงใน POS หลายเครื่องก็หลายเงินอยู่ ก็เลยต้องหาทางเขียนเอา
ปัญหาที่ต้องหาวิธีแก้คือ ดักจับข้อมูลเฉพาะบาร์โค้ด ไม่ไปยุ่งกับการทำงานเดิม และส่งข้อมูลผ่าน TCP
เรื่องแรกก็ต้องหาทางรู้ก่อนว่าจะดักจับ data จาก HID ตัวไหน(ที่มันเป็น barcode scanner)
เรื่องดักจับข้อมูล ตอนแรกว่าจะใช้ hooking ก็เลยหาวิธีที่สะดวกกว่าได้ เพราะ ใช้ hooking คุ้นๆว่าตัว anti ไวรัส มักจะฟ้อง
เรื่องตัวโปรแกรม ก็ทำให้มันไม่มีหน้าตา(GUI) จะได้ไม่ไปเกะกะหน้าจอเค้า รับแต่ windows message ได้อย่างเดียวพอ จะทำเป็น service ก็ยุ่งยากไป
เรื่องสร้าง tcp server คอยส่ง data ให้ client เนื่องจากอยากให้มันเป็น async เลยใช้แบบ WSAASYNCSELECT ไม่ต้องมี thread ให้ยุ่งยาก รองรับ client ตัวเดียว สบายไป
เรื่องปวดหัวสุดท้ายอยู่ที่ data เนี่ยละ มันเข้ามาเป็นแบบเสมือนเรากด keyboard (virtual key) ลองนึกถึงการกด shift หรือ ctrl ตามด้วย key แล้วต้องแปลงข้อมูลเป็น char array ส่งผ่านเน็ตเวอร์ค อันนี้ก็หาทางแปลงไปมั่วๆ ออกมาได้
ทีนี้โปรแกรมตัวมันเล็กทำงานน้อยๆก็เลยจะไม่ใช้ Qt จะได้สะดวกตอนเอาไป install เลยกลับไปเขียน VC++ เพียวๆ ที่ไม่ได้เขียนนานมากแล้ว
เสร็จละครับ โปรแแกรมเล็กๆตัวนึง
QChart.js : awesome chart for QML
เนื่องด้วยต้องทำหน้า report สืบต่อเนื่องจากงานที่แล้ว กลายเป็นว่างานนี้ใช้เวลาไปโขอยู่ครับ เผลอๆจะพอๆกับตัวโปรแกรมหลักเลยทีเดียว ดีที่ว่าเจอโปรเจ็คนึงทำออกมาได้สุดยอดครับ ช่วยให้งานนี้ง่ายขึ้นเยอะ เป็นการพอร์ท Chart.js มาเพื่อให้สามารถใช้งานกับ QML ได้ โปรเจ็คนี้มีชื่อว่า QChart.js ครับ ก็ไปหามาลองใช้กันดู
control อีกสองตัวที่อยากพูดถึง ซึ่ง Qt น่าจะเอามาใส่ไว้ในเวอร์ชั่น Community ก็คือ date picker และ tumbler ผมก็ไปหามาใช้จนได้ อิอิ จริงๆ tumbler เนี่ยเคยมีอยู่ใน QML1 บน Qt 4.8 นะถ้าผมจำไม่ผิด เป็นตัวอย่างโค้ดหรืออย่างไรเนี่ยแหละ
ครับ หายไปนาน ก็มีเรื่องมาฝากกันเท่านี้ก่อน ในฐานะ Qt fan club อีกเช่นเคย ฮ่าๆ ผมก็ต้องเรียนรู้ หัดเขียน javascript เพิ่มขึ้นมาอีกอย่างหนึ่ง เพื่อให้ใช้งาน QML ได้อย่างเต็มเม็ดเต็มหน่วย ฟีเจอร์เด็ด พวก animation ของมันผมก็ยังไม่ค่อยคล่อง มีโอกาสจะนำมาเสนอในคราวต่อๆไปครับ
อ้างอิง : https://github.com/jwintz/qchart.js/tree/master
QR code generator and Printing
หลังจากที่ได้เขียนตัวอ่าน QR code ไปแล้ว ก็ถึงคราวต้องทำ ตัว generator ละครับ สร้างขึ้นมาอย่างเดียวไม่พอ ก็ต้องปรินท์ออกมาได้ด้วยถึงจะนำไปใช้ประโยชน์ได้ครับ
ผมใช้ libPrison ในการสร้าง QR ก็สะดวกง่ายดายดีครับ ในส่วนของการปรินท์ Qt ก็ให้ API มาให้ค่อนข้างดีทีเดียว การเรียกใช้ print preview dialog การเพิ่มจำนวนหน้า ทำได้ไม่ยากเลย
เหลือที่จุกจิกกวนใจก็ตรงการกำหนดขนาดและทำการ resize สิ่งที่เราจะวาดให้ตรงกับขนาดของกระดาษที่เราจะพิมพ์นั่นละครับ ผมใช้วิธี resize และ render widget เอาเลย โดยทำ widget ที่มีส่วนประกอบและวาง layout ดังรูป กำหนดขนาดและจำนวนที่จะ render ให้พอดีกับขนาดของกระดาษโดยประมาณเอา
Video Compositing with LibCairo
ในที่สุดก็ได้ฤกษ์เอา BlackMagic DeckLink Studio ออกมาเล่นอะไรสักอย่างสักทีครับ ดองไว้เป็นปีละ จริงๆซอฟแวร์ทำ Cg ฟรีๆก็มี ดูน่าจะดีด้วย นั่นคือ CasparCG ซึ่งรองรับ DeckLink ซะด้วย เพียงแต่มันไม่มีเวอร์ชั่นบน Linux ก็เลยปล่อยผ่านไปก่อน
วันนี้จึงได้ทำการทดลองเขียนโปรแกรม เอาภาพวิดิโอจาก webcam USB นี่ละ เพราะรอ กล้อง SDI 720p จากจีนอยู่ยังไม่มาสักที ไม่งั้นคงได้ทดสอบการ์ด DeckLink ในการรับอินพุตด้วยแล้ว ซึ่งการ์ดในตระกูล DeckLink นั้นมี driver รองรับสามารถใช้กับ Linux ได้เกือบทุกรุ่นครับ แม้กระทั่งรุ่นเล็กราคาไม่กี่พันบาท จึงเป็นทางเลือกที่ีดีทางหนึงในการเอามาใช้งาน
ส่วนประกอบหลักของโปรแกรมก็คือ GStreamer ครับ ผมเขียนด้วย C โดยมี Elements หลักๆก็คือ v4l2 source, libcairo และ decklink sink นั่นเอง เพื่อทดสอบว่าเราก็สามารถทำ graphics บน tv แบบง่ายๆได้โดยใช้เครื่องมือไม่ต้องมากมายหรือแพงๆ ตัวอย่างนี้ผมลองใส่ตัวอักษรวิ่งกับนาฬิกาเข้าไป ซึ่งส่วนประกอบของนาฬิกานั้นมาจากไฟล์ svg
ลองนึกถึงการถ่ายทอดสดลง youtube เล่นๆเวลามีกิจกรรมอะไร หรืออยากทำรายการเป็นของตัวเอง แล้วใส่กราฟิกเข้าไปแบบเรียลไทม์ได้ ก็ทำให้ดูโปรขึ้นมากเลยทีเดียว อิอิ (ผมคิดเอาเองนะครับ)
libcairo ค่อนข้างเป็น lib พื้นฐานต้องเหนื่อยเหมือนกันหากอยากได้กราฟิกที่ซับซ้อนเหมือน flash ก็หวังไว้ว่าอีกไม่นาน จะมีปลั๊กอิน QML ทำได้ในลักษณะอย่างนี้เหมือน libcairo ซึ่งก็น่าจะทำให้ทำอะไรได้ง่ายขึ้นอีกไม่น้อยเลยครับ
ทำระบบคาราโอเกะ Karaoke with PCDuino3 Nano
เมื่อทำการทดสอบ 2d/3d ไปแล้ว ทีนี้มาลองทดสอบ multimedia กันบ้างครับ โดยข้อมูลจาก linux-sunxi เค้าบอกว่า เราสามารถเล่นไฟล์มัลติมีเดียได้โดยอาศัย vdpau ผ่านทางโปรแกรม mplayer
แต่เมื่อทดลองใช้งานแล้วปรากฎว่า ตัวที่ทางผู้ผลิต install มาให้นั้น น่าจะเป็นเวอร์ชั่นเก่าครับ ต้องลง mplayer2 จาก repository แทนมันถึงจะไปเรียกใช้ vdpau ได้ แต่ก็ดูเหมือนจะมีปัญหาอีก ตรงนี้คงต้องหาข้อมูลต่อ เพราะหลายๆคนแนะนำให้ไปใช้ mpv ซึ่ง fork มาจาก mplayer แทน
พอดีถนัดใช้งาน gstreamer เลยตัดสินใจลง gstreamer 0.10 และทดสอบใช้งานดู ปรากฎว่าเล่นได้ครับ
ผมทดลองเล่นไฟล์ h.264 1080p โดยไม่ใช้ความสามารถของ hardware decoder ช่วย ก็ไม่สามารถเล่นได้อย่างราบรื่นนะครับ แถมกิน cpu ไปหมดทั้งสองคอร์ เมื่อเปลี่ยนมาใช้ vdpau ช่วย ก็สามารถเล่นได้สบายๆครับ
เมื่อผ่านขั้นตอนทดสอบความสามารถก็มาถึงขั้นตอนการพัฒนาอะไรขึ้นมาบ้าง โดยมีโจทย์มาให้ทำระบบเล่นคาราโอเกะ ครับโดยมีความสามารถในการตัดเสียงร้องออกได้ (กรณีที่ไฟล์ต้นฉบับ ใส่เสียงร้องไว้ channel หนึ่งนะครับ) ก็เลยลองทำโดยการใช้วิธี ตัดเสียงจาก channel เดิม ออก แล้วใส่ เสียงจากอีก channel เข้าไปแทน จึงกลายเป็น mono 2 channels ( LR -> LL or RR ) ทำให้เสียงยังคงออกลำโพงทั้งสองข้างได้
ก็ทดลองทำให้มันสลับไปมาได้ กว่าจะทำเสร็จก็ร้องเล่นเองไปหลายรอบๆ อิอิ
อันนี้ก็เป็นตัวอย่างหนึ่งในการใช้งานบอร์ดนี้นะครับ ข้อดีอย่างที่บอกไป ลดการใช้พลังงาน ลดต้นทุน ได้หลายๆครับ
QR decoder app on Android
คราวก่อน เขียนโปรแกรม QR decoder บน pc ไปแล้ว วันนี้เป็นการทดสอบเอาโปรแกรมไปรันบนเครื่องแอนดรอยด์ จุดที่น่าสนใจคือ การคอมไพล์ zbar library ด้วย ndk ส่วนหนึ่งผมทำตามแนะนำจากเว็บนี้ http://www.blackdogfoundry.com/blog/zbar-bar-code-qr-code-reader-android/ เพื่อให้ได้ libzbar.so และ ฟังก์ชั่นการ decode ภาพออกมา
ส่วนต่อมาคือการเอาไปใช้ ผมเขียนด้วย QML ดัดแปลงจาก https://www.ics.com/blog/qt-5-multimedia-qml-elements#.VCFtHdazCfg ซึ่งจริงๆก็คล้ายๆกับ ใน document ของ Qt เองครับ จุดที่น่าสนใจอีกจุดคือการทำให้ QML สามารถเรียกฟังก์ชั่น decode ใน C++ ได้
และส่วนสุดท้ายครับ คือการ deploy หรือการนำโปรแกรมขึ้นไปรันบนอุปกรณ์ที่เป็น Android จริงๆ ซึ่งประเด็นอยู่ที่การนำเอา libzbar.so ใส่เข้าไปด้วย ก็ศึกษาได้จาก http://www.kdab.com/qt-android-episode-3/
การเขียนโปรแกรมครั้งเดียวแล้วสามารถรันได้หลายๆแพลตฟอร์มด้วย Qt เป็นอะไรที่เจ๋งจริงๆเลยครับ อิอิ







