Saturday, November 26, 2011

Speed Test

วันนี้ว่างๆเลยลองมาทดสอบความเร็ว (แบบบ้านๆ) กับการเข้าถึงพิกเซลของสามโปรแกรม คือ MATLAB, OpenCV (C++) และ ImageJ (JAVA) โดยใช้รูปขนาด 256x256 pixels มาทำ image negative (inverse) ด้วยโค้ดปกติของแต่ละอัน นั่นคือ
  • MATLAB ใช้ J = 255-I;
  • OpenCV และ ImageJ ใช้ลูป 1 ชั้น ประมวลผลรูปแบบเวกเตอร์
เวลาที่ใช้ (โดยประมาณจากโค้ดในการวัด กับดูที่โปรแกรมแสดง) เป็น 0.000075, 0.00062, 0.0030 วินาทีตามลำดับ

ต่อมา ทดลองเพิ่มขนาดรูปเป็น 2550x1900 พิกเซล เวลาโดยประมาณเป็น 0.006, 0.05, 0.12 วินาทีตามลำดับ

เห็นตัวเลขแล้วแปลกๆ ทำไม MATLAB ถึงได้เร็วขนาดนี้ แสดงว่าถ้าประมวลผลทีละพิกเซล MATLAB มีการ optimize โค้ดแบบเมตริกซ์ที่ดีมาก

โอกาสต่อไปจะลองทำการ convolution แล้วมาเทียบกันดูครับ

Saturday, October 1, 2011

Flip image & display

วันนี้ลองมาใช้ฟังก์ชันง่ายๆ เพื่อ flip รูปกันครับ

ผลลัพธ์ที่ต้องการ

เช่นเดียวกันครับ ถือว่ารูปอยู่ที่เดียวกับไฟล์ output
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{
 //Read file and load to variable
 Mat image = imread("lenag.jpg"); 
 //If read failure
 if(!image.data)
 {
  return -1;
 } 
 //Create a window to display the image 
 namedWindow("Original image");
 //Show the image
 imshow("Original image",image);

 //Create another image for result
 Mat result;
 flip(image, result, 1); //1=horizontal, 0=vertical, -1=both
 //Create a window to display the image 
 namedWindow("Output image");
 //Show the image
 imshow("Output image",result);

 //Wait for user to press any key
 waitKey(0);
 return 0;
}

สังเกตว่ามีการสร้าง 2 หน้าต่างเพื่อแสดง input และ output

มีการตรวจสอบว่าอ่านรูปได้หรือไม่ โดย if(!image.data)

และมีการกลับรูปโดยใช้คำสั่ง flip(image, result, 1);     //1=horizontal, 0=vertical, -1=both

จะเห็นว่า OpenCV2 พยายามทำให้รูปแบบการใช้งานคำสั่งต่างๆ ดูง่ายขึ้นกว่ารุ่นก่อนๆครับ

Friday, September 30, 2011

OpenCV 2.31 & MinGW (Dev-C++) Part 3

มาทดสอบ library ที่เราคอมไพล์แล้วดูครับ

ตอนนี้เราก็จะมีโฟลเดอร์ C:\OpenCV ที่เก็บ library ที่ต้องใช้ในการเขียนโปรแกรมของเรา (bin,include,lib,doc) ให้เซ็ต path ของ windows ไปที่ C:\OpenCV\bin ด้วยครับ

เปิด Dev-C++ เลยครับ
เลือกเมนู Tools / Compiler Options แล้วเพิ่มในส่วนของ linker ตามนี้ครับ
-lopencv_core231 -lopencv_highgui231 -lopencv_imgproc231 -lopencv_features2d231 -lopencv_calib3d231 บางตัวก็อาจจะไม่ได้ใช้สำหรับทุกโปรแกรม แต่ก็ไม่เป็นไรครับ มีเกินไว้ก่อนก็ได้


จากนั้นก็กำหนดแทบ Directories ต่างๆตามนี้ครับ


-Binaries
C:\mingw\bin
C:\OpenCV\bin

-Libraries
C:\mingw\lib
C:\OpenCV\lib

-C++ Includes
C:\mingw\include
C:\OpenCV\include

ตอนนี้เราก็พร้อมที่จะเขียนโปรแกรมทดสอบแล้วครับ

สมมติว่ามีไฟล์ lenag.jpg อยู่ที่เดียวกับตัวไฟล์ผลลัพธ์ของโปรแกรมนะครับ
ผลลัพธ์ที่น่าจะได้


เอกสารอ้างอิง
http://opencv.itseez.com/doc/tutorials/introduction/display_image/display_image.html#display-image

OpenCV 2.31 & MinGW (Dev-C++) Part 2

เมื่อจะคอมไพล์ source code เอง ก็ต้องมีเครื่องมือให้พร้อมครับ

เดิมทีผมคิดว่าคงเป็นการยาก ไม่ทำดีกว่า แต่ได้อ่านในคู่มือ http://opencv.willowgarage.com/wiki/MinGW ก็น่าจะทำได้

