09 สิงหาคม 2553

ทำ Image Wraping

ทำ Image Wraping
เริ่มต้นอ่าน Android ของพี่หนึ่ง ที่ Android
และได้อ่าน Paper ของ Paul Heckbert ในหนังสือ Fundamental of Texture Mapping and Image Wraping โหลดได้ ที่นี่
จึงค้นพบวิธี Wrap อีกวิธีหนึ่งซึ่งเร็วกว่าซึ่งจะมาดูว่าเร็วกว่าอย่างไร

การ Wrap จาก Quadrilateral to Quadrilateral แบ่งเป็น 2 แบบ
1. การแปลงแบบ Case 3 คือ แปลงจาก Quadrilateral to Quadrilateral โดยตรง
จะใช้ สมการ 8 สมการ เพื่อหา Unknown 8 ตัว a-h

สำหรับ map จุด (u,v) ใน Quadrilateral ต้นทางไปยัง จุด(x,y) ใน Quadrilateral ปลายทาง
โค๊ดตัวอย่างใน matlab

2. ทำ Case 2 แล้วตามด้วยการทำ Case 1
ซึ่งสูตรได้มาจากการแก้สมการเพื่อหา Case 1 ซึ่งเป็น Unit Square to Quadrilateral  โดยเริ่มหามาจาก
สมการในรูปทั่วไป Quadrilateral to Quadrilateral แบบ 8x8 symtem


นำมาแทนค่าในสมการด้วยค่าดังนี้

จะได้ 8 สมการดังนี้



จากใน Paper เค้าบอกว่า สามารถคำนวณเป็น Close Form ได้เลย
หากแทนเพิ่ม พจน์

จะได้ Close Form ดังนี้
ซึ่งทำให้คำนวน a-h พารามิเตอร์ของ case 1 ได้ วิธีนี้มีข้อดีที่ใช้เวลาในการคำนวนน้อยกว่าแบบแรกมาก
โค๊ดตัวอย่าง case 1 ใน matlab
ต่อจากนั้นคำนวนหา case 2 โดย คำนวนหา Unit Square to Quadrilateral (ทิศทางจะตรงข้ามกับลูกศรในภาพ)
เมื่อได้ a-h พารามิเตอร์แล้วค่อยนำมาทำ Inverse หา A-H แทน
ด้วยสมการ (สมการนี้ใช้อักษร s t เป็นจุดใน Unit Square แทน u v ตามลำดับ)

 
ดังนั้นหากเราต้องการหาว่า (x,y) ใน Quadrilateral to Quadrilateral สามารถใช้งานได้ดังนี้

จะได้ (s,t) ที่อยู่ใน Unit Square
โค๊ดตัวอย่าง case 2 ใน matlab

x' = (as + bt +c)/(gs + ht + i)
y' = (ds + et +f)/(gs + ht + i)
จะได้ (x',y') ที่อยู่ใน Quadrilateral ปลายทางที่เราต้องการ Wrap ไป
โค๊ดตัวอย่างการ warp Quadrilateral to Quadrilateralโดยใช้ Go Wrap Matlab

ทดสอบความคลาดเคลื่อนการ warp แบบ Case 3 เทียบ กับ Case 1 + Case 2
โดยใช้จุดมุมของสีเหลี่ยมต้นทางไปยังสีเหลี่ยมปลายทาง
แล้ววัดค่าความคาดเคลื่อนจากจุดมุมที่แท้จริงของสีเหลี่ยมปลายทาง
ได้ผลออกมาดังนี้
Go Wrap Matlab Library

หมายเหตุระยะทางหน่วยเป็น Pixel

จะสังเกตุได้ว่าค่าที่คลาดเคลื่อนเกิดขึ้นในแนวแกน x เท่านั้น และคลาดเคลื่อนอยู่ในระดับที่ยอมรับได้

ดาวน์โหลด Go Wrap Matlab Library










08 สิงหาคม 2553

ห้องแล็บที่ HCI ที่ FIBO กำลังจะกลายเป็นแบบนี้

ห้องแล็บที่ HCI ที่ FIBO กำลังจะกลายเป็นแบบนี้
Augmented Reality Museum

Interactive Real-size Hologram

07 สิงหาคม 2553

ซอร์สโค้ด Matlab การทำอินเวอร์ส Transformation ของการแม็บ สีเหลี่

