User Tools

Site Tools


李宗樺:我的上課心得

week 1-1 (2010.6.28)

    今天早上在老師介紹學長姐的project的內容與賣點時,老師有提到很重要的一點
是"主題是否吸引人?"。就讓我想到現在的遊戲越出越多,不管是自製或是代理,沒隔
幾週總是會有很多廣告出來,什麼遊戲要開始封測、公測、正式營運...。常常看到很
多新遊戲一出來時總是人氣滿滿,過了幾個月就開始往下掉。應該就是內容不夠吸引人
,才會造成短暫的熱潮而已。不過有些遊戲代理商也是因素之一,似乎現在炒短線的例
子越來越多,撐不到一年就收掉伺服器。我覺得這就跟我們現在找題目時很像,只有少
數人喜歡的題目,就不是很理想,代表你的研究成果沒有賣點,也沒有市場。當時老師
有提到一點,如果你能做出家人都很喜歡很實用的題目你就算成功了。"如果我一年來的
研究能讓父母以我為榮",聽起來就很值得驕傲。

    近中午時有提到一款遊戲,螢幕就像一個窗口,可以移動頭部與眼睛視角去看到不同
的場景,配合攝影機偵測頭部與眼睛來呈現不同的畫面。那時候我就想到,每次在玩CS時
,經過轉角總會壓低身體,頭也會不自覺地伸出去一點,有點感覺是本能反應,感覺這樣
應該能多看到什麼。這時候前述的技術就很適合拿來用,這種技術用在FPS遊戲上似乎更
加真實。

week 1-2 (2010.7.1)

今天上課的兩個主題是找質數和兩數求最大公因數,
其中找質數的三個方法:
第一個是找比"質數小的數",去做%看餘數是否不為0。
第二個是找比"質數開根號小的數",去做%看餘數是否不為0。
第三個是用"篩子法",質數的倍數皆不是質數。
以前高中時也有教找質數的一些技巧,其中一個跟第二個方法相同,老師會要求我們至少
背1~30的次方數,用來檢視900以下的整數是否為質數。還有一個是跟篩子法很像,看是
否為質數的倍數,其中"2的倍數"為個位數字是偶數、"3的倍數"為各個數字相加是否為3的
倍數(EX:123→1+2+3=6,6為3的倍數,所以123亦為3的倍數)、"5的倍數"為個位數字是
0或5、"11的倍數"為奇數數字和減偶數數字和為0或11(EX:121→(1+1)-2=0,所以121
為11的倍數)。不過這種方式大概需要將數字存成整數字串,類似大數相乘的做法,讓他各
個位數可以做獨立運算。另外篩子法的證明"質數的倍數皆不是質數"(給定一質數P,一正整
數N,若某數Q=P*N,證明Q不是質數。因為Q的因數有〈1、P、Q、N、N的因數〉所以可知Q
非質數)。然後是找最大公因數的方法,主要是運用輾轉相除法的方式去求。以前老師有介紹
一本書是用多種方法去解同一問題,之前也有講到gcd求法,那有5種方法,程式碼如下:
// 1st gcd  2009-06-08 
#include<cstdlib>
#include<iostream>
using namespace std;

int main()
{
	int a,b,i=0;
	cout<<"輸入兩數a、b求最大公因數"<<endl;
	cin>>a;
	cout<<"a="<<a<<endl;
	cin>>b;
	cout<<"b="<<b<<endl;
	if(a>b)
	{
		for(i=b;i>0;i--)
		{
			if(a%i==0 && b%i==0)
				cout<<"公因數為"<<i<<endl;	
		}	
	}	
	else
	{
		for(i=a;i>0;i--)
		{
			if(b%i==0 && a%i==0)
				cout<<"公因數為"<<i<<endl;
		}	
	}	
	system("pause");
	return 0;	
}
// 2nd gcd  2009-06-08 
#include<cstdlib>
#include<iostream>
using namespace std;

int gcd(int a,int b)
{
	int c;
	if(a>b)
	{
		c=a%b;
		if(c==0)
			return b;
		else
			return gcd(b,c);
	}	
	else
	{
		c=b%a;
		if(c==0)
			return a;
		else
			return gcd(a,c);
	}		
}

int main()
{
	int a,b;
	cout<<"輸入兩數a、b求最大公因數"<<endl;
	cin>>a;
	cout<<"a="<<a<<endl;
	cin>>b;
	cout<<"b="<<b<<endl;
	cout<<"最大公因數="<<gcd(a,b)<<endl;
	system("pause");
	return 0;	
}
// 3rd gcd  2009-06-08 
#include<cstdlib>
#include<iostream>
using namespace std;

int gcd(int a,int b)
{
	int i;
	if(a>b)
	{
		for(i=b;i>0;i--)
		{
			if(a%i==0 && b%i==0)
				return i;	
		}	
	}	
	else
	{
		for(i=a;i>0;i--)
		{
			if(b%i==0 && a%i==0)
				return i;
		}	
	}	
}
int main()
{
	int a,b,i=0;
	cout<<"輸入兩數a、b求最大公因數"<<endl;
	cin>>a;
	cout<<"a="<<a<<endl;
	cin>>b;
	cout<<"b="<<b<<endl;
	cout<<"最大公因數="<<gcd(a,b)<<endl;
	system("pause");
	return 0;	
}
// 4th gcd  2009-06-08 
#include<cstdlib>
#include<iostream>
using namespace std;

int gcd(int a,int b)
{
	int c=a%b;
	if(c==0)
		return b;
	else
		return gcd(b,c);
}

int main()
{
	int a,b;
	cout<<"輸入兩數a、b求最大公因數"<<endl;
	cin>>a;
	cout<<"a="<<a<<endl;
	cin>>b;
	cout<<"b="<<b<<endl;
	cout<<"最大公因數="<<gcd(a,b)<<endl;
	system("pause");
	return 0;	
}
// 5th gcd  2009-06-08 
#include<cstdlib>
#include<iostream>
using namespace std;

int gcd(int a,int b)
{
	int c;
	while(b!=0)
	{
		c=a%b;
		a=b;
		b=c;
	}
	return a;
}

int main()
{
	int a,b;
	cout<<"輸入兩數a、b求最大公因數"<<endl;
	cin>>a;
	cout<<"a="<<a<<endl;
	cin>>b;
	cout<<"b="<<b<<endl;
	cout<<"最大公因數="<<gcd(a,b)<<endl;
	system("pause");
	return 0;	
}

week 2-1 (2010.7.6)

    今天上課是要使用webcam來得到影像的處理與應用,首先是要加裝套件到我們熟悉的Dev-C++環境,
與之前圖學時加裝OpenGL套件時相同 ,這次是加裝OpenCV套件。第一個是簡單顯示一張圖片的程式,
先準備好圖片並放在適合的路徑下,接著在"編譯器選項→編譯器"下加入Linker參數 -lcv -lcxcore -lhighgui,
"編譯器選項→目錄→二進位檔"下新增目錄D:\Program Files\Dev-Cpp\bin\opencv,經過這些設定就
可以執行OpenCV程式。再來是視訊的版本,註解掉部分秀圖的程式,並加入一段while即可讀到webcam
的畫面。

    為了同時使用兩個webcam,使用videoInput來讀筆電與外接裝置,可以在螢幕中顯示兩個攝影畫面
。後來拿外接webcam去拍筆電螢幕,可以有多重影像的特效,像是兩面鏡子對照的效果。然後放個物品
在影像中間,把他推倒就會在攝影畫面中出現像骨牌的效果,每個畫面都慢慢倒下形成殘影。這部分跟
日本常出現的校園七不思議事件之一很像,轉至知識+的故事補充在文末。

    下午問了老師一些問題,老師用了很多的方法來做出同樣的效果,不管是效率高的或是跨平台的方
式,也當場看到老師解決問題的流程與方法,透過一些網站提供的技術文件,改成適合我們使用的程式
,也有的是內建在命令提示字元裡的程式語法。每個問題都可以有很多解決方法,學會用不同的方式、
不同的角度去看一個問題,可以幫助自己更了解問題的關鍵所在。

http://tw.knowledge.yahoo.com/question/question?qid=1105070309567
七大不可思議之五: 
    在0時0分0秒的時候,學校有一面三合鏡。當你站在那三面鏡中間的話,你就可以看將來的你了。 
關於這個傳說,有一個女孩子試過一下。她在0時0分0秒的時候,站到了三合鏡中間,她也實現了她看將來的願望. 
第二起來,她去洗臉的時候,她看到鏡中的自己又是將來的自己。她嚇得摔倒在地下,不敢看鏡子。等她加神的時候,
再鼓起勇氣看了一下。鏡子又回到原來的自己,她便以自己睡不醒爲由來淡忘這件事。
    下午她上廁所時候,便又看了一下鏡子,這時鏡中的自己又老了很多,好像是30年後的自己。這以後,她以現自