โปรแกรมที่ต้องการนะครับ
  1. MinGW (gcc) ความจริงตัวนี้ก็มีใน Dev-C++ ครับ แต่ว่าเก่าแล้ว เลยไปดาวน์โหลดตัวใหม่กว่ามา มีให้เลือกหลายที่ครับ ผมใช้ http://get.qt.nokia.com/misc/MinGW-gcc440_1.zip เพราะว่าจะลองทดสอบกับ Qt ด้วยภายหลัง สมมติว่าโหลดมาแล้วและก็แตกไว้ที่ C:\mingw นะครับ ให้เซ็ต path ของ windows ไปที่ C:\mingw\bin ด้วยนะครับ
  2. OpenCV source ก็ได้จากการแตกไฟล์ที่ดาวน์โหลดมาคือ OpenCV-2.3.1-win-superpack.exe ครับ สมมติว่าอยู่ที่ C:\OpenCV231Source
  3. CMake สำหรับสร้าง makefile เพื่อคอมไพล์ครับ จะช่วยให้คนที่ไม่รู้เรื่องในการคอมไพล์เช่นผมทำงานได้ง่ายขึ้นมาก ดาวน์โหลดที่นี่ครับ http://www.cmake.org/files/v2.8/cmake-2.8.5-win32-x86.zip สมมติว่าแตกไว้ที่ C:\CMake
ขั้นตอนต่อไปก็ไปเรียกไฟล์ชื่อ cmake-gui ใน C:\CMake\bin ครับ (ใน win7 ให้ run as admin ด้วยนะครับ)

จากนั้น กำหนดค่าของสองช่องด้านบน
ช่องแรก browse ไปที่ source code ของ OpenCV เช่น C:\OpenCV231Source
ช่องสอง browse ไปที่โฟลเดอร์ใหม่ที่ต้องการเก็บผลลัพธ์ของการคอมไพล์ เช่น C:\OpenCV231

จากนั้นคลิกปุ่ม Configure ครับ เลือกตามรูป

จากนั้นก็ browse เลือกคอมไพเลอร์ครับ
แล้วก็ finish
ในขณะนี้โปรแกรมก็จะทำการตรวจสอบ เช็คค่าพารามิเตอร์ต่างๆครับ
ถ้าเสร็จแล้ว ในช่องข้อความล่างสุดแสดงคำว่า configuring done ก็เป็นอันใช้ได้ครับ จะเกิดแถบสีแดงๆตรงช่องกลางเต็มไปหมด


ในคู่มือบอกว่า ให้กำหนดค่าเพิ่มหนึ่งค่าคือ CMAKE_BUILD_TYPE  ให้เป็น Releaseตามรูปครับ

จากนั้นก็กด Configure อีกครั้ง แถบสีแดงก็จะหายไป
ให้กด Generate ถ้าเสร็จแล้ว ปิด CMake ได้

ไปที่ dos prompt แล้ว เข้าไปที่ไดเรกทอรีผลลัพธ์ เช่น C:\OpenCV231
พิมพ์ mingw32-make แล้วรอๆๆๆๆๆ นานอยู่ครับ

ความจริงถึงขั้นตอนนี้ก็เสร็จแล้วครับ แต่ถ้าอยากได้แค่ตัวหลักๆสำหรับการใช้งาน ให้ใช้ dos prompt ที่ไดเรกทอรีเดิม แล้วพิมพ์ mingw32-make install

จากนั้น จะพบว่าในไดเรกทอรีย่อย install จะมีไฟล์ทุกอย่างพร้อมใช้งานครับ ซึ่งหลักๆก็จะมีไดเรกทอรีย่อย bin, lib, include,doc ซึ่งสามารถแจกจ่ายให้คนที่ไม่ต้องการคอมไพล์เองก็ได้

สมมติว่าเราจะสำเนาทุกๆไฟล์ในไดเรกทอรี install นี้ไปไว้ยัง C:\OpenCV เพื่อใช้งานต่อไปนะครับ

เป็นอันว่าเราได้คอมไพล์และลิงก์ OpenCV สำเร็จ ได้ library ต่างๆที่เราต้องการแล้วครับ

เอกสารอ้างอิง
http://opencv.willowgarage.com/wiki/MinGW
http://www.cmake.org
http://www.mingw.org/

OpenCV 2.31 & Mingw (Dev-C++) Part 1

OpenCV เวอร์ชันล่าสุด 2.31 ออกมาได้ระยะหนึ่งแล้วครับ

พอดีว่าผมกลับมาอยากใช้ OpenCV บนวินโดวส์ในช่วงนี้ โดยเฉพาะตัวล่าสุดที่มีฟังก์ชันใหม่ๆที่น่าสนใจ

เลยไปดาวน์โหลดจาก http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/ มาครับ

ได้ไฟล์ OpenCV-2.3.1-win-superpack.exe มาครับ มีทุกอย่างเลย ทั้ง source code และ binary (ที่คอมไพล์มาแล้ว) แตกไฟล์ได้ 1 GB :(

ในส่วนของ binary มีทั้งของ x86(32 bits) x64 มีทั้งสำหรับ mingw VC9 VC10

สำหรับผมวางแผนว่าจะใช้กับ mingw (Dev-C++) ก็เลยยิ้ม เพราะมีให้ใช้

กำหนดไดเรกทอรีต่างๆเสร็จ คอมไฟล์ผ่าน ดีใจๆ

แต่ ลองรันโค้ดตามตัวอย่างครับ ไม่ผ่าน เด้งออกตลอด

คราวนี้งงเลยครับ นั่งเสิร์ชหาในเน็ตกระหน่ำ ลองกับโปรแกรมตัวอื่นๆก็ยังไม่เวิร์ค

จะเปลี่ยนไปใช้ Visual C++ ก็ยังไม่อยากใช้

หากันอยู่หนึ่่งวันเต็มๆ สุดท้ายตัดสินใจคอมไพล์ source code ใหม่เลยก็แล้วกัน