ซอร์สโค้ด Matlab การทำอินเวอร์ส Transformation ของการแม็บจุดใน สีเหลี่ยมใดๆ ไปสีเหลี่ยมใดๆ
Keyword: การแม็บจุดจากสี่เหลี่ยมใดๆไปยังสี่เหลียมใด, Quadrilateral to Quadrilateral mapping, inverse, matlab, Algorithm, Source Code

ถ้าหากเรามีพารามิเตอร์  a-h ที่แปลงจาก สีเหลี่ยมQ ไป สีเหลี่ยมR แล้ว
หากต้องการหาพารามิเตอร์ a-h ที่แปลงจาก สีเหลี่ยมR ไป สีเหลี่ยมQ
สามารถใช้วิธีการ Inverse ได้
การทำ Inverse มี 2 วิธี
1 หาอินเวอร์สเมตริกธรรมดาตรงๆ
ข้อดี ง่ายตรงไปตรงมาก ได้ค่าที่ถูกต้อง
ข้อเสีย ใช้เวลาในการคำนวณมาก
input: Transformation matrix ที่มีพารามิเตอร์ a-h
output: Transformation matrix ที่มีพารามิเตอร์ A-H
%% inverse simple  
% map destination quadrilater to source qudrilater
iTf = inv(Tf);
A = iTf(1,1);
B = iTf(1,2);
C = iTf(1,3);
D = iTf(2,1);
E = iTf(2,2);
F = iTf(2,3);
G = iTf(3,1);
H = iTf(3,2);
I = iTf(3,3);

% Ex sample
% use point from previous step (x,y)
% if inverse correct (u,v) must close to (154,154)

W = G*x + H*y + I;
u = (A*x + B*y + C) / W
v = (D*x + E*y + F) / W

2 หาอินเวอร์แบบใช้สูตรClose From(ไม่ทราบที่มาขออภัยด้วย search เจอในเน็ต)
ข้อดี ใช้เวลาคำนวนน้อย เขียนโปรแกรมง่าย
ข้อเสีย ได้ค่าที่ใกลเคียง มี Error เพียงเล็กน้อย
input: Transformation matrix ที่มีพารามิเตอร์ a-h
output: Transformation matrix ที่มีพารามิเตอร์ A-H
%% inverse faster but have a little error
% Reference Mapping to Polygon Mesh Object
% invF = (1/ae-bd)*[ ei?fh   ch?bi   bf?ec ]
%                  | fg?di   ai?cg   dc?af |
%                  [ dg?eg   bg?ah   ae?bd ]
A = e*i - f*h;
B = c*h - b*i;
C = b*f - e*c;
D = f*g - d*i;
E = a*i - c*g;
F = d*c - a*f;
G = d*g - e*g;
H = b*g - a*h;
I = a*e - b*d;


iTf = (1/(a*e - b*d))* [A B C; D E F; G H I];
A = iTf(1,1);
B = iTf(1,2);
C = iTf(1,3);
D = iTf(2,1);
E = iTf(2,2);
F = iTf(2,3);
G = iTf(3,1);
H = iTf(3,2);
I = iTf(3,3);

% Ex sample
% use point from previous step (x,y)
% if inverse correct (u,v) must close to (154,154)

W = G*x + H*y + I;
u = (A*x + B*y + C) / W
v = (D*x + E*y + F) / W

ดาวน์โหลด Source Code

ข้อมูลอื่นๆที่เกี่ยวข้อง
การหา Transformation Matrix การแม็บจุดจากสี่เหลี่ยมใดๆไปยังสี่เหลียมใด

ซอรสโค้ด Matlab การแม็บจุดจากสีเหลี่ยมใดๆต้นทาง ไปยังจุดที่อยู่ใน

ซอรสโค้ด Matlab การแม็บจุดจากสีเหลี่ยมใดๆต้นทาง ไปยังจุดที่อยู่ในสี่เหลี่ยมใดๆปลายทาง
Keyword: การแม็บจุดจากสี่เหลี่ยมใดๆไปยังสี่เหลียมใด, Quadrilateral to Quadrilateral mapping, inverse, matlab, Algorithm, Source Code

input :
    จุดมุมในสีเหลี่ยมใดๆต้นทาง 4 จุด คือ (u0,v0), (u1,v1), (u2,v2), (u3,v3)
    จุดมุมในสีเหลี่ยมใดๆปลายทาง 4 จุด คือ (u0,v0), (u1,v1), (u2,v2), (u3,v3)
    จุดที่ต้องการแม็บ สีเหลี่ยมต้นทาง ไปยังสีเหลี่ยมปลายทาง (u,v)  