己以後每照一下鏡,便發現鏡的自己老了許多。相對,自己也感到自己的身體也像在衰老。終於有一天,她看到自己的
老態龍鍾。過不了多久,她也死了,死因是身體各項器官衰老。 
    關於類似的流傳還有很多,比如晚上0時0分0秒,嘴裏叼著剃刀,看著臉盆裏的水,就會看到自己將來的物件;
3時33分33秒,站在鏡子可以看到自己的結婚物件;4時44分44秒可以看到鏡子裏的惡魔。

week 2-2 (2010.7.8)

    今天一早到學校練習程式,剛好也有電通的學弟們過來,所以我們也介紹一下瘋狂程設,
讓他們感受一下"破關"的快感。後來光一學長也有過來,大概跟我們說一下他目前的工作與一
些職場秘辛。學長有提到一個重點是,在業界寫程式是要注重可讀性,不管是變數名稱還是註
解都要有適當的標明。因為是輪班寫程式,你的程式要能給人接手,也要能看懂別人的進度。
像是學長說他目前在看老闆給他的一份程式,是之前的員工留下來的,學長說他的可讀性極低,
除了沒有註解之外,變數名稱也相當馬虎。在一個for loop裡也都只用數字,是知道他要執行
幾次,不過沒有明確的指出這段是在做什麼。還要從頭來看才能知道這部分是寫"遊戲任務"還是
"角色技能",像這樣就不是一份好的程式文件。

    之前也有聽學長說業界責任制的概念,在下班前都要更新自己的程式並標明修改範圍與差異‧
然後如果有被同事抓到程式執行有警告或是忘了釋放記憶體空間,是要罰錢的,依影響程度五十到
幾百不等,大家互相監督來提升程式品質。另外下午時還有一個小八卦,因為我們在討論CGW住宿
的問題時,有看一下大會議程中有個演講者是陳勇誠先生(鈊象電子),剛好學長在旁邊就稍微打聽
一下。學長說陳勇誠先生以前的老師就跟鈊象電子的董事有人脈關係,所以待在一個特殊的部門,
可以沒有進度只負責監督其他部門,學長比喻說就類似明朝的東廠一樣。透過這個小八卦,學長跟
我們說在大學時的老師多少都會熟悉業界生態,希望我們都能跟每個老師有良好的互動關係,對未
來升學或是就業都是相當有幫助的。   

CGW2010心得 (2010.07.15~16)

week 3-1 (2010.7.15)

參加交大CGW2010電腦圖學研討會
Day 1	2010.7.15
1.前言
2.大會演講(一)
3.Session A1: Rendering I
4.大會演講(二)
5.遊戲產業與技術論壇
6.Session B2: Animation I
7.晚宴與住宿
列出資料夾 PATH
磁碟區序列號碼為 84E4-4DB0
D:\CGW2010
    4.5.6.8.9.10
    11.12.13.14.15.16.18.19.20
    21.22.23.24.25.27.28.29
    31.32.33.34.35.38.39.40
    41.43.45.46.47.48
    52.53.54.59.60
    61.62.63.64.66.67.68    
子資料夾不存在 

54.pdf

week 3-2 (2010.7.16)

參加交大CGW2010電腦圖學研討會
Day 2	2010.7.16
1.大會演講(三)
2.大會演講(四)
3.Session C1: Animation II
4.Session D1: Mesh and Texture
5.結論與心得

week 4-1 (2010.7.19)

    今天開始使用課本上課,也覺得有個實際的方向可以去努力,另外還有中英頁碼對照,
可以當作工具書來快速查找需要的語法,是很方便的一點。今天主要是顯示多張圖片,從簡
單的顯示多張圖片與定位開始,再到使用for loop簡化冗長的程式碼,再進一步偵測滑鼠
在圖片上的座標,最後是以座標值的參數來決定關閉該視窗,可以增加與使用者的互動性。
其中偵測圖片座標時,會以圖片本身的大小為主,因此若是由程式來縮小圖片視窗時,座標
亦會等比例的呈現,所以會造成移動約一公分,座標顯示上百或上千的可能。第二個是關閉
指定視窗,因為座標是抓該張圖片的位置,並不是在螢幕上的座標,因此可以很方便的寫出
在座標為多少時關閉視窗的指令。但是當多視窗時就要指定關閉你目前正在移動的視窗,因
此cvSetMouseCallback(n[i], mouse ,n[i]);會有第三個參數,用來傳回是在操作
哪個視窗,並由cvDestroyWindow((const char*)param);關閉該視窗。

    中午時老師有提到讀入一張圖片,可以分割成多個視窗,如同電視牆的效果。說到分割圖
片,就容易聯想到拼圖這東西,如果能把電視牆的效果加以改良,讓他分割後的位置是隨機排
列,就能有拼圖的效果了,偵測視窗位置來確定每個視窗是否在正確位置,以for loop去確
定後即可顯示完成等字樣,再加上timer做出一些小限制,如開始幾秒後拼不出來,位置再隨
機打亂一次,甚至再換張圖之類的玩法。不過難度太高的東西好像不會吸引人,但是老師舉的
洛克人例子可能就是例外之一,明明過關很困難,但是還是會有死忠玩家支持他,就為了拼一
個過關後的成就感吧!

week 4-2 (2010.7.22)

    今天是程式集訓,我們先繼續練習瘋狂程設,在不定數排序時因為之前都沒有用過vector,因
此這部分卡了一段時間,今天經過老師的說明,大概了解要如何使用,首先#include <vector>
,接著宣告vector<int>array(n);,就能產生一個整數陣列array,其餘的讀入資料跟排序方法都跟
之前相同。而且vector是C++才有的功能,如果用C的寫法,他會跟你說在library中找不到。不過有
一點很奇怪的是,我之前在寫不定數時,都是直接讀入一個變數n,接著宣告int array[n];,這樣
就能達到我想要的效果,像是我之前寫的Sort.cpp就是用這種寫法去做不定數排序,不過老師卻說
這種用法是不合理的用法?

    接著是不定數排序的插入排序,因為題目有限制說程式碼不可以用到數字,因此請教老師後,
知道其中的演算法是只要在每一輪中找出最小的數字,跟前面數字對調即可,因為整個數列都是未
排序的資料,所以可以省下將每個資料往後移一位的時間,大大的縮短了程式執行的時間,也可以
通過題目的限制要求。雖然我們還沒完成瘋狂程式的練習,不過今天也還是進入了台大ACM培訓的系
統,試試看一些有趣又有挑戰性的題目。

    我們今天先練習的是台大熱身賽的題目,因為題目要求要根據輸入的字串長度來調整以符號畫
成的表格大小,而且每行格式都還有一些小限制,因此這部分就花了不少時間在列出每行格式的公
式。接著還要處理字串,根據輸入的字串去做比對,再複製存入我們想要的資料。再來是輸入的字
串也是不定數,可隨意輸入1~3行,因此也產生了一個是否要用二維字元陣列搭配for loop來存入字
串的問題。雖然當天上課時沒有寫完這一題,不過也大概了解整題的脈絡,看到有人第一次寫就能
在半小時內完成,真的讓我相當佩服。這題在建立表格時需要用到邏輯思考,在輸入資料時又需要
了解一些字串處理的函式,是一題很多元的題目。

    後來老師提到vector是一種Standard Template Library (STL),可以快速處理資料結構的函式
庫,就像是之前資料結構上過的也都包含在這裡面。如堆疊(stack),具有後進先出(Last In First 
Out:LIFO)的特性,以及佇列(queue)有先進先出(First In First Out:FIFO)的特性,都可以透過
STL來快速實作,以這種方式可以節省許多程式開發時間,也可以提高程式的可讀性,而且也有非常
強的擴充性,之前光一學長也有提到這部分在業界是相當常見的,我們應該要深入的學習STL。

葉正聖老師: 宗樺問了一個問題,為什麼要用 vector<int> array(n); 而不直接使用 int array[n]; 來宣告。老師剛剛也很驚訝 Dev C++ 所使用的 GNU C++ 3.4.2 竟然在會沒有問題。不過使用最新的 Microsoft Visual Studio 2010 去測試以下程式碼

#include <iostream>
using namespace std;
 
int main()
{
	int n;
	cin>>n;
	int a[n];
	for(int i=0;i<n;i++){
		a[i]=i;
		cout<<a[i]<<endl;
	}
	return 0;
}

會有以下的錯誤

C:\Users\erfgbn\Desktop>cl test_intn.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test_intn.cpp
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xlocale(323) : wa
rning C4530: C++ exception handler used, but unwind semantics are not enabled. S
pecify /EHsc
test_intn.cpp(8) : error C2057: expected constant expression
test_intn.cpp(8) : error C2466: cannot allocate an array of constant size 0
test_intn.cpp(8) : error C2133: 'a' : unknown size

