14° : สิบสี่องศา Programmer's Blog

มกราคม 23, 2017

gstreamer บน Windows

Filed under: Development,Image Processing,Microsoft,Programming Notes,Qt — สี่สิบดีกรี @ 8:53 am

qtgst-win

จริงๆเขียนโปรแกรมแบบนี้มาหลายปีแล้ว แต่วิธีการก็ต่างกันไปเรื่อยๆครับ คราวนี้มาเขียนบน Windows เพราะเริ่มจะกลับมา deploy งานบน x86 และ win10 บ้าง

ใช้ gstreamer บน Windows ค่อนข้างน่าเวียนหัว โดยเฉพาะเมื่อ อยากใช้ qt-gstreamer และ ms visual studio compiler ทำให้รู้ว่าการมี pkg-config บน linux ช่วยได้เยอะ แต่ลอง pkg-config (win 64) แล้วมัน crash ก็งงๆอยู่ว่าทำไม เดี๋ยวค่อยหาสาเหตุอีกที

gstreamer นี่เอามาใช้ เพื่อ แสดง live preview จาก stream rtsp ของกล้อง IP

ตอนแรกจะใช้ command line ด้วย ffmpeg เพื่อ capture ภาพ ติดตรงต้องเก็บเป็นไฟล์ก่อน แล้วถึงจะดึงภาพมาแสดงได้ พอรู้ว่า OpenCV สามารถดึงภาพจาก stream rtsp ได้ด้วย ก็เลยเปลี่ยนมาใช้ เพราะทำให้สามารถเอามาทำ image processing ต่อและเอาไปแสดงบน Qt/QML Quick control ได้โดยการ copy memory ได้เลย ไม่ต้อง save ก่อน (เอ แต่เดี๋ยวก็ต้อง save อยู่ดีนี่ – – !) ส่วนนี้ต้องให้มันทำงาน แยก thread ออกมาจาก main thread ที่ทำ GUI ไม่งั้น live preview ก็จะกระตุกเวลา capture ภาพ อันนี้เป็นสิ่งที่ผมชอบใช้ Qt เพราะทำให้การใช้ thread เป็นเรื่องง่ายขึ้นเยอะ

ข้อสังเกต คือปัจจุบัน สามารถแยกงานออกแบบ GUI ออกมาได้เกือบสิ้นเชิง ด้วยการใช้ Qt/QML ซึ่งดีต่อการทำงานเป็นทีมมาก

สุดท้าย เอา command line สำหรับ capture ภาพจาก stream rtsp มาฝาก มี 2 วิธี

  1. ใช้ gstreamer แต่คำสั่งนี้ บางทีก็ capture ไม่ได้ ไม่รู้ทำไมเหมือนกัน
    D:\gstreamer\1.0\x86_64\bin>gst-launch-1.0  rtspsrc location=”rtsp://admin:admin@192.168.1.108:554″ latency=10 num_buffers=10 ! decodebin ! videoconvert ! pngenc snapshot=TRUE ! filesink location=img.png
  2. ใช้ ffmpeg อันนี้ ชัวร์ป้าบ
    ffmpeg.exe -i rtsp://192.168.1.xx:554 -y -f image2 -vframes 1 test.jpg

อัพเดต 10 มี.ค. 2560 ไม่รู้มีใครเจอเหมือนกับผมมั้ย การใช้ OpenCV เปิด stream จะมี dalay อยู่พอสมควร เมื่อเทียบกับ gstreamer ที่สามารถกำหนด option เพื่อลด delay ได้ สุดท้ายก็เลยเปลี่ยนมาใช้การ capture frame ด้วย gstreamer ครับ

มีนาคม 25, 2016

Qt5.6/OpenCV compilation on Raspbian Jessie

Filed under: Development,Embedded,hardware,Image Processing,Linux,OpenGL,Qt,Raspberry Pi — สี่สิบดีกรี @ 11:52 am

ยังไม่ได้ลอง Raspberry Pi 3 ตัวใหม่เลยครับ แต่วันนี้จะมาเล่าเรื่องการคอมไพล์ Qt และ OpenCV ให้ฟัง

สืบเนื่องจากการใช้งาน Qt บน Wheezy จากการทำ cross compilation ตาม http://www.ics.com/blog/building-qt-5-raspberry-pi ไปใช้งานคราวก่อน มีปัญหากับ qml/UI ไม่ทราบว่าเป็นเพราะอะไรเหมือนกัน พอต้องพัฒนาโปรแกรมต่อก็เลยตัดสินใจย้ายมา Jessie ตัวล่าสุด นี่อาจเป็นการตัดสินใจที่พลาดอีกครั้ง อย่างไรก็ดี ปัญหามีไว้ให้แก้ครับ ก็เลยตัดสินใจเปลี่ยนมาใช้ Qt5.6 ซะเลย ซึ่งก็นั่งคอมไพล์ใหม่เนื่องจาก ไม่อยากใช้งานแพคเกจ Qt/x11 ซึ่งทำให้การบูทช้า ก็เลยทำตาม https://wiki.qt.io/RaspberryPi2EGLFS ทำให้ได้ใช้ Qt แบบ cross platform development กะเค้ามั่ง ทดสอบ QML/UI แล้วไม่มีปัญหา

ต่อมาก็มาถึงเรื่องการใช้งาน OpenCV แน่นอนว่าก็ต้องใช้กับ RaspiCam เพื่อดีงภาพจากกล้อง ปัญหามันอยู่ตรงนี้ละฮะท่านผู้ชมฮะ เกิดปัญหาว่า compiler ของ cross กับบน jessie เวอร์ชั่นไม่ตรงกัน ซึ่งของ cross จะเก่ากว่าบน jessie ทำให้การคอมไพล์โปรแกรมไม่สำเร็จ หลังจากที่หาทางแก้อยู่สองวันสองคืน ก็สรุปได้ว่า ต้องกลับไปใช้ gcc4.8 สำหรับ jessie แล้วคอมไพล์ OpenCV ใหม่ รวมถึง dependency หรือ 3rd party ของมันด้วย จึงจะสามารถทำงานต่อได้

Screenshot from 2016-03-25 12:03:22การเขียนโปรแกรมจึงไม่ใช่แค่การเขียนโปรแกรมนะครับ …

กันยายน 7, 2015

ทดลองทำ OCR บน Raspberry Pi 2

Filed under: Development,Embedded,Image Processing,Linux,Qt — ป้ายกำกับ:, , — สี่สิบดีกรี @ 11:35 am

วันก่อนได้ทดลองทำงานต้นแบบอ่านตัวเลข  หรือการทำ 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

ก็ประมาณนี้ละครับ ผมไม่ค่อยได้ใส่โค้ดเข้ามาในบล็อก เพราะสามารถหาเอาจากที่อื่นได้อยู่แล้ว ส่วนที่สำคัญคือการเรียนรู้ ไม่ใช่ผลลัพธ์ครับ

กันยายน 23, 2014

QR decoder app on Android

Filed under: Android,Embedded,Image Processing,Linux,Qt — ป้ายกำกับ:, , , , — สี่สิบดีกรี @ 7:57 pm

Screenshot_2014-09-23-18-27-55

คราวก่อน เขียนโปรแกรม 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 เป็นอะไรที่เจ๋งจริงๆเลยครับ อิอิ

Powered by WordPress