output:
    จุดที่อยู่บนสีเหลี่ยมปลายทาง
Source Code
% Quadrilateral to Quadrilateral
% By Nemin Suksen
% Master Degree FIBO, KMUTT, Thailand
% Reference:  pages 17-21 of Fundamentals of Texture Mapping and Image Warping, Paul Heckbert,
% Master’s thesis, UCB/CSD 89/516, CS Division, U.C. Berkeley, June 1989,
% URL=http://www.cs.cmu.edu/˜ph.
% Thank Nung Navakun Sebang for paper sample data and suggestion
clc; clear all; close all;
%% Source Quadrilateral  
% 4 Point of Quadrilateral = (u0,v0), (u1,v1), (u2,v2), (u3,v3)
u0 = 7;
v0 = 171;
u1 = 294;
v1 = 168;
u2 = 307;
v2 = 2;
u3 = 1;
v3 = 2;

%% Destination Quadrilateral
% 4 Point of Quadrilateral = (x0,y0), (x1,y1), (x2,y2), (x3,y3)
x0 = 10;
y0 = 190;
x1 = 310;
y1 = 190;
x2 = 310;
y2 = 10;
x3 = 10;
y3 = 10;

%% slove 8 equation to find 8 unknowns a-h
C =[ u0  v0  1  0  0  0 -u0*x0 -v0*x0
     u1  v1  1  0  0  0 -u1*x1 -v1*x1
     u2  v2  1  0  0  0 -u2*x2 -v2*x2
     u3  v3  1  0  0  0 -u3*x3 -v3*x3
     0   0   0  u0 v0 1 -u0*y0 -v0*y0
     0   0   0  u1 v1 1 -u1*y1 -v1*y1
     0   0   0  u2 v2 1 -u2*y2 -v2*y2
     0   0   0  u3 v3 1 -u3*y3 -v3*y3];
% [C] * [unknow] = [Destination 4 point]
% slove to fine unknow matrix by invert C method
D4p= [x0; x1; x2; x3; y0; y1; y2; y3];
Unknown = inv(C) * D4p
a = Unknown(1);
b = Unknown(2);
c = Unknown(3);
d = Unknown(4);
e = Unknown(5);
f = Unknown(6);
g = Unknown(7);
h = Unknown(8);
i = 1;
Tf = [a b c; d e f; g h i];

%% Ex sample

%point in source quadrilateral = (154,154)
u = 154;
v = 154;

% point in destination qudrilateral
% w = gu+hv+1
% x = (au+bv+c)/w
% y = (du+ev+f)/w
w = g*u + h*v + 1;
x = (a*u + b*v + c) / w
y = (d*u + e*v + f) / w
ดาวน์โหลด Source Code

เกร็ดความรู้เรื่องอินเวอร์ส
 หากเรามีพารามิเตอร์  a-h ที่แปลงจาก สีเหลี่ยมQ ไป สีเหลี่ยมR แล้ว
หากต้องการหาพารามิเตอร์ a-h ที่แปลงจาก สีเหลี่ยมR ไป สีเหลี่ยมQ
สามารถใช้วิธีการ Inverse ได้

06 สิงหาคม 2553

การทำแปลงจาก รูปสีเหลี่ยมจัตุรัสเป็นสีเหลี่ยมด้านไม่เท่ากัน หรือ การว๊าบ image wraping

การทำแปลงจาก รูปสีเหลี่ยมจัตุรัสเป็นสีเหลี่ยมด้านไม่เท่ากัน หรือ การว๊าบ image wraping

Paper ที่ได้มาจาก พี่หนี่ง ขอบคุณมานะที่นี้
แต่ค่อนข้างยืดยาว
จึงต้อง Search แต่ keyword ว่า
image wraping จะเจออย่างอื่นที่ไม่ค่อยเกี่ยวซะส่วนใหญ่
จึงค้นพบว่าเราควรใช้
keyword : square to quadrilateral
เจอ สไลด์การสอนที่อ่านง่ายมากมาย
ลองโหลดไปอ่านกันดูได้ ที่นี่

01 สิงหาคม 2553

ใช้อากาศ เป็นฉากโปรเจคเตอร์

นอกจาก Hologram ที่เป็นการฉายภาพ 3 มิติ ในอากาศ
ยังมีการฉายภาพโดยโปรเจคเตอร์โดยใช้อากาศเป็นฉาก ซึ่งถ้ามองในมุมมองเดียว
จะได้ภาพที่ไม่แตกต่างจาก Hologram เลยทีเดียว นอกจากนี้ยังมีสีสันดีกว่าด้วย
แต่ฉากค่อนข้างจะพริ้วไหว ยังไม่คงที่เท่าที่ควร