由 C++ 之父所寫的 The C++ Programming Language 一書中提到, “In places such as array bounds, case labels, and initializers for enumerators, C++ requires a constant expression.” 意思就是在宣告 array 時,不能使用變數決定大小,而必須要const 的數。

葉正聖老師: 經過查證,在標準的C++ (1998年) 裡面是不能有類似 int array[n]; 的動態陣列大小的寫法,所以要使用動態陣列大小,就推薦要用 vector 的作法。 不過 1999年所訂的C 卻有這樣的擴充 – 所以 g++ 就在其 C++ 中有了這樣的擴充語法,但是,這是不具跨平台性的寫法,最好不要這樣寫。在以下的連結中可以看到詳細的解釋,尤其是要求 g++ 使用ansi 標準語法時,就會有錯誤如下:

C:\Users\erfgbn\Desktop>g++  -ansi -pedantic -W -Wall test_intn.cpp
test_intn.cpp: In function `int main()':
test_intn.cpp:8: error: ISO C++ forbids variable-size array `a'

參考網址: http://bytes.com/topic/c/answers/129779-variables-array-size-declarators

week 5-1 (2010.7.26)

    今天是專研集訓,老師先講解一下上週的觀念,其中一點是改變視窗大小的函式,需要先寫秀出圖
片cvShowImage("a", img);,再調整視窗大小cvResizeWindow("a", 200,200);,因為先調
大小再顯示圖片的話,圖片依然會顯示原始大小,這部分是有順序的寫法,需要多注意。再來是OpenCV
的一些固定寫法,其中函式是以小寫開頭,而宣告是大寫開頭,如CvRect rect=cvRect(x,y,w,h);
。再來是今天的重點ROI,使用cvSetImageROI(img,cvRect(a+200*i,b,200,200));來做出分割
的效果,參數依序是圖檔位置、X座標、Y座標、與視窗的長寬。另外一點是ROI很容易使程式當機,當顯示
的圖片大小小於多視窗總合很多時,也就是有單一視窗沒有顯示到任何部分圖片時,就會導致錯誤訊息產生
與強制關閉等問題。

    近中午時加入了一些鍵盤控制、視窗移動與縮放等技巧,還有經過老師修正參數輸入做出的雙圖片合成
效果,看起來還有點靈異照片的感覺,可修正的參數有座標、大小、圖片透明度等。下午時運用了一些小技
巧實作一個走迷宮的小遊戲,構想來自國小時有一種畫了很多路線的長方形地圖紙,將紙捲起後由左到右慢
慢攤開,中間的叉路會有一些陷阱之類的,最後只有一條路是抵達終點。其中使用了視窗跟圖片位置同步移
動的鍵盤操作、視窗縮放與座標偵測到終點範圍時換成恭喜的圖。還有一些尚待改進的是限制路線的位置,
使視窗只能照路線來走,不能隨意移動,不過要寫很多座標點的判定才能做到這種效果,目前就先略過了。
另外問了老師關於視窗有殘像的問題,是因為視窗大小最小也大於100*100,所以會有超出設定的部分殘像
留下來。用了新學到的技巧作一些互動的小程式還蠻有成就感的,也讓我對OpenCV更有興趣。

week 5-2 (2010.7.29)

    今天看了兩題台大培訓的題目,第一題是0888:The lucky receipt,主要是在檢查帳單中出現8的部
分,從最末碼來看,如果不是8則印出"bang",如果是8則印出"big",根據有幾個連續的8來印出幾個連續
的"big"。根據字串長度,從最末碼開始用for loop往前逐字元檢查,再用一些判斷式去限制要輸出時的狀
態,就能完成這題要的結果。因為一開始看題目時,以為他的輸入是連續的輸入完成後,再一次印出來,所
以後來又再寫一個可以做到這種效果的版本。不過在老師的示範後才知道原來沒有規定要先輸入完才印結果
,邊輸入邊輸出是可以被接受的。在老師開台大的比賽計分板時,也有提到有時候覺得自己是正確的就可以
上傳試試看,雖然要冒著寫錯加罰20分鍾的風險,不過以這題的例子來看的話,如果知道邊輸入邊輸出是可
以被系統接受的話,就不需要多花時間寫另一個全部輸入完再一次輸出的版本,就能省下一小時的時間。

    第二題是0900:Let the big dog eat,根據輸入的字串來選擇輸出的結果,輸入可分兩種,整數表示
的是"Cat card",若是"DOG"或"dog"則表示的是"Dog card"。若只有輸入整數時,則表示沒有狗,就輸
出"SAFE"。若有出現"dog"與多個整數,則要輸出最小的整數,表示小狗抓小貓。反之若出現"DOG"與多個
整數,則要輸出最大的整數,表示大狗抓大貓。最後一種情況是同時有"DOG"和"dog"出現,表示大小狗互咬
則貓是安全的,此時輸出"SAFE"。這題依然是逐字元檢查,當有"D"或"d"時再去抓最大值與最小值的部分,
因為輸入都是當字串來讀入,在做大小比較時就需要轉換型態,依題意只輸入整數,因此使用atoi(n)即可將
字元轉成整數型態。
參考資料:http://www.cs.nctu.edu.tw/~yslin/library/linuxc/function/02.html

    下午時老師講解繩控排序法,像是由一條繩子以S型來回穿過一個二維陣列後,再對這個以繩子串起的一
維陣列進行排序,藉由老師使用白板筆等小道具來做說明,可以更清楚他的運作。今天有學到很多寫程式的技
巧,從老師和同學身上都學到了很多新的概念與一些思考的方式。我有時候會對著一段程式在鑽牛角尖,一直
覺得應該不會錯但就是達不到我要的效果,再請教別人後就有種恍然大悟的感覺,往往都是一點小錯誤,但是
自己就是看不出來,還真有種當局者迷的感覺。能在集訓的過程中學到大家的長處,果然比自己在家閉門造車
來的有效果多了。

葉正聖老師: 其實加罰20分鐘的Panelty的目的,是希望寫程式的人能很快速地再多花幾分鐘確認程式是不是 真的沒有寫錯,確認沒錯再上傳,是很重要的習慣。不會因為簡單檢查而浪費一個小時的時間。這裡可能有誤會, 可能需要確認一下。(老師了解意思了。其實在練習寫程式的時間永遠都不會浪費掉,在學習的過程花冤枉路的時間, 了解後會印象更深刻,而且重要的場合就不會浪費那個時間了。這就是俗稱的”出來跑,總是要還的”的道理。)
另外老師很高興宗樺有發現集訓的好處。其實在其他學校能參加集訓隊是很珍貴的機會,會需要好好地爭取及珍惜的。 當然私底下先練習,找出會卡住的問題,列出清單後,更能好好地善用珍貴的集訓時間,而針對重點進步得更快。 私底下練習配合集訓,有競爭有進步,加油!

week 6-1 (2010.8.9)

    今天是專研集訓,因為3樓在更新系統,所以教室換成5樓跟資工系一起使用。老師今天
帶了Wii Fit與手把來示範用Wii來操作電腦系統,之前也有聽過體育室老師想要作出更擬真
的高爾夫球遊戲,因為現有的Wii高爾夫系統不準確,沒辦法藉由遊戲來達到訓練的效果。
不過說到擬真高爾夫,之前有看過一段影片是改裝真的高爾夫球杆,在球杆上加裝紅外線感
應,直接打擊真的高爾夫球,遊戲畫面則直接投影在牆上或布幕上,當球打到畫面上時,接
著就由程式計算球的飛行路徑。

    另外有提到GLovePIE系列的程式語言可達到語音辨識是新一套的程式語言(整合C/C++/JAVA),
還有WillmoteLib因為是最新出來,所以具有最高的錯誤回報率,使程式更完整。在電腦上連
接Wii是透過藍芽接收器,因為藍芽底層的硬體跟windows連線不穩定,每次都需要對硬體做同
步連線,目前toshiba的藍芽接收器是接收效果最好的廠牌。Wii Fit的原理是以4個磅秤來做
硬體,抓出四個位置的重量做身體重心判斷。能用電腦來做Wii的遊戲,也是由破解任天堂的
系統而來,因為Wii也是使用寬頻連線,透過封包擷取來破解Wii的系統,才能在沒有任天堂的
開發環境下寫出由Wii操作的遊戲。

    下午時提到了cvLoadImage只有3個變數值能使用,如果要再加入透明度的alpha值,就要
使用第4個空的變數來做自訂。在做合成圖片時,第一張的alpha需要較高讓後面幾張圖能夠顯
示。影像處理的效率方面則是整張圖做處理可以快過以像素為主的方式數十倍,因為使用像素
處理是透過for loop來一個一個抓點會拖慢flash程式速度,用cvThreshold來做整張圖的處理
可以大幅改善處理效率。其他的函式還有cvSmooth 去除雜訊、cvDilate 膨脹、cvErode 收縮
等,今天學到了很多Wii的操作與OpenCV的觀念。

葉正聖老師: 謝謝宗樺提供的資訊。的確直接使用真的高爾夫球桿來揮 (相對於使用 wii 手把) 不管是重量還是手感,都會更加真實。所以在這個高爾夫球計畫中,是有把裝置加裝到球桿上的打算。 而你所提出的進階球的飛行軌跡,則是沒有到想到或安排進去。
原本老師因為擔心沒有學生會對這個計畫有興趣,所以就沒有安排更進一步的合作。不過只要實力夠,永遠都會有數不盡的合作機會哦!

老師很高興本週的專研集訓,你們能有收穫,看到你所描述的心得,證明你們的吸收能力不錯, 那老師以後安排進度時可以更豐富哦! (2010-08-21)

week 6-2 (2010.8.12)

    今天是程式集訓,在上課之前先聽老師說一些加強能力的方法,是關於程式設計的延伸閱
讀,其中有兩個方向,一個是看書另一個是從一些網站上找到自己想用的函數。看書由淺至深
可分為三類,由發明者所寫、其他學者對前者所做的補充、類似論文式的研究(EX:程式設計架
構與設計流程)。第三類可以對大型專案的設計流程有幫助(EX:對程式碼做分類,方便日後管理)
,也是我們在合作開發新系統時很重要的概念,對於分工和維護都是一門學問。

    接著是講解一個在比賽中出現多次的問題,今天的題目都是可以用Johnson's Rule來分類
的排程問題,使用時機是排程有兩段且為依序的,執行順序皆為工作一完成後再接工作二。
Johnson's Rule排法的時間複雜度等級為O(n),先將所有資料分成兩群,第一群為前短後長,
接著為對工作一作遞增排序(小到大),第二群為前長後短,接著為對工作二作遞減排序(大到小)
,再對排序好的兩群(第一群→工作一小到大→第二群→工作二大到小)作最短長度計算。對於
此題排程解題步驟,判定是否為Johnson's Rule、紙上模擬、sort完成資料群組排序(1行)、
STL將資料class化(2行)、最短長度的計算流程(10行)。

    下午時聽老師說一個關於google退出中國的小八卦,原來不是因為中國官方要求鎖特定關
鍵字的問題,是因為中國google內部有不法員工在下載美國總公司的資料,因為會有安全問題
才關閉在中國的分公司。能進這些公司都是經過比賽或是嚴格的考試,一關一關篩選才能進去
的,會出現竊取公司資料的問題,我想應該是競爭對手收買google員工才會有這次事件發生。

葉正聖老師: 看到宗樺能細心地整理上課心得,並且能像海棉一樣努力地吸收新知,進步及未來的成就相當可期。 尤其是老師都忘了老師教過什麼內容,看了宗樺的心得筆記,真的能將上課內容歷歷在目地回憶,而且表示宗樺的學習 非常用心。相信以後關於簡單的排程(scheduling)問題,可能就難不倒你們了。(2010-08-21)

另外,其實老師的這個 “程式集訓wiki” 在8/20早上有疑似被入侵的狀況。或著說有熱心的人幫老師把網站”關起來了”。 因為人外有人天外有天, 老師的能力在有些領域比較不足及無能為力,所以只能找到表面的成因而無法找到更深入的細節。 因為老師無法對付真的高手, 老師的因應之道就很搞笑,就是多做備份,然後心情調適成資料不見就算了的心態,真的生氣了就重灌或是砍掉重練。 ^O^ (2010-08-21)

week 7-1 (2010.8.16)

    今天我們在學校練習台大題目時,我發現幾個遇到的瓶頸,第一個是題目看不懂。
再來是就算題目看懂了,也只能用紙筆測試出邏輯,卻不知道要從哪裡下手。第三個就
跟測試資料有關係了,除了基本測資能完成input之後再來就是輸出的問題,WA跟TLE的
錯誤訊息。關於以上幾個大問題我覺得能改善的方式如下:
1.題目看不懂 → 這部分除了加強英文能力之外,應該還要能找出題目中的關鍵字。
2.演算法不熟 → 很多題目都有一些固定的解法,會的技巧太少,很多題目都沒頭緒。
3.輸入測資問題 → 目前看的題目輸入方面都有一些規則,少部分是目前無法完成的。

    關於測試資料的輸入,我目前大概看過三類,第一類是直接輸入n,後面接著n筆或
是n組測試資料(EX:0197、0899)。這個是最簡單的,用for loop逐一讀入資料就可以了
,資料可用動態vector陣列來存,或是直接準備比題目範圍還大的陣列來存。第二類是
不定數資料,給定多筆n,處理多組資料,當n為0時結束程式(EX:0007、0098)。這也只
要用for(;;)或while(1)來無限執行,加上if(n>0)來判定是否要執行。第三類是目前卡
住的,跟前一類很像,不過少了一個以0為結束條件(EX:0035)。如果少了結束條件最後
就會停不下來一直在等下一筆測資進來,最後變成Time Limit Exceeded。嘗試換成另
一種判定方式if(n!=EOF),會輸出很多其他的資料,變成Output Limit Exceeded。這
一類輸入就是目前還沒試成功的,還要再研究看看。

葉正聖老師: 不好意思因為老師事情較多,一個星期沒有好好地看大家的wiki頁內容。 剛剛發現你在台大集訓的題目中有遇到一些問題及瓶頸,不過老師很高興地看到你在遇到挫折時, 能靜下心來將瓶頸進行分類,並針對不同等級的三大類問題列出改善之道。有了這樣的思考, 相信你能對自己的學習進度更有好的規畫。
當然最快速最簡單能解決的,是你列出的 “3.輸入測資問題”。 你針對這個瓶頸,思考整理出三大類的技巧。 第一類是用for-loop或while-loop可以解決,你的判斷及作法沒問題。 第二類是用 if(n==0)break; 可以解決,你的判斷及作法也沒問題。 目前你所卡住的第三類,其實可以用 while(scanf(”%d %d %d”, &a, &b, &c)==3){迴圈裡面做事情} 即可簡單完成。
這裡使用的技巧是, scanf 裡面讀多少變數(比如說3個變數),那麼正常情況就應該會回傳變數數量(比如說這裡的3)。 所以一旦資料不夠,就可以離開 while-loop 而完成資料輸入。如果還有問題,隨時歡迎打電話問老師。(2010-08-21)

不過其實還有第四類的輸入方式,是以行(getline或fgets)當為輸入單位。 這種比較麻煩,也可以看成是第三類的進階版,只是不能用 scanf 來簡單讀進內含空白的內容。 此時分兩個階段,一個是要能發現 “行已經讀到最終行檔尾,讀不下去了” (解法可以用: while(fgets(stdin, line,255)!=NULL){ } 來做到); 另一個階段是要將 “行裡面的字串資訊進行斷字” (解法可以用: char * substr = strtok(line, ” ”); while(substr!=NULL){做你的事; substr=strtok(NULL,” ”);} 來做到)。

當然還有很多不同的分類法或是不同的程式設計方法來達到,不過老師年輕時常用的簡單方法如同上述,希望對你有幫助。(2010-08-21)

week 7-2 (2010.8.19)

    今天是專研集訓,一早看到有很多研究所的學長們一起來上課,感覺我們就像在上研究所的
課程一樣,另外有問學長上課時用的課本好像也跟我們一樣是"學習OpenCV"。原來我們除了作專
研之外還可以先修研究所的內容,這樣一舉數得聽起來就很有成就感。今天的課程很豐富,老師
將前幾章的內容都帶出一個主題。在前面複習時有提到cvNamedWindow("test",0);加上參數的意
義,如果"test"後面沒加參數則為預設值1,表示只顯示圖片左上角的區域,且不能用滑鼠縮放
大小,如果給定參數0,則可以將整張圖做縮放,並能用滑鼠控制視窗大小。雖然cvNamedWindow
函數不是第一次用,不過今天對於加參數的部分有更深入的比較,也是一種溫故知新。

    接著是cvSub(imgno,imgyes,imgyes);的應用,函式中有三個參數,表示第一張圖減去第二
張圖,並存於第三個參數所指定的位置。因為白色是RGB皆為255,所以我們由imgno來減去imgyes
的結果才會是正確的,如果反過來會變成RGB為負數,產生不同的效果。由於相同的顏色相減後
其RGB為(0,0,0)為黑色,再使用cvNot(imgyes,imgyes);來做Not邏輯運算,將第一個參數1變0及
0變1後的運算存於第二個參數,即可有去背景的效果。在這裡還有其他的邏輯運算可以套用在
OpenCV上,如cvAnd()、cvOr()、cvXor()等。
參考資料:http://yester-place.blogspot.com/2008/07/iplimagecvmat_19.html

    後面使用cvThreshold、cvSplit、cvCvtColor、cvCreateTrackbar等函式,來做去背