ผมยังไม่ทราบหลักการที่แน่ชัด ว่ามันทำงานอย่างไร
อาศัยดูจากคลิป และการคาดคะเนจาก Hardware ว่าน่าจะใช้หลักการสร้างความแตกต่างของความหนาแน่น
ของอากาศ ทำให้เหมือนกับว่าแสงเดินทางผ่านตัวกลางที่มีดัชนีหักเห ไม่เท่ากัน
จึงน่าจะทำให้เกิดการกระเจิงออกมาเป็นภาพ http://numpang69.exteen.com/20060613/entry-8
เช่นเดียวกับที่ทำให้เราเห็นภาพขอบฟ้า

ตัวฉากเป็นที่เป่าลมขนาดใหญ่
เข้าไปดูรายละเอียด Hardware ที่ http://www.io2technology.com/specifications

ดุตัวอย่างการใช้งานได้ที่ http://www.io2technology.com/examples


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

บริเวณที่เป็นแสงหลอดไฟที่โดนควัน ดูแล้วเห็นการกระเจิงชัดเจนเลย




31 กรกฎาคม 2553

การติดตั้งกล้องและโปรเจคเตอร์บน Pan/Tilt Camera Head

การติดตั้งกล้องและโปรเจคเตอร์บน Pan/Tilt Camera Head

Biclops Camera Head รุ่นนี้ออกแบบมาให้ติดตั้งกล้องที่แกนจุดหมุนของการ Tilt
เพื่อให้ใช้แรงน้อยที่สุดในการเอาชนะแรงโน้มถ่วงของโลก โดยให้เกิดโมเมนต์น้อยที่สุด

ฐานเชื่อมต่อของกล้องกับ Camera Head ไม่ได้ออกแบบมาติดตั้งโปรเจคเตอร์
จึงออกแบบการยึดใหม่ออกมาได้ดังภาพ

ติดตั้งกล้องทางด้านซ้ายและโปรเจคเตอร์ทางทางขวา กลับหัวแบบบนลงล่างทั้งคู่
เมื่อทดสอบการฉาย


แต่เฟรมภาพที่ได้จากกล้องไม่สามารถเห็นภาพการฉายโปรเจคเตอร์ได้ทั้งหมด ประกอบกับแสงของโปรเจคเตอร์ยังมีความเข้มไม่เพียงพอ
ทำให้เห็นภาพจากการฉายเป็นภาพลางๆ ซึ่งอาจทำให้มีผลในการทำ registration เพราะไม่สามารถทราบได้ว่า
แสงที่ฉายไปตรงกับวัตถุหรือไม่ จึงต้องพิจารณา กล้องที่มีประสิทธิภาพดีกว่านี้


ปัญหาอื่นๆ
1. สายสัญญาณติดพื้น ขณะที่ Camera Head ทำ Homing
2. จุดที่ยึดติด โปรเจคเตอร์เป็นแบบ น็อตไขเข้าไป จึงไม่เหมาะกับฐานที่หมุนได้
   เมื่อฐานหมุนหลายๆครั้งน็อตจะคลายตัวเนื่องจากโมเมนต์ไม่เท่ากัน
3. ไม่สามารถร้อยสายสัญญาณโปรเจคเตอร์และกล้อง ที่จุดกลางของ Camera Head
   ได้เนื่องจากหัวเชื่อมต่อใหญ่กว่าช่องว่างที่มีให้

งานที่ต้องทำต่อเพื่อแก้ไขข้อบกพร่อง
1. ตั้งกล้องและโปรเจคเตอร์ให้ใกล้กันกว่านี้
2. ออกแบบฐานการวางโปรเจคเตอร์และกล้องใหม่
3. หาซื้อสายสัญญาณที่หัวเล็กกว่านี้ และ มีความอ่อนตัวกว่านี้


28 กรกฎาคม 2553

โปรเจ็คภาเป็น 3 มิติใช้หลักการฉาย code ภาพเหมือนกัน

ใช้อากาศเป็นฉากโปรเจ็คเตอร์

ที่มา http://www.io2technology.com/specifications

การแสดงผล โปรเจ็คเตอร์ไปยัง ระนาบใดๆ