景與轉灰階以及微調等應用,學到很多函式的使用方式,希望以後能活用這些工具來做出我想要
的影像處理效果。今天學的東西就可以來快速比較兩張圖的差異,說到這又有一個以前常玩的小
遊戲可以用這些函式來破解,小遊戲是「大家來找碴」,有兩張很像的圖來做比較,圈出不同的
地方。一張當作背景,來給他兩張相減馬上就能留下不同的地方。很多遊戲都是由一些小概念而
來,而這些概念可能都是一個現有的函式就能達成的效果,也許這就是圖學的迷人之處。

葉正聖老師: 那些研究所的學長們都是資傳系畢業的哦! 主要是為因應銘傳大學拿到的大型整合型計畫, 需要有很多實作的研究人力,所以就統一一起來集訓。不過你們因為暑假相當認真,實力不下於學長,甚至不輸許多台清交的研究生呢! (當然台清交的研究生也有很強及很認真的,那先不管他們) 加油! 練出實力,做出好研究、好作品吧!(2010-08-22)

孝皇:華仔~老師回信了!!記得去看一下~我剛回到家= =好累…(2010/08/22 20:40)

week 8-1 (2010.8.23)

    今天是專研集訓,早上一樣講解OpenCV的應用,因為之前使用cvSmooth來做處理時看不出有
明顯的效果,所以老師介紹了一個snoop程式,可以放大圖片,清楚看出cvSmooth處理前後的差
異。另外值得一提的是老師有說明cvSmooth是做整張圖的處理,而不是根據像素一點一點的執行
,所以拿來做前置處理是不會佔用太多時間的,在做其他影像處理時都先將樣本平滑化,可以使
之後的處理效果更清楚。就像之前使用jpg來做cvSplit與cvThreshold時,總會存在一些不完整
的毛邊,所以在之前的黑底彩圖轉黑底白圖時就只用png或bmp的格式來解決block effect的問題。

    接著將cvSmooth應用到上週的進度中,在調整cvCreateTrackbar的灰階處理時,可以看出使
用cvSmooth可以減少背景中的雜訊,處理速度快且效果也相當顯著,以後應該會常常用到。還有
使用cvErode來做收縮或稱腐蝕,使用cvDilate來做擴增或稱膨脹,當天老師有舉例說明這兩個
函數在數學上的定義為何。cvErode為收縮,可將圖形視為一個線圈或是湖之類的,收縮的範圍
可以當做一個圓形的圓心所走過的路徑,所以由一個圓形所繞過圖形的內部,圓周碰觸線圈"向內"
走一圈,則圓心路徑所圍成的範圍是收縮後的結果。cvDilate的膨脹效果則相反,圓周碰觸線圈
是"向外"走一圈,所以可知其圓心路徑皆在圖形外部,因此路徑所圍出的範圍會大於原圖。

    我在做測試時發現一個問題,cvErode為收縮可是出來的圖卻比收縮前大,而cvDilate的膨脹
又比原圖小,感覺上似乎跟想像中相反。上網找了一下後發現,收縮與膨脹並不是指圖形的放大
或縮小,而是顏色RGB的放大縮小,而白色為(255,255,255),黑色為(0,0,0),因為我的測試圖背
景為白色,所以在收縮時255會降低,背景就變少了才會造成圖形變大了。相反的膨脹時0會變大,
所以會有些圖的部分變成像背景的白色,造成圖形變小的效果。所以這部分是值得留意的,如果
我的理解有錯,還請老師幫忙更正一下。

    接著是使用OpenCV的範例程式facedetect來做人臉偵測,實際測試後可以知道人臉的大小會
影響辨識的成功率,相同的圖片在縮小後能找出的人臉會變少,而五官不明顯時也同樣找不到,
如側面或是部份被其他物體遮住之類的。老師有提到CVGIP中有一個比賽是找出照片中的人數與
男女人數,其中前三名的隊伍就是使用OpenCV的範例改裝而成,可以知道這部分是很多人在用的
,而且效率也很高,希望有機會能再深入了解相關的技術,如用在動物辨識上。看到台大有一個
研究主題是「花神」可以分辨圖中的花卉種類,如果這種技術能用在動物上,應該也是不錯的題
目,不過有很多狗的品種都不純很久了,雜交好幾代還能分辨哪個品種佔百分之幾的話,電腦圖
學就能挑戰生物科技的DNA比對了,感覺上就算做出來可信度應該也不高吧。

葉正聖老師: 宗樺很用心地將集訓心得及當天的上課過程記錄地非常詳實,很不錯很優秀。關於 cvSmooth及相關的一些操作,宗樺的理解很好,而且還會真的去拿圖片去測試。 而關於 cvDilate 及 cvErode 原本的定義是作用在 binary 的圖片上。如果是在 grey level 或是更多的channel的圖片中,則要用到更generic 的定義。 如果圖片的外面是白色而裡面是黑色,則很尷尬地,白色被視為是前景,黑色被視為背景。所以 cvErode 後,白色就變少了;cvDilate後,白色就變多了。 (2010-08-28)

葉正聖老師: 關於台大洪一平老師團隊所做出的「花神」,是希望能對於什麼花都不認識的大眾,可以用手機照個像,便去找出看起來最像的花的詳細資料。就像手上有一本花的圖鑑,裡面有幾千張圖, 以前的作法是每張圖都用人眼去比比看像哪種花,不過既然現在有電腦,就交給電腦去做圖像識別(Pattern Recognition),可以讓人更方便。而且不一定要只找到最像的一張,可以找到最像的前n張圖, 來讓使用「花神」系統的普通人能看到列出來的資料,增加對大自然的認識,親近大自然。這樣這個系統就具有很好的教育意義。
另外有一個八掛是,小葉老師在念大學時修的圖形辨識(Pattern Recognition),就是洪一平老師教的(聽說台北縣永和市市長也叫洪一平);唸研究所時小葉老師又修了同一門課第二次,因為希望能把 以前大學時修課修不夠好再重修得更清楚。果然修課修第二次後真的比第一次清楚,很值得。而且也因為這個因素,小葉老師才體會出機率統計、線性代數等的重要性。(2010-08-28)

筆記...
C:\Dev-Cpp\Examples\opencv\samples\c

C:\Dev-Cpp\Examples\opencv\samples\c>facedetect --cascade="../../data/haarcascad
es/haarcascade_frontalface_alt.xml" C:\3.jpg
detection time = 18.9602ms

gif格式不支援,執行後無法停下來
OpenCV 2.0不支援攝影機,因為1.0的版本用的方法太舊,不支援新的作業系統,所以在2.0版中拿掉此功能
目前OpenCV的書都是介紹1.0版,新版的文件要參考網路

使用cvSmooth(img,img);需要#include <opencv/cv.h>,再搭配SNOOP放大鏡來檢視效果

week 8-2 (2010.8.26)

    今天是程式集訓,一早先拿到老師準備的台大題目0960:How Many Ones Needed?,這題是給
你兩個整數來當一筆測資,將這兩個數字及之間的所有整數轉成二進制表示,來找出所有的1共有
幾個,直覺上這題是有解的,不過因為有時間的限制,所以直覺的暴力法在這題是不適用的。接
著開始想其他的方式有沒有更快的解法,一開始我的想法是找出第一個數字有幾個1,剩下的數字
再用規律去推,從每個都轉二進制,簡化到只轉第一個應該能快上很多,不過後來雖然發現是有
規律不過沒辦法用一般的公式來表示。在老師白板上的暗示後,就朝向樹的方向去想,根據數字
是位於左子樹或右子樹來決定是否包含1,再由目前共有幾層樹來決定該樹根下要乘上的係數。

    經過老師直接的示範與講解,能夠比較清楚的知道解題的流程與思考問題的方法,看起來樹
的結構也是很熱門的題型之一,之前看的0128:分「樹」也是有類似的概念,對於樹的概念在二上
的資料結構有學過,不過我還是只會用紙筆推答案,雖然很清楚知道各種搜尋的規則,不過沒有
實際的用程式表達出來。後來看了一下score board中各隊的解題時間,似乎是有更快的方式能夠
做出二元搜尋樹的方法,也聽老師說在STL中有更簡便的方式能寫出相同的效果,所以還有很多實
用的技巧是在比賽中常用的,要學的東西還有很多,像是老師有提到的八大類的演算法等。

    今天另一個重點是STL應用vector,sort,for_each的講解,最早使用vector是之前瘋狂程設要
做不定數排序的時候,像我之前在做這種問題時都直接宣告int a[n];,經過老師的說明,在陣列
中是不能用變數來當大小的,dev-cpp的編譯程式是有經過修改的,算是一種例外。所以我們要學
具有跨平台性質的vector,而vector的用法也很多元,能在宣告時就給定大小,或是之後在給大
小。(EX1:vector<int>array(n); , EX2:vector<int>array2; array2.resize(n);)有這兩種宣告
方式,另外除了我們能直接知道大小為n,還可以由array.size()來抓陣列長度。習慣vector的用
法後,不需要去宣告很大的陣列來存資料,就能很輕鬆的應付各種不定數的測資。

    在STL中的sort(array.begin(),array.end());為快速排序,只要在參數中給定要排序的起始
與結束位置即可,比起之前作最簡單的氣泡排序,省了相當多程式碼且執行效率也高很多。另外
在sort中只要給的位置正確,也是可以做到只排序陣列的中段資料,雖然不知道哪時候會用到這種
技巧,不過多會一招也很好,sort(array.begin()+A,array.end()-B);。

    最後是for_each的用法,是一種結合for-loop與呼叫function的用法,跟前面的sort類似,前
兩個參數一樣是給陣列資料的起始與結束位置,第三個參數為function,表示將資料逐一傳入函式
中來做處理。雖然不是很清楚能不能加快執行速度,至少在寫程式時可以快速做初始化動作。程式
碼為for_each(array.begin(),array.end(),function);。雖然以上三種方式的效果以前都學過,
不過能學會標準寫法與快速呼叫STL的功能,在比賽上可以節省相當多的時間,當然也還有很多好
用的功能等我們去探索。

PS:STL應用的程式碼收錄於"我的其他練習"

葉正聖老師: 上課心得寫得很詳盡,彷彿重現上課時的狀況,歷歷在目,這真的是寫得很好的心得。值得嘉獎鼓勵。(2010-09-01)

week 9-1 (2010.8.30)

    今天是專研集訓,早上先試著執行OpenCV的範例程式,主要是以webcam的測試程式為主。第一
個程式是lkdemo.cpp,可以做到物體的移動追蹤,在按鍵的部分有寫了幾項功能,按下"r"可以自
動抓出目前影像的特徵點,特徵點多為顏色的交界或是有尖銳的點,會以綠色點表示,並由修改程
式印出參數來知道每次抓到的特徵點約為300~400之間。按鍵"c"為清除目前的特徵點,最後一個是
"n"可以像關燈一樣使畫面全黑,只留下綠色特徵點。還可藉由滑鼠直接點出想要的特徵點,不過
經過測試後發現有幾個情況會使特徵追蹤失敗,第一個是在快速來回移動時,當畫面模糊時特徵點
就會消失。第二個是在被物體擋住時,當被追蹤的物體再次出現,特徵點可能會消失或是誤判到別
的物體上。因此處理影像追蹤時,如何準備例外機制來應付以上兩種情形就相當重要。

    接著老師介紹兩個不需要webcam的範例程式,第一個是contours.cpp可以找出圖形的輪廓線,
在執行之後會有一個cvCreateTrackbar來對levels做調整,levels的值表示要找輪廓的方式與程度
,levels的初始值為3,levels越高為向外找輪廓,levels越低為向內找輪廓。由紅線與綠線來區
分是外輪廓或內輪廓。而紅色的輪廓線是內為白色外為黑色,綠色的輪廓線是內為黑色外為白色。
還有一個是fitellipse.cpp,一樣可由cvCreateTrackbar來對cvThreshold做調整,可以將圖形化
為橢圓再到圓形,Threshold的值較高表示越寬鬆的辨識,可將大多數圖形慢慢化為圓形,而值較
低表示越嚴格的辨識,會侵蝕多數的圖形。還有其他範例程式的執行結果與比較收錄於"我的專研
練習",今天學到如何編譯OpenCV範例程式,就能再對這些範例做我想要的修改與應用。也希望藉
由範例程式提供的效果做結合,能學會更多OpenCV的實作技巧來完成適合我們的專研題目。

    到今天結束了兩個月的暑假集訓,謝謝老師提供的學習環境以及wiki的網路平台,現在回頭看
看自己兩個月來的學習紀錄,感覺很有成就感,除了自己留下的程式與心得,老師給予的回饋也是
相當珍貴的經驗分享。這十幾天累積下來的時間與學習成果,就像自己多學了兩門各3學分的課程
─「進階程式設計」與「OpenCV影像處理」。在每次寫心得時都會仔細想想今天我學了哪些?老師
教了哪些?至少要把自己學到的東西寫下來,才會覺得沒有浪費這次學習的機會。

    另外我覺得wiki的系統真的很好,可以即時紀錄學到的東西,也有貼圖與上傳檔案的功能,而
且也能多人編輯文件,可以看到老師給我們的建議,同時也能看看其他同學的學習成果,在這開放
的平台下可以見賢思齊,隨時修正自己的觀念與缺點,對於小組的學習上幫助相當大。同時老師也
花了很多心力在我們的學習上,每週日的wiki就像老師在改作業一樣,清一色都是來自老師的更新
。平時的時間也常看到老師的回覆,老師也會適時的以電話關心我們的進度,加上每週的Weekly 
Report紀錄,我覺得這些與老師互動的方式能使我學得更好更有成就感,當然也希望我們的表現沒
讓老師失望。這個暑假我過得很充實,也學到很多東西,不是為了學分與考試,純粹是對程式設計
的興趣與熱情。

太極參訪 (2010.10.29)

校外教學  心得報告
2010.10.29太極影音公司參訪
97161005  李宗樺

    週五下午的校外參訪,看到一家公司的運作方式,各部門間的分工合作,主要的建模、貼圖形材質
、動畫特效。在一開始的簡報介紹中,就有很明確的部門分工,而簡報的順序也是完成一個專案的流程
。從一開始的建模工作,要如何設計出各種的模型,像是花博的專案中就要建出各種花卉模型,花的造
型多變而細節又相當多,隨便一株植物都是由成千上萬個圖形拼出來的,要花相當多的時間來觀察真實
的植物,才能修出近乎完美的模型,除了MAYA的技巧要相當熟練,也需要一定程度的美術能力。建模部
門的立體素描一定都要經過很多訓練,才能將實體化身為數位世界的另一個新生命。

    在做貼圖的過程中需要各種材質的變化,像是要呈現出衣服布料的質感,或是機車的車身光澤,以
及因天氣變化造成的差異,如淋過雨的布料變化等,環境光線的差異,如日出與日落的不同,都是要細
心去修改才能有的效果。在這任何一點的小細節上都相當講究,或許在動畫中僅短短閃過一兩秒的畫面
,都是經過材質部門精心設計的貼圖。講求完美趨近真實的擬真效果,才能讓模型顯得更有生命力。

    特效部門將動畫師無法處理的大型場景化為可能,讓我印象深刻的是光處理背景的模型運算就有專
人負責,讓背景與前景能更真實的作結合,而且需要相當多的時間來做處理,往往也是最晚下班的工作
,通常做大量的運算也會有許多的錯誤是需要人工修正的,在隔天早上的工作也就是一一處理各種錯誤
。另一個是製作土石流的場景,在一開始的泥流模型也需要材質部門的合作才能有”流動”的效果,另
外也需要加入石塊與樹木的流動才更顯得逼真。再與動畫導演一一比較各種的效果與參數的微調,才有
最後完整的動畫。在這之前有一個噴出水花的動畫,其中用到的水花就是相當細小的粒子模型,根據物
理變化與風向模擬,讓各種方向的粒子都有模擬出自然的效果,也可以透過原有的粒子再做一次模擬,
讓噴出的效果更加強烈。讓我覺得特效部門的工作相當特別,沒有固定的工作內容,可以依據專案需求
做出各種特殊場景,通常是一些龐大壯觀的畫面,也因為不是用人力能慢慢處理的,因此需要別的程式
來輔助運算,才能變出各種出神入化的動畫效果。

    接著是公司內部的參訪,看到幾個方面的製作過程,工作上的流程。在專業的公司中能看到各種精
細的分工模式,每個人都有他最專精的部分。不過因為工作性質的關係,常常會有調派部門的情形,或
著是說臨時性的技術支援,感覺上每個人的專業能力都很多樣化,可以配合公司需求來合作完成一個大
型企劃案。在各部門間的參觀,可以看到工作環境相當自由,不過也因為製作動畫會要對色彩的辨識相
當敏銳,因此燈光一般都是偏暗的,才不會影響到用色的效果。另外在參觀裸視3D時,效果與使用偏光
眼鏡的3D效果相同,能用裸視看到3D效果技術上就高出相當多。以及能將2D轉3D的效果做出實際應用,
雖然人物間的立體感不明顯,不過能跟背景有明顯的區隔,可以看出景深的效果。

    最後是與官老師的製作團隊進行Q&A,動畫公司的產品都會有製作成本,雖然用的設備都是專業級的
,硬體等級屬於工作室規格,效能與重量上都比一般家用電腦高出相當多,但是最大的支出還是人事成本
,很多精細的場景都還是需要用人工花大量時間下去修出來的。在業界的運作模式中,就像是全班完成一
個畢業專研,所以很多公司都相當要求團隊合作的能力。另外是語言能力,雖然不見得會有到國外出差的
機會,但是在工作上會需要語言的基礎,能看到國外最新的技術與應用,而這些技術文件往往是完成工作
的關鍵,也是提升自己專業能力最快的方法。

    在太極影音的參訪中,了解一家專業動畫公司的運作方式,而國外大廠也同樣是有如此專業的分工模