จอนห์นี ลี ได้โชว์การฉายโปรเจ็คเตอร์ไปยัง ระนาบภาพใดๆ โดยหาตำแหน่งกรอบของภาพจาก แสงที่ฉายออกไปเป็น code ในด้านแนวตั้งและแนวนอน
โดยแบ่งครึ่งภาพไปเรื่อยๆ คล้ายหลักการของเลขฐาน 2
ตัวเซ็นเซอร์ไฟเบอร์ออฟติกที่อยู่ที่มุมของกรอบสีเหลี่ยม
จะเกิด Pulse code ตามแสงที่ได้รับ ทำให้สามารถบอกได้ว่า
มุมนี้อยู่ที่ตำแหน่งใดของและใช้วิธีการ Warp

ARmirai




ที่มา http://pseudospace.blogspot.com/2008/12/figma-mirai-meets-augmented-reality.html

13 กรกฎาคม 2553

สร้างโมเดลการโปรเจคภาพโดยไม่ต้องคำนวณระยะทางระหว่างวัตถุและโปรเจค

สร้างโมเดลการโปรเจคภาพโดยไม่ต้องคำนวณระยะทางระหว่างวัตถุและโปรเจคเตอร์
แนวคิดของหลักการนี้ มาจากสมมติฐานว่า
เมื่อกล้องรับภาพจะเกิดการโปรเจคภาพแบบ Perspective ด้วยเลนส์ของกล้องให้เป็นพิกัด (X,Y)
หากเราสามารถสร้างแสงฉายกลับไปยังพิกัด (X,Y) นั้นจะเกิดภาพกลับไปที่วัตถุ
จึงสร้างออกมาเป็นแบบจำลองทางเลขาคณิตได้ดังนี้

แบบจำลองนี้กล้องและโปรเจคเตอร์อยู่ที่จุดเดียวกัน มองไปที่ตำแหน่งของวัตถุเดียวกัน
ถ้าภาพปรากฏที่ (X,Y) แล้ว เราสามารถสร้างภาพที่ตำแหน่ง (X,Y) เพื่อฉายกลับไปที่วัตถุได้
แต่โมเดลนี้ไม่สามารถเกิดขึ้นจริงได้เนื่องจาก กล้องและโปรเจคเตอร์ไม่สามารถอยู๋ในตำแหน่งเดียวกันได้
มุม Fovy ของกล้องและโปรเจคเตอร์ไม่เท่ากัน กล้องและโปรเจคเตอร์มี Distroion

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

เมื่อวัตถุทั้งชิ้นอยู่ในลักษณะขนานกับแกน Z หรือบิดเบือนไม่มาก จะเกิด Error ไม่เกิน 1%
แต่หากมีความแปรปรวนในแกน Z มากจะมี Error สูงขึ้น

จากภาพจะเกิด Error สูงถึง 7% ซึ่งในความเป็นจริงแล้วการวางวัตถุในลักษณะดังกล่าวเอง
เป็นลักษณะที่ไม่เหมาะสมกับฉายด้วยโปรเจคเตอร์อยู่แล้ว
เพราะจุดบนโปรเจคเตอร์ที่สามารถฉายไปบนวัตถุมีจำนวนน้อย



HCI Trip @นครปฐม

HCI Trip @นครปฐม

เวลา รายการ ระยะ ทางรายละเอียด
6.00 ออกจากฟีโบ้ 46.1 กม. 59 นาที
7.00-13.00 พิพิธภัณฆ์หุ่นขึ้ผึ้ง ไทย
*
http://www.moohin.com/trips/nakhonpathom/model/
ล่องเรือเที่ยวนครปฐม
คลองมหาสวัสดิ์  เลือกซื้อขนม อาหารอร่อยๆ จิบกาแฟโบราณจากร้านกาแฟเก่าแก่
แผนที่ล่องเรือเที่ยว
http://www.moohin.com/018/botemap.shtml
14.00 ลานแสดงช้างและฟาร์ม จระเข้สามพราน17.5 กม ใช้เวลา 23 นาที *
http://www.elephantshow.com/home.htm
19.00 วัดพระปฐมเจดีย์ 25.1 กม. ใช้เวลา 24 นาทีรับประทานอาหารค่ำ ที่ตลาดโต้รุ่ง
ไอติมลอยฟ้า
http://www.moohin.com/trips/nakhonpathom/flyingicecream/
ของกินอร่อย
http://talk.edtguide.com /ตลาดโต้รุ่ง-พระปฐมเจดีย.html