式,每個人的技術都專精於一個領域,不過不同的是,在國內大部分是公司導向,也就是具有品牌形象的
開發團隊。而國外的動畫則大多是專案導向,都是新的專案計畫出來,才著手成立公司並招兵買馬,而執
行初期都只聘動畫導演與故事企劃,到第二年後才開始找動畫師、建模師和貼圖師等專業人員。這部分是
和國內生態有相當大的差異,通常國內公司都怕人才被挖角,而國外卻不是如此,人才流動量大,多是接
專案企劃為主。這部分是我以前都不曾想過的差別,透過校外參訪可以更深入了解業界的工作環境,與國
際化的接軌。讓我對未來的發展能先有一定的心理準備,才不會都在學校求學而與現實世界脫軌,能在學
校有限的時間中找到自己的興趣以及培養專業能力,期許在未來投入職場後能找到適合自己的工作並發揮
所長。

壹傳媒參訪 (2011.04.21)

校外教學  心得報告
2011.04.21壹傳媒動畫公司參訪
97161005  李宗樺

    週四下午的校外參訪,到了壹傳媒動畫公司,是台灣最大的動畫公司。在一開始的投影片介紹中,有
提到壹傳媒公司的四大特色,也是他們能在一天之內做出許多動新聞的秘密。其中包含硬體設備、動作捕
捉器Motion Capture、自行開發的軟體、龐大的圖形資料庫。在這幾項不同於其他公司的動畫開發資源
,使壹傳媒的動畫產量可以是同業間的好幾倍,也是能快速製作出當天新聞的關鍵。

    在第一點的硬體設備中,壹傳媒所使用的是具有即時性Real Time的動畫製作技術,使用的主機都為
個人工作站等級,且運用GPU繪圖晶片來進行圖形計算。其中王銓彰總監有特別提到一點是在壹傳媒中是
沒有大型CPU機房,所有的動畫製作都可由個人工作站的GPU來做運算,而不像其他的公司是使用CPU機房
來進行繪圖計算,在這方面就能節省許多的時間,也不需用透過機房來做運算需要耗時數小時的製作流程
。由硬體設備的不同就是其中一個能快速製作動畫的關鍵。

    第二個技術是大量使用動作捕捉器Motion Capture,藉由動作捕捉的結果直接套用在3D人物模型的
骨架上,減少許多調整模型關節移動的繁複過程。在公司中就有50名專業的動作演員,隨時待命並分成多
組製作群同時進行動作的捕捉。之後有參觀壹傳媒現場使用Motion Capture的過程,透過投影片的分鏡
草圖來設計動作流程,並現場有導演與演員們進行溝通後,就直接開始進行動作捕捉,透過衣服上的各個
感應器與掛在天花板上的數十個紅外線攝影機,來做動作捕捉,整個錄製的時間在5分鐘之內完成。就可以
直接撥放出由身體感應器製作出的關節骨架動畫。在這方面也了解到業界真實運作的流程,學校中也有這
一套設備,不過因為空間有限,還裝了其他硬體裝置看起來就不是很清楚這些設備的用途。另外是這個紅
外線做動作辨識的技術,目前因為微軟XBOX360推出了具有紅外線攝影機的Kinect裝置,所以也有人拿來
做動作辨識的運用,不過因為只有一個紅外線攝影機的關係,在辨識上不是相當的準確,但是在一些基本
的動作上還是有不錯的效果,也因為Motion Capture這套裝置不是一般個人工作室所能負擔的,所以就
有開始研究使用Kinect做出Motion Capture的效果,目前日本的Miku Miku Dance已經完成了一套效果
不錯的系統,可透過Kinect來辨識人體運動,並錄下關節骨架腳本來套用在3D人物模型上,做出人物的跳
舞動畫。目前我們的專研組也是想做這方面的研究,主要是使用Kinect辨識人體運動的效果,來製作一個
棒球運動的互動遊戲。看到了真正的Motion Capture運作過程,也讓我對動作辨識的研究更有興趣,這才
是最符合時間效率的動畫製作方法。

    第三個是壹傳媒自行開發的軟體,其中包含遊戲AI設計、GPU物理引擎、行車路徑與人物模型動畫,其
中的模型與動作是可以分開的,可以套用不同的模型在相同的動作之中,這裡有展示一個是在動新聞中更換
人物模型,可以套用不同人物在相同場景中的效果。還有是衣服更換的系統,類似紙娃娃的感覺,可以對人
物模型換上不同的衣服造型,就可以保留原本設計好的人物而不用因為服裝不同要在製作一個新的模型。另
一個是臉部3D合成,可套用真實人物的表情或嘴型在模型上,就可以在製作動畫中省掉調整臉部細節的過程
。這個技術常常在電影中看到,像是做出動物在說話的感覺或是一些喜怒哀樂的臉部表情。

    第四個是具有龐大的圖像資料庫,目前已達上萬筆資料,已經足以製作一個角色豐富的遊戲。透過資料
庫可以找到相似的模型來製作動新聞,這裡有簡介一下製作動畫的流程與各階段的耗時,先調整人物模型約
20分鐘,人物動畫約30分種,在來是合成後製的部分,有配音與光影變化等效果。在臉部掃描的部分,是一
個很大的球型裝置,在上面配置了各種不同角度的攝影機,臉部掃描的裝置名稱為Light Stage X,X也就
是代表是第10版的裝置系統。可做人臉的年紀合成,有舉例幾部電影有用到這項技術,創-光速戰紀、阿凡
達、班傑明的奇幻旅程。之後是介紹Light Stage X的運作效果,可以取得臉皮層、油脂層、臉部凹凸、光
影層,等各個臉部分層資料。使用不同的條紋光來拍下左右各15張照片,並計算法向量來製作具有深度的3D
模型,包含臉部油光表現與皮膚坑洞,使用150萬面資料圖來重建模型。拍攝前會在人臉點上幾個黑色的對位
點,是用來掃描定位時使用。最後是臉部表情掃描,透過真人表情來合成動態效果,操做動畫表情的呈現,
這部分的投影片似乎有在去年暑假的CGW2010電腦圖學研討會中看過。

    在經過一連串的公司技術簡介以及各部分的硬體裝置說明,還有實際的Motion Capture運作過程,讓
我們更了解製作動畫的流程,還有很不一樣的是壹傳媒是不加班的,因為要加班就是動新聞做不出來,專案
如果delay就失去新聞的意義了。感覺上壹傳媒是相當有效率的動畫公司,能處理當天新聞並用動畫呈現是
相當不容易的,每個新聞大約都只有40分鐘的製作時間,就能呈現約30秒到1分鐘的完整動畫。在時間壓力
下還能兼顧品質,除了上述幾項壹傳媒的優勢技術之外,每位員工也都需要全神貫注才能完成每個專案的製
作。這裡王銓彰總監也說到業界的很多技術都是學校沒教的,通常新進員工也都是需要再訓練一段時間才能
上手,所以要在學校有認真負責的態度與強烈的求知慾,才能適應未來的職場生活。今天豐富的參訪過程也
讓我對求學的態度有了一些改變,主動的求知才能學得更好更扎實,這次的參訪活動讓我受益良多。

中華電信參訪 (2011.05.20)

校外教學  心得報告
2011.05.20中華電信研究所參訪
97161005  李宗樺

    週五上午的校外參訪,是網路通訊程式設計課程的校外教學,也是園區計畫中安排的一項課程。我們
來到位於楊梅的中華電信研究所,雖然稱為研究所,但是不屬於學術研究機關,主要為中華電信公司的服
務產品開發部門。在這研究所中主要分成幾大領域的實驗室,包含無線網路、寬頻網路、多媒體服務、客
服系統、資訊安全、網路維護等實驗室,在這有1500名研究員分別在9個研究室中服務,企劃室陳主任也
提到所有研究員都是碩博士以上學歷,是全台灣前幾名高學歷密集的產品開發單位。

    再接下來的中華電信研究所簡介影片中,有分成幾個方面的應用,在家庭應用上有MOD的娛樂服務,
也是魏光一學長目前正在投入的服務平台,以及千里眼家庭服務,可遠端監視與操作家中的電器產品,提
升居家安全性與方便性。行動應用上有提供個人與商業上的服務,有提到交通上的應用是提供行車資訊、
前方路況回報、大眾交通工具資訊等多元的服務。商務應用為GCA、NFC手機、條碼辨識。環保應用為大樓
電力管理,自動節電與中央管理。營運方面則提供各公司的整合性服務,運用網路結合電力系統來幫助節
約能源達到降低支出的效果。網路應用提供實驗網路給學校單位研究與網路平台業者測試相容性。在影片
簡介中可以知道中華電信推出的服務大部分都來自這裡的各個實驗室,也因為有這裡的研究團隊才能讓中
華電信成為國內行動服務業者的領導地位。

    目前中華電信推出的雲端服務創作平台,可以降低開發人員的負擔,包含網路租費、軟硬體設備、開
發資源等,都可由雲端系統來做維護。在完成專案創作後,後續的營運成本、軟硬體擴充、連線品質也是
由雲端統一管理。開發者只要使用遠端程式管理功能就能做專案修改與更新,也能使用中華電信獨有的電
信服務元件庫,來做簡訊通知使用者的加值功能。目前第一批測試開放給2011電信創新應用大賽的雲端應
用組。聽完這場簡報也對雲端創作相當感興趣,也許明年忙完畢業專研與論文投稿之後,也會組隊報名參
加。雲端的感覺很像是早期的電腦剛出來時,使用者透過終端機連線進行程式開發,後來硬體設備進步才
推出個人電腦,現在的趨勢似乎又走向統一由一套雲端系統進行處理。之前新聞也有提到下一代電腦將以
輕便易攜帶的特性問世,而龐大的運算與儲存裝置都放置在雲端伺服器中,最後或許會走向全球共用一台
超級雲端系統。

    接下來是參觀IPv6實驗室,實驗室主要為輔導企業網路做升級認證,並同時協助測試鄰近國家的認證
,透過多國認證來達到全球規格一致性。IPv6主要測試國為美國、日本、ETSI歐盟,認證標章可分成兩種
,第一種為IPv6 Ready Logo認證標章,用來認證網路設備業者的產品是否可支援IPv6功能,須經過家用
測試、互連測試(四個不同單位的連線),通過此認證才能販賣IPv6產品。第二種標章為IPv6 Enabled Logo
認證標章,用來認證網站或網路支援IPv6功能。認證對象為WWW網路與ISP網路服務商,像是Yahoo、Facebook
、無名小站等服務商。目前實驗室都有提供IPv4與IPv6的同步測試,提升未來全面升級時的相容性。另外
也有介紹其他產品,視訊電話結合IPv6做連線通話、隨選電視節目、氣象感測(溫度、溼度)。現在越來越
多行動裝置都有上網的需求,光是每年行動電話的上網需求增加速度就相當可觀,以及筆電與平板電腦等
無線網路上網都需要佔用IP,當初建置IPv4時所預留的IP數量已經所剩不多。現在各國都在升級IPv6的相
關軟硬體設備,直到全面升級後萬物皆可上網,IPv6的IP數量都足以提供。

    最後我們是參觀國家時間頻率實驗室,在一開始的投影片簡介中,有提到目前國人每天使用117報時台
約20萬次,而實驗室的TL占TAI有5%的比重,排名為世界第5,其中TAI加上閏秒稱為UTC世界標準時,並
透過衛星微調國家標準時間誤差在50微秒(10-6秒=百萬分之一秒)內。要求時間精準是有必要的,關於商
業應用若時間有誤差會造成證券交易出現問題,影響國家金融發展。另一個是交通因素,國內的大眾運輸
如火車、高鐵影響還算較小,不過在航空業就要與世界時間相同,才不會造成國際航班誤點。另外是衛星
定位,時間相差幾微秒就會造成定位差距數十公尺到數百公尺,這段差距在軍事用途上是相當嚴重的誤差
。也透過這幾點例子來說明不斷發明新科技追求時間準確的原因,平常手錶快慢5分鐘以內都還可以接受,
但是在科技上都追求在微秒(µs):10-6秒甚至是奈秒(ns):10-9秒為單位的誤差範圍,算起來一整
年也不會慢到1秒的精確程度,時間的準確是國家科技發展的基礎。

    看完兩個實驗室的工作項目與研究成果後,結束今天主要的參訪活動,能到一個具有相當規模的技術
研發單位,看到目前最新發展的技術,是一個很難得的經驗。像是參訪前我對中華電信的了解也僅有電話
通訊與網路服務等,原來還有參與其他的研究領域,對於國內科技的研發與跟上世界潮流都佔有舉足輕重
的地位。雖然現在中華電信已經走向民營化,但是依然有受到國家的委託開發其他科技技術,不完全以公
司營利為目標的研究部門。經過今天的參訪活動,對中華電信有更深入的了解,也了解各種科技發展的必
要性,很多東西是平常沒注意到的技術,也認為還用不到感覺不是這麼重要。在經過解說之後,讓我對這
些日常忽略掉的科技改觀,任何東西都有他存在的必要性與價值。

數位通雲端技術 (2011.06.03)

業界專家指導  心得報告
2011.06.03數位通公司-雲端技術
97161005  李宗樺

    週五上午在學校聽一場有關雲端技術的專題演講,老師邀請到來自數位通公司的陳維健總經理來為我們
說明雲端技術的軟硬體設備與營運流程。其中數位通公司是台灣第一家民間的雲端企業,同時期也有許多同
業在建設硬體機房,不過隨著客戶群改變與機房維護等問題,慢慢退出至剩下少數幾家公司,而數位通也有
收購他們的設備來擴充機房。同時也成為國內外機房設備最標準的一家公司,並提供鄰近國家學習仿效設備
的建置。

    從雲端技術開始盛行之後,出現一個新名詞IDC (Internet Data Center)大型資料儲存中心,用來
提供各企業主機的代管與主機設備出租服務。此外因為雲端中心主要是透過網路來進行連結,所以需要有對
國外的海底電纜通訊,台灣建置的海底電纜主要有兩家世界性的佈纜公司承包,其中EAC的佈覽方向為往北
連接日本,另外RNAL為往南接香港。透過這兩端的海底電纜來與全世界進行網路通訊,建立海底電纜的經費
主要由中華電信與各大通訊公司按比例投資,或是日後再向中華電信租用頻寬。各國對外通訊主要是由有線
的海底電纜或是無線的衛星通訊來聯繫,所以當地震發生時就有可能震斷海底電纜,會對國內各產業造成一
定的影響,有跨國性合作的公司就必須使用衛星通訊,因此會建立至少兩條以上的海底電纜來確保通訊系統
能正常運作。

    雲端中心的另一項重要功能是DR 災難異地備份,提供各企業做資料備份的功能,當天災或其他人為災
難造成公司機房受損時,可使用雲端設備來維持公司的日常運作,公司人員可直接進駐雲端中心維持正常工
作。有舉例國內的幾家大企業包括鴻海與宏達電,都有做到二十個以上的異地備份,透過雲端技術來保障公
司能正常運作。另外雲端機房也需要做到全年不斷電系統,因此有舉例數位通公司使用來自兩個不同變電所
提供的電源,來做內部兩套電路系統,另外還有備一台發電機用來緊急發電,不過發電機提供的電力通常電
壓都不穩定,會有一定的電壓範圍,每台設備都會有標示可運作的電壓,一般需求多在100~224伏特之間。
另外平常電力充足時也會儲存備用電力,使用UPS電容充放電來做緊急電源。目前數位通公司有做到7個9的
安全標準,也就是99.99999%的不斷電系統,換算成一年停電時間要在7分鐘以內的高安全性。藉由硬體設
備的全年無休來維持客戶二十四小時都可進行工作的需求。

    在企業代管方面有提供遠端電源監控系統,使用各種感應器來做偵測,降低不必要的電源浪費來做企業
節能。目前雲端最大量的運用是在文書處理、資料備份與資源分享等部份。透過遠端高安全性的大型機房做
各種資料處理,降低公司意外風險是雲端系統會被市場接受的主要原因之一。也使用虛擬機器的概念來提升
設備效能,並分散尖峰與離峰時期的資源分配。目前數位通提供的申請服務時間為兩天,在提出申請到開放
使用權限需耗時兩天。目前世界上最快的是亞馬遜企業的雲端系統,只需要30分鐘即可核發使用權限。核發
時間的長短也相當重要,例如臨時性的需要申請設備來做活動,就要在短時間內完成申請。

    今天看新聞有報導鴻海已經有準備五年的時間在雲端系統的建立,主要用來管理世界各地的工廠生產線
,新聞畫面也有出現貨櫃屋式的模組化雲端系統,跟之前看的Google移動式雲端系統一樣,都可由貨櫃方式
來達到高機動性。未來在雲端上的使用應該是會越來越普及,像微軟主打一雲三螢的口號,電腦、手機、電
視三個螢幕都可由雲端系統進行多媒體操作。藉由雲端的發展來減少行動裝置的重量與體積,用來提升攜帶
方便性。把最佔體積的運算與儲存裝置放在雲端中,透過網路來讀資料與軟體操作。可以想像未來是處於網
路不能中斷的時代,任何東西都需要透過網路來使用,這也是要發展成IPv6的原因,才足以供應所有東西都
要使用網路連接雲端的需求。

CGW2011心得 (2011.07.14~15)

CGW2012心得 (2012.07.11~13)

李宗樺/我的上課心得.txt · Last modified: 2012/07/18 22:42 by 118.161.193.58