先切換為Animation,
Maya提供了幾項非線性(Nonlinear)的變形功能,
1.彎曲(Bend)
2.喇叭口(Flare)
3.正弦波(Sine)
4.波浪(Wave)
5.壓扁(Squash)
6.扭轉(Twist)
皆可在Deform/Create Nonlinear/底下找到
功能框框內皆有以下參數
1.Envelope:
數值設定範圍-2~2,預設為1。
用以設定變形的縮放比例。
2.Low Bound:
數值設定為0~-10,
0代表底端不受變形影響,
-1~-10代表變形的範圍。
3.High Bound:
數值設定為0~+10,
0代表頂端不受變形影響,
+1~+10代表變形的範圍。
變形時,分割數目要高,否則效果不明顯。
2007年2月7日 星期三
2007年2月5日 星期一
about Maya(關節)
骨架系統是讓動畫能夠表現的重要工具,
基本包含了關節和骨頭,
關節依據不同功能與限制又分為三大類別:
球關節(Ball Joint):
可允許在三個軸向旋轉,
ex:人的肩胛骨(Shoulder)與手臂相接的部份。
萬向關節(Universal Joint):
允許在兩個軸向旋轉,
ex:人的腕關節(Wrist)或汽車的傳統軸接頭。
鉸鏈關節(Hinge Joint):
僅允許在單個軸向旋轉,
ex:人的膝關節(Knee),或是房間與門框的接頭。
要製作動畫,
先將Maya切換到Animation模式的功能表,
點選Skeleton / Joint Tool指令,
並使用滑鼠左鍵建立關節,(第一個為根關節Root Joint)
另一處按下滑鼠左鍵建立第二個關節,
兩關節間會自動出現骨頭。
透過骨架系統的特性,
設計者可利用機構運動(Kinematics)的原理,
使其顯示於特定的位置與外觀,再配合動畫影格的設定,
即可購成運作順暢的動畫。
ex:人走路、動物跳躍、尾巴搖擺等動作。
Maya將機構運動分成兩大類型來描述整個股價系統的運動,
其一為FK(Forward Kinematics)系統,
另一為IK(Inverse Kinematics)系統。
FK:
設計者針對單獨的關節,進行移動或旋轉,
由前到後,逐一設定每個關節與其對應位置,
並且逐一配合動作,定義動畫影格,
建立一個非直接連動的動畫可使用此方法,
此方法較麻煩,用到機會並不多。
IK:
設計者須先定義IK控制器所包含的關節,
然後,僅需定義動作的起點、終點位置,
與對應的動畫影格,即可使骨架產生連續的動作。
系統化自動調整中間過程,
較方便,經常被動畫軟體所採用。
基本包含了關節和骨頭,
關節依據不同功能與限制又分為三大類別:
球關節(Ball Joint):
可允許在三個軸向旋轉,
ex:人的肩胛骨(Shoulder)與手臂相接的部份。
萬向關節(Universal Joint):
允許在兩個軸向旋轉,
ex:人的腕關節(Wrist)或汽車的傳統軸接頭。
鉸鏈關節(Hinge Joint):
僅允許在單個軸向旋轉,
ex:人的膝關節(Knee),或是房間與門框的接頭。
要製作動畫,
先將Maya切換到Animation模式的功能表,
點選Skeleton / Joint Tool指令,
並使用滑鼠左鍵建立關節,(第一個為根關節Root Joint)
另一處按下滑鼠左鍵建立第二個關節,
兩關節間會自動出現骨頭。
透過骨架系統的特性,
設計者可利用機構運動(Kinematics)的原理,
使其顯示於特定的位置與外觀,再配合動畫影格的設定,
即可購成運作順暢的動畫。
ex:人走路、動物跳躍、尾巴搖擺等動作。
Maya將機構運動分成兩大類型來描述整個股價系統的運動,
其一為FK(Forward Kinematics)系統,
另一為IK(Inverse Kinematics)系統。
FK:
設計者針對單獨的關節,進行移動或旋轉,
由前到後,逐一設定每個關節與其對應位置,
並且逐一配合動作,定義動畫影格,
建立一個非直接連動的動畫可使用此方法,
此方法較麻煩,用到機會並不多。
IK:
設計者須先定義IK控制器所包含的關節,
然後,僅需定義動作的起點、終點位置,
與對應的動畫影格,即可使骨架產生連續的動作。
系統化自動調整中間過程,
較方便,經常被動畫軟體所採用。
about Maya(材質)
在圖形上貼上自己製作的材質:
選windowsr→Rendering Editors→『Hypershade...』
左邊選Lambert的球體或create→Materias裡面找
然後畫面下方(工作區)會多出一個Lambert 2,
點2下開啟 屬性編輯列點color旁邊的方塊→選File。
在lmage Name旁點資料夾圖案,找你做好的圖。
就完成指定貼圖來源的動作然後選要貼的部位,
把材質拉過去就好囉!
參考:
http://tw.knowledge.yahoo.com/question/?qid=1106111701972
選windowsr→Rendering Editors→『Hypershade...』
左邊選Lambert的球體或create→Materias裡面找
然後畫面下方(工作區)會多出一個Lambert 2,
點2下開啟 屬性編輯列點color旁邊的方塊→選File。
在lmage Name旁點資料夾圖案,找你做好的圖。
就完成指定貼圖來源的動作然後選要貼的部位,
把材質拉過去就好囉!
參考:
http://tw.knowledge.yahoo.com/question/?qid=1106111701972
2007年1月24日 星期三
C++Builder / Maya / OpenGL (一些網址)
http://www.ogg.cn/info/view-info-24-5.html
(2006/11/4擷取)↑有教如何在C++Builder中開發
DirectX↓
http://www.geocities.com/foetsch/bcbfaq/bcbddraw.htm#samples (2006/11/3擷取)↑有教一些範例。
http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=38000 (2006/11/9擷取)
↑K TOP論壇內BCB6.0 + DIRECT SDK 9.0編程的方法
↓http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=37755
(2006/11/9擷取)
http://www.afterwarp.net/forum/thread250.html
↑圖片庫,人物、物件、背景等...(2006/11/10 擷取)
↑我的一些書籤
2007年1月22日 星期一
多媒體遊戲製作_3(視訊對話盒)
視訊壓縮對話盒( bool capDlgVideoCompression( hwnd ) )
"視訊顯示器對話盒"、"視訊來源對話盒"、"視訊格式對話盒",
都需要是在tagCapDriverCaps資料結構中的函數,
wSize是s的容量大小(使用sizeof 得知)
capDriverGetCaps(hwnd, s, wSize) 是否等於true,
fHasDlgVideoDisplay 外部顯示裝置對話盒
fHasDlgVideoFormat 視訊格式對話盒
fHasDlgVideoSource 視訊來源對話盒
"視訊顯示器對話盒"、"視訊來源對話盒"、"視訊格式對話盒",
都需要是在tagCapDriverCaps資料結構中的函數,
wSize是s的容量大小(使用sizeof 得知)
capDriverGetCaps(hwnd, s, wSize) 是否等於true,
fHasDlgVideoDisplay 外部顯示裝置對話盒
fHasDlgVideoFormat 視訊格式對話盒
fHasDlgVideoSource 視訊來源對話盒
多媒體遊戲製作_2
MapVirtualKey指令 :
可將英文文字轉為鍵盤的掃描碼,便能完整模擬鍵盤按鍵的訊號。
MapVirtualKey(虛擬鍵碼,0)。
keybd_event指令 :
模擬鍵盤做出動作,並利用視訊處理後的結果來判定是否執行觸發動作。
keybd_event(虛擬鍵碼,掃描碼,按鍵按下或彈起的狀態,附加鍵狀態)。
觸發按鍵 " x " 的寫法 :keybd_event(‘x’, MapVirtualKey(‘x’,0 ), KEYEVENTF_KEYUP ,0 );
// KEYEVENTF_KEYUP是放掉按鍵( 彈起 )的指令
可將英文文字轉為鍵盤的掃描碼,便能完整模擬鍵盤按鍵的訊號。
MapVirtualKey(虛擬鍵碼,0)。
keybd_event指令 :
模擬鍵盤做出動作,並利用視訊處理後的結果來判定是否執行觸發動作。
keybd_event(虛擬鍵碼,掃描碼,按鍵按下或彈起的狀態,附加鍵狀態)。
觸發按鍵 " x " 的寫法 :keybd_event(‘x’, MapVirtualKey(‘x’,0 ), KEYEVENTF_KEYUP ,0 );
// KEYEVENTF_KEYUP是放掉按鍵( 彈起 )的指令
2007年1月21日 星期日
多媒體遊戲製作_1(連接視訊)
擷取視訊三步驟 :
1.取得視訊裝置驅動器數量及資訊 (○)
#include
if(capGetDriverDescription(dwDriverIndex,
szDriverName,sizeof(szDriverName),szDriverVer,sizeof(szDriverVer)) )
2.建立視訊擷取視窗
在unit.h裡的form1-private中宣告一個新的資料成員
用來記錄視訊擷取視窗的Handle
private:
HWND FVideoCapWinH;
再使用CapCreateCaptureWindow這個函式來建立出視訊擷取視窗
3.連接攝影機
FormCreate裡面
// 創出一個父視窗 讓視訊使用
FCapWinH = capCreateCaptureWindow(
"Test window", WS_CHILD WS_VISIBLE,0, 0,
CapturePanel->Width, CapturePanel->Height,
CapturePanel->Handle, 0);
blConnect = false; //設定初始沒連線
連線的button中放
if(FCapWinH != 0)
{
blConnect =capDriverConnect(FCapWinH, 0);
}
if(blConnect == true)
{
capPreviewScale(FCapWinH, false);
capPreview(FCapWinH, true);
capPreviewRate(FCapWinH, 30);
}
之後再對PreviewMode跟OverlayMode放入
capPreview(FCapWinH, true);
//較消耗系統資源,因為他是從視訊裝置去得影像資料然後放入系統記憶體內,
再從系統記憶體內顯示影像資料到螢幕上,
capOverlay(FCapWinH, true);
//相較於PreviewMode,OverlayMode的效率較好,
1.取得視訊裝置驅動器數量及資訊 (○)
#include
if(capGetDriverDescription(dwDriverIndex,
szDriverName,sizeof(szDriverName),szDriverVer,sizeof(szDriverVer)) )
2.建立視訊擷取視窗
在unit.h裡的form1-private中宣告一個新的資料成員
用來記錄視訊擷取視窗的Handle
private:
HWND FVideoCapWinH;
再使用CapCreateCaptureWindow這個函式來建立出視訊擷取視窗
3.連接攝影機
FormCreate裡面
// 創出一個父視窗 讓視訊使用
FCapWinH = capCreateCaptureWindow(
"Test window", WS_CHILD WS_VISIBLE,0, 0,
CapturePanel->Width, CapturePanel->Height,
CapturePanel->Handle, 0);
blConnect = false; //設定初始沒連線
連線的button中放
if(FCapWinH != 0)
{
blConnect =capDriverConnect(FCapWinH, 0);
}
if(blConnect == true)
{
capPreviewScale(FCapWinH, false);
capPreview(FCapWinH, true);
capPreviewRate(FCapWinH, 30);
}
之後再對PreviewMode跟OverlayMode放入
capPreview(FCapWinH, true);
//較消耗系統資源,因為他是從視訊裝置去得影像資料然後放入系統記憶體內,
再從系統記憶體內顯示影像資料到螢幕上,
capOverlay(FCapWinH, true);
//相較於PreviewMode,OverlayMode的效率較好,
多媒體專題_8(動畫)
對於書涵提出的故事,最前頭跟中間,
我絕得和簡可以一起做些動畫在那時撥放,
這樣可以讓人更加了解我們的故事是如何在進行的。
動畫: 是涵蓋任何以單格記錄的形式,來儲存成影片、視訊或是數位的目的稱之。
根據製作動畫的方法,又可區分為數種特性的動畫:
1.全動動畫(Full Animation)
顧名思義即這種動畫的動作是完全和諧而流暢的,繪製是按部就班的。
(ex: 電影中動畫表現是每秒24格畫面而電視中的動畫是以每秒30格畫面播放)
其最大特色在於非常講究精細的動作表達,風格也較為寫實且自然。
2.有限動畫(Limited Animation)
和全動動畫不同之處在於原本30(格/秒)的畫面只用12(格/秒)或更少來呈現,
這樣較節省經費。
(ex: 主角說話時若只動嘴巴,則每次只需更換嘴唇的賽璐璐片即可,而身體與頭部仍不動)
3.照片動畫(Photo Animation)
亦可稱之為Fotan,指能局部┌活動┘的照片而言。
4.簡單動畫(Simple Animation)
指場景中只有唯一的一件物品或是人能動作的動畫稱之(最省經費的手法)
5.混合動畫(Compound Animation)
指在同一場景中有好多個物件或人在進行動作的動畫稱之。
(設定動作越多,製作難度越高,經費越高)
6.攝影機動畫(Camera Animation)
藉由攝影機的移動及運鏡來產生動畫,或可稱之為實景動畫(Life Animation)。
在場景中的動畫皆藉由相對運動的概念來達成的。
7.模型動畫(Model Animation)
藉由'將物體一次調整些微的移動,再使用攝影機逐格地拍攝下來,
在這樣的層次下,尚不需要電腦的協助或提供。
但若當模型可被直接控制時,或是用特殊效果來表。
電腦繪圖: 經由電腦對物體的形狀及影像所進行的創作、儲存及處理均稱之。
電腦動畫: 在屬性空間上可分為平面二度空間及立體三度空間兩種。
若再考慮時間因素,則又可區分為靜態與動態兩類。
在此動態畫面呈現即是所謂的電腦動畫(Computer Animation),
其屬性又區分為平面電腦動畫(2D Computer Animation)
及立體電腦動畫(3D Computer Animation)兩種。
關於動畫需要蒐集八庫全集
1.精緻小插圖庫(Clip Arts)
插圖的檔案屬性大致上分為點矩陣式(bit map)及向量式(postscript)兩類為主,
可有效輔助製作進度上的效率及品質的水準,
這些小插圖幾乎是以黑白為主的線稿。
2.字型庫(Fonts)
大致可區分為中文及英文兩種,中文又分簡體中文、繁體中文及書法等三種。
英文字型方面,目前已經高達五、六千種以上,仍不斷增加中。
3.材質庫(Texture)
來源可以是藉由攝影圖像、幻燈片圖像(正、負片)、
書本雜誌等印刷品圖片掃描,或以數位影像攝取等方式來取得,
甚至可由高解析度的攝影機(ex: Betacom DI),
D2來取得靜態影像的單槍捕捉亦是取得材質影像的另類方式。
材質庫的建構上,圖像解析度的高低,亦是區隔材質圖像品質好壞的界定。
故此庫內可有大尺寸且又高解析度的影像,
也有小尺寸且又解析度低的圖像並存,一切依照使用者的需要。
這些圖像大多被用於三度空間中的物體表面質感上的貼圖運作。
4.音效庫.(Sound Effects)
(ex: 流水聲、鳥聲、開關門聲、爆炸、槍鳴、閃電聲等罐頭音效或一些經授權許可使用的音樂片段)
音效品質亦有單音(Mono8位元音效)及立體音(Stereo16位元音效)的區別。
以具立體環繞音的16位元音樂檔案資料量比以單音紀錄的8位元因為檔案來的更大。
這方面的音效,較適用於多媒體製作或電腦影視剪輯上的應用為主。
5.三維立體模型庫(3D Models)
較常用的檔案有DXF.IGES檔案等,關於這方面資料庫的蒐集,
對於從事電腦動畫特效或是電玩遊戲軟體設計的業者或個人將有極大的方便性。
模型檔案可分為粗糙的、中等的及精緻的模型檔案,
愈精緻的模型檔案,其製作難度上將相對得提高,而收費亦是高昂的。
6.影視特效庫(Special Effects)
影視製作公司為了能節省成本且不影響影片製作的逼真效果及精采過程,
且又能掌握製作進度、安全考量、人員調度等因素,故而進行電腦模擬真實景物運作。
(ex: 火焰燃燒、恐龍、雲霧、海浪、水流、爆炸、頭髮、樹、山丘等)
7.精采網頁庫
懂得如何去尋求有利的支援,並多觀摩其他精采的網頁站台,
多方面蒐集和本身有相關的行業站台與技術支援相關協力廠商乃至技術交流互動的網站,
是知己之彼的功課。
8.各式運動動作資料庫
使用"動態捕捉的即時感應器",連接在真人或實物的相對應肢體關節上錄製即可。
(ex: 空中灌籃動作資料庫、高爾夫標準球桿揮桿進洞動作資料庫、高空跳水選手標準動作資料庫以及一般舞蹈、滑雪、衝浪等動作資料庫)
以上是我看"電腦動畫基礎The Fundamental of computer animation 吳鼎武‧瓦歷斯 編著"的內容所記下來的。
我絕得和簡可以一起做些動畫在那時撥放,
這樣可以讓人更加了解我們的故事是如何在進行的。
動畫: 是涵蓋任何以單格記錄的形式,來儲存成影片、視訊或是數位的目的稱之。
根據製作動畫的方法,又可區分為數種特性的動畫:
1.全動動畫(Full Animation)
顧名思義即這種動畫的動作是完全和諧而流暢的,繪製是按部就班的。
(ex: 電影中動畫表現是每秒24格畫面而電視中的動畫是以每秒30格畫面播放)
其最大特色在於非常講究精細的動作表達,風格也較為寫實且自然。
2.有限動畫(Limited Animation)
和全動動畫不同之處在於原本30(格/秒)的畫面只用12(格/秒)或更少來呈現,
這樣較節省經費。
(ex: 主角說話時若只動嘴巴,則每次只需更換嘴唇的賽璐璐片即可,而身體與頭部仍不動)
3.照片動畫(Photo Animation)
亦可稱之為Fotan,指能局部┌活動┘的照片而言。
4.簡單動畫(Simple Animation)
指場景中只有唯一的一件物品或是人能動作的動畫稱之(最省經費的手法)
5.混合動畫(Compound Animation)
指在同一場景中有好多個物件或人在進行動作的動畫稱之。
(設定動作越多,製作難度越高,經費越高)
6.攝影機動畫(Camera Animation)
藉由攝影機的移動及運鏡來產生動畫,或可稱之為實景動畫(Life Animation)。
在場景中的動畫皆藉由相對運動的概念來達成的。
7.模型動畫(Model Animation)
藉由'將物體一次調整些微的移動,再使用攝影機逐格地拍攝下來,
在這樣的層次下,尚不需要電腦的協助或提供。
但若當模型可被直接控制時,或是用特殊效果來表。
電腦繪圖: 經由電腦對物體的形狀及影像所進行的創作、儲存及處理均稱之。
電腦動畫: 在屬性空間上可分為平面二度空間及立體三度空間兩種。
若再考慮時間因素,則又可區分為靜態與動態兩類。
在此動態畫面呈現即是所謂的電腦動畫(Computer Animation),
其屬性又區分為平面電腦動畫(2D Computer Animation)
及立體電腦動畫(3D Computer Animation)兩種。
關於動畫需要蒐集八庫全集
1.精緻小插圖庫(Clip Arts)
插圖的檔案屬性大致上分為點矩陣式(bit map)及向量式(postscript)兩類為主,
可有效輔助製作進度上的效率及品質的水準,
這些小插圖幾乎是以黑白為主的線稿。
2.字型庫(Fonts)
大致可區分為中文及英文兩種,中文又分簡體中文、繁體中文及書法等三種。
英文字型方面,目前已經高達五、六千種以上,仍不斷增加中。
3.材質庫(Texture)
來源可以是藉由攝影圖像、幻燈片圖像(正、負片)、
書本雜誌等印刷品圖片掃描,或以數位影像攝取等方式來取得,
甚至可由高解析度的攝影機(ex: Betacom DI),
D2來取得靜態影像的單槍捕捉亦是取得材質影像的另類方式。
材質庫的建構上,圖像解析度的高低,亦是區隔材質圖像品質好壞的界定。
故此庫內可有大尺寸且又高解析度的影像,
也有小尺寸且又解析度低的圖像並存,一切依照使用者的需要。
這些圖像大多被用於三度空間中的物體表面質感上的貼圖運作。
4.音效庫.(Sound Effects)
(ex: 流水聲、鳥聲、開關門聲、爆炸、槍鳴、閃電聲等罐頭音效或一些經授權許可使用的音樂片段)
音效品質亦有單音(Mono8位元音效)及立體音(Stereo16位元音效)的區別。
以具立體環繞音的16位元音樂檔案資料量比以單音紀錄的8位元因為檔案來的更大。
這方面的音效,較適用於多媒體製作或電腦影視剪輯上的應用為主。
5.三維立體模型庫(3D Models)
較常用的檔案有DXF.IGES檔案等,關於這方面資料庫的蒐集,
對於從事電腦動畫特效或是電玩遊戲軟體設計的業者或個人將有極大的方便性。
模型檔案可分為粗糙的、中等的及精緻的模型檔案,
愈精緻的模型檔案,其製作難度上將相對得提高,而收費亦是高昂的。
6.影視特效庫(Special Effects)
影視製作公司為了能節省成本且不影響影片製作的逼真效果及精采過程,
且又能掌握製作進度、安全考量、人員調度等因素,故而進行電腦模擬真實景物運作。
(ex: 火焰燃燒、恐龍、雲霧、海浪、水流、爆炸、頭髮、樹、山丘等)
7.精采網頁庫
懂得如何去尋求有利的支援,並多觀摩其他精采的網頁站台,
多方面蒐集和本身有相關的行業站台與技術支援相關協力廠商乃至技術交流互動的網站,
是知己之彼的功課。
8.各式運動動作資料庫
使用"動態捕捉的即時感應器",連接在真人或實物的相對應肢體關節上錄製即可。
(ex: 空中灌籃動作資料庫、高爾夫標準球桿揮桿進洞動作資料庫、高空跳水選手標準動作資料庫以及一般舞蹈、滑雪、衝浪等動作資料庫)
以上是我看"電腦動畫基礎The Fundamental of computer animation 吳鼎武‧瓦歷斯 編著"的內容所記下來的。
多媒體專題_6(魔術棒_2)
x=ptCurrent.x; //先讓起始點等於我們按的x,y
y=ptCurrent.y;
讓起始點的FLAG[][]=2;
do{
for(i=-1~1)
for(j=-1~1)
{
PushStack(ptCurrent.x +i, ptCurrent.y +j);
}
PopStack(); //pop的觀念不清
此時改變x,y的值->這樣下個循環才能改變push進入的東西
check 被pop出的點,和起始點compare difference,
/*
if(check(i,j)== 1)
flag[][]=2;
if(check(i,j)== 0)
flag[][]=3;
*/
亦或check(x,y)這個函式,可以return 0,1,2,3;
這四個之後讓FLAG[][]=check(x,y);
}while( iStackTop != -1);
for(i=0~ImageHeight)
for(j=0~ImageWidth)
{
if(FLAG[i][j]==2)
Image2->Canvas->Pixels[j][i] = TColor(RGB(0, 0, 0));
//最後做FLAG的check,如果FLAG等於2則標示出來
//到最後就能標示出所有和起始點色相相似的點
}
y=ptCurrent.y;
讓起始點的FLAG[][]=2;
do{
for(i=-1~1)
for(j=-1~1)
{
PushStack(ptCurrent.x +i, ptCurrent.y +j);
}
PopStack(); //pop的觀念不清
此時改變x,y的值->這樣下個循環才能改變push進入的東西
check 被pop出的點,和起始點compare difference,
/*
if(check(i,j)== 1)
flag[][]=2;
if(check(i,j)== 0)
flag[][]=3;
*/
亦或check(x,y)這個函式,可以return 0,1,2,3;
這四個之後讓FLAG[][]=check(x,y);
}while( iStackTop != -1);
for(i=0~ImageHeight)
for(j=0~ImageWidth)
{
if(FLAG[i][j]==2)
Image2->Canvas->Pixels[j][i] = TColor(RGB(0, 0, 0));
//最後做FLAG的check,如果FLAG等於2則標示出來
//到最後就能標示出所有和起始點色相相似的點
}
多媒體專題_5(魔術棒_1)
魔術棒_1:
首先我先宣告 tagPOINT ptCurrent;
宣告 tagPOINT Stack[STACKSIZE];
宣告 一個動態的二維陣列FLAG[ImageHeight][ImageWidth](初始為0);
宣告FLAG[][]是為了要儲存整張圖的處理狀態,
FLAG[][]為0 ->未做過處理,找出我按的,要比較的那個起始點的x、y,
再Image->OnMouseDown的事件中
ptCurrent.x= x; ptCurrent.y= y;
ptR = IMatrixR[x][y];
ptG = IMatrixG[x][y];
ptB = IMatrixB[x][y];
//我將我按的值assign給ptCurrent的x和y值
//在此我也可以知道起始點的ptR、ptG、ptB好做比較
找我們所按的初始點的相鄰像素
for(i=-1;i<=1;i++) //參考了小白的
for(j=-1;j<=1;j++)
{ x=ptCurrent.x + i;
y=ptCurrent.y + j;
if(FLAG[x][y]==0)
{
PushStack(x,y);
}
}
void PushStack(/*tagPOINT s*/int a, int b)
//s是一個指標?
{
tagPOINT s;
s.x = a; //對於s我不太了解所以把他換成x,y?可行?
s.y = b; //因為老師網誌中的h檔可放入指標、也可放兩個整數
if(iStackTop == STACKSIZE)
{
ShowMessage("overflow!");
exit(1);
}
else
{
Stack[iStackTop] = s;
iStackTop ++;
FLAG[s.x][s.y]=1
//這麼用對嘛? [s.x]、[s.y]
//FLAG[][]為1 ->已放入陣列中,在陣列中待處理
//有想要在這裡判斷出這點的R、G、B值
//然後和原點的R、G、B做比較,亦或是在PopStack()中再抓?
}
}
tagPOINT PopStack(void)
{
tagPOINT s;
s=Stack[iStackTop];
iStackTop --;
FLAG[s.x][s.y]=check(s.x,s.y);
return s;
//return我們pop出的這個數去做判斷
//判斷是否為相似的色相,並改變其FLAG[][]
}
找相似值:
要讓DIFFERENT = [(ptR-R)^2+(ptG-G)^2+(ptB-B)^2]^(1/2)
在我們所設定的範圍(RANGE)之內
如果DIFFERENT <= RANGE
則設定FLAGE[X][Y]= 2
FLAG[][]為2 ->已經處理過且為起始點的相似點,
如果DIFFERENT > RANGE 則
設定FLAG[X][Y]= 3
FLAG[][]為3 ->已經處理過但和起始點是相異點,
//以上這些我都還沒有判斷FLAG[][]為什麼時不需要做事等等...
//想了很久,整體感覺大概知道,但是拼湊不起來...
//關於那個iStackTop是指標!!->宣告全域 int iStackTop
首先我先宣告 tagPOINT ptCurrent;
宣告 tagPOINT Stack[STACKSIZE];
宣告 一個動態的二維陣列FLAG[ImageHeight][ImageWidth](初始為0);
宣告FLAG[][]是為了要儲存整張圖的處理狀態,
FLAG[][]為0 ->未做過處理,找出我按的,要比較的那個起始點的x、y,
再Image->OnMouseDown的事件中
ptCurrent.x= x; ptCurrent.y= y;
ptR = IMatrixR[x][y];
ptG = IMatrixG[x][y];
ptB = IMatrixB[x][y];
//我將我按的值assign給ptCurrent的x和y值
//在此我也可以知道起始點的ptR、ptG、ptB好做比較
找我們所按的初始點的相鄰像素
for(i=-1;i<=1;i++) //參考了小白的
for(j=-1;j<=1;j++)
{ x=ptCurrent.x + i;
y=ptCurrent.y + j;
if(FLAG[x][y]==0)
{
PushStack(x,y);
}
}
void PushStack(/*tagPOINT s*/int a, int b)
//s是一個指標?
{
tagPOINT s;
s.x = a; //對於s我不太了解所以把他換成x,y?可行?
s.y = b; //因為老師網誌中的h檔可放入指標、也可放兩個整數
if(iStackTop == STACKSIZE)
{
ShowMessage("overflow!");
exit(1);
}
else
{
Stack[iStackTop] = s;
iStackTop ++;
FLAG[s.x][s.y]=1
//這麼用對嘛? [s.x]、[s.y]
//FLAG[][]為1 ->已放入陣列中,在陣列中待處理
//有想要在這裡判斷出這點的R、G、B值
//然後和原點的R、G、B做比較,亦或是在PopStack()中再抓?
}
}
tagPOINT PopStack(void)
{
tagPOINT s;
s=Stack[iStackTop];
iStackTop --;
FLAG[s.x][s.y]=check(s.x,s.y);
return s;
//return我們pop出的這個數去做判斷
//判斷是否為相似的色相,並改變其FLAG[][]
}
找相似值:
要讓DIFFERENT = [(ptR-R)^2+(ptG-G)^2+(ptB-B)^2]^(1/2)
在我們所設定的範圍(RANGE)之內
如果DIFFERENT <= RANGE
則設定FLAGE[X][Y]= 2
FLAG[][]為2 ->已經處理過且為起始點的相似點,
如果DIFFERENT > RANGE 則
設定FLAG[X][Y]= 3
FLAG[][]為3 ->已經處理過但和起始點是相異點,
//以上這些我都還沒有判斷FLAG[][]為什麼時不需要做事等等...
//想了很久,整體感覺大概知道,但是拼湊不起來...
//關於那個iStackTop是指標!!->宣告全域 int iStackTop
多媒體專題_4(影像分割)
討論主題是影像分割(image segmentation),
課程大綱 目標五: 使學生能夠運用數位影像中色彩差異的觀念,
希望同學能夠撰寫程式將相近色彩的物件從影像中標示出來。
我們知道一張圖是由許多點(點的顏色由R, G, B共同組成)所組成,
每個點都可以由R, G, B來知道所含的顏色,
影像中像素相鄰的定義可以分成 4-neighbor 與 8-neighbor 兩種:
○○○○○○○○○○
○○○○○○○○○○
○○○○◎○○○○○設◎為我們要
○○○○○○○○○○作用的起始點。
○○○○○○○○○○
1. 4-neighbor:
○○○○○○○○○○
○○○○●○○○○○
○○○●◎●○○○○以◎延展開另外四點
○○○○●○○○○○為起始點的相鄰像素
○○○○○○○○○○
2. 8-neighbor:
○○○○○○○○○○
○○○●●●○○○○
○○○●◎●○○○○以◎延展開另外八點
○○○●●●○○○○為起始點的相鄰像素
○○○○○○○○○○
ex:(假設用4-neighbor)用這些格子來代表一張圖,
設定◎為我們要區分的中心
○○○○○○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○◎○○○○○->找●像素是否和
○○○○○○○○○○ ◎像素相似
○○○○○○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○●○○○○○
○○○●◎●○○○○
○○○○●○○○○○ ●為延展的點
○○○○○○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○●○○○○○
○○○※◎※○○○○->設只有●的像素和
○○○○●○○○○○ ◎像素相似, 再由
○○○○○○○○○○ ┼延展繼續找
○○○○○○○○○○ ●->┼
○○○○○○○○○○
○○○○●○○○○○
○○○●┼●○○○○ ┼->◎
○○○※◎※○○○○ ●為延展的點
○○○●┼●○○○○
○○○○●○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○※○○○○○
○○○※◎●○○○○
○○○※◎※○○○○->設只有●的像素和
○○○●◎●○○○○ ◎像素相似, 再由
○○○○●○○○○○ ┼延展繼續找
○○○○○○○○○○ ●->┼
○○○○○○○○○○
○○○○※●○○○○
○○○※◎┼●○○○ ┼->◎
○○○※◎※○○○○ ●為延展的點
○○●┼◎┼●○○○
○○○●┼●○○○○
○○○○●○○○○○
○○○○○○○○○○
○○○○※●○○○○
○○○※◎◎●○○○
○○○※◎※○○○○->設只有●的像素和
○○※◎◎◎※○○○ ◎像素相似, 再由
○○○●◎※○○○○ ┼延展繼續找
○○○○●○○○○○ ●->┼
○○○○○●○○○○
○○○○※┼●○○○
○○○※◎◎┼●○○ ┼->◎
○○○※◎※●○○○ ●為┼所延展的點
○○※◎◎◎※○○○
○○●┼◎※○○○○
○○○●┼●○○○○
○○○○○●○○○○
○○○○※◎●○○○
○○○※◎◎◎※○○
○○○※◎※※○○○->設只有●的像素和
○○※◎◎◎※○○○ ◎像素相似, 再由
○○※◎◎※○○○○ ┼延展繼續找
○○○※◎※○○○○ ●->┼
○○○○●┼●○○○
○○○○※◎┼●○○
○○○※◎◎◎※○○ ┼->◎
○○○※◎※※○○○ ●為┼所延展的點
○○※◎◎◎※○○○
○○※◎◎※○○○○
○○○※◎※○○○○
○○○○●◎※○○○
○○○○※◎◎※○○
○○○※◎◎◎※○○
○○○※◎※※○○○->設只有●的像素和
○○※◎◎◎※○○○ ◎像素相似, 再由
○○※◎◎※○○○○ ┼延展繼續找
○○○※◎※○○○○ ●->┼
○○○●┼◎※○○○
○○○○※◎◎※○○
○○○※◎◎◎※○○ ┼->◎
○○○※◎※※○○○ ●為┼所延展的點
○○※◎◎◎※○○○
○○※◎◎※○○○○
○○○※◎※○○○○
○○○※◎◎※○○○
○○○○※◎◎※○○ (沒相似的像素了)
○○○※◎◎◎※○○
○○○※◎※※○○○->設只有●的像素和
○○※◎◎◎※○○○ ◎像素相似, 再由
○○※◎◎※○○○○ ┼延展繼續找
○○○※◎※○○○○ ●->┼
○○○※◎◎※○○○
○○○○※◎◎※○○
○○○※◎◎◎※○○ ┼->◎
○○○※◎※※○○○ ●為┼所延展的點
○○※◎◎◎※○○○
○○※◎◎※○○○○
○○○※◎※○○○○
由上面階段性的下來可知道,所有◎皆是和剛開始那個◎像素相近的點,
這時候在將◎標示出來,即可知道在所點的這塊區域,哪邊像素是雷同的。
老師說需要用到陣列來儲存,
讓程式知道哪個像素已經做過處理,哪個像素還沒。
課程大綱 目標五: 使學生能夠運用數位影像中色彩差異的觀念,
希望同學能夠撰寫程式將相近色彩的物件從影像中標示出來。
我們知道一張圖是由許多點(點的顏色由R, G, B共同組成)所組成,
每個點都可以由R, G, B來知道所含的顏色,
影像中像素相鄰的定義可以分成 4-neighbor 與 8-neighbor 兩種:
○○○○○○○○○○
○○○○○○○○○○
○○○○◎○○○○○設◎為我們要
○○○○○○○○○○作用的起始點。
○○○○○○○○○○
1. 4-neighbor:
○○○○○○○○○○
○○○○●○○○○○
○○○●◎●○○○○以◎延展開另外四點
○○○○●○○○○○為起始點的相鄰像素
○○○○○○○○○○
2. 8-neighbor:
○○○○○○○○○○
○○○●●●○○○○
○○○●◎●○○○○以◎延展開另外八點
○○○●●●○○○○為起始點的相鄰像素
○○○○○○○○○○
ex:(假設用4-neighbor)用這些格子來代表一張圖,
設定◎為我們要區分的中心
○○○○○○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○◎○○○○○->找●像素是否和
○○○○○○○○○○ ◎像素相似
○○○○○○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○●○○○○○
○○○●◎●○○○○
○○○○●○○○○○ ●為延展的點
○○○○○○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○●○○○○○
○○○※◎※○○○○->設只有●的像素和
○○○○●○○○○○ ◎像素相似, 再由
○○○○○○○○○○ ┼延展繼續找
○○○○○○○○○○ ●->┼
○○○○○○○○○○
○○○○●○○○○○
○○○●┼●○○○○ ┼->◎
○○○※◎※○○○○ ●為延展的點
○○○●┼●○○○○
○○○○●○○○○○
○○○○○○○○○○
○○○○○○○○○○
○○○○※○○○○○
○○○※◎●○○○○
○○○※◎※○○○○->設只有●的像素和
○○○●◎●○○○○ ◎像素相似, 再由
○○○○●○○○○○ ┼延展繼續找
○○○○○○○○○○ ●->┼
○○○○○○○○○○
○○○○※●○○○○
○○○※◎┼●○○○ ┼->◎
○○○※◎※○○○○ ●為延展的點
○○●┼◎┼●○○○
○○○●┼●○○○○
○○○○●○○○○○
○○○○○○○○○○
○○○○※●○○○○
○○○※◎◎●○○○
○○○※◎※○○○○->設只有●的像素和
○○※◎◎◎※○○○ ◎像素相似, 再由
○○○●◎※○○○○ ┼延展繼續找
○○○○●○○○○○ ●->┼
○○○○○●○○○○
○○○○※┼●○○○
○○○※◎◎┼●○○ ┼->◎
○○○※◎※●○○○ ●為┼所延展的點
○○※◎◎◎※○○○
○○●┼◎※○○○○
○○○●┼●○○○○
○○○○○●○○○○
○○○○※◎●○○○
○○○※◎◎◎※○○
○○○※◎※※○○○->設只有●的像素和
○○※◎◎◎※○○○ ◎像素相似, 再由
○○※◎◎※○○○○ ┼延展繼續找
○○○※◎※○○○○ ●->┼
○○○○●┼●○○○
○○○○※◎┼●○○
○○○※◎◎◎※○○ ┼->◎
○○○※◎※※○○○ ●為┼所延展的點
○○※◎◎◎※○○○
○○※◎◎※○○○○
○○○※◎※○○○○
○○○○●◎※○○○
○○○○※◎◎※○○
○○○※◎◎◎※○○
○○○※◎※※○○○->設只有●的像素和
○○※◎◎◎※○○○ ◎像素相似, 再由
○○※◎◎※○○○○ ┼延展繼續找
○○○※◎※○○○○ ●->┼
○○○●┼◎※○○○
○○○○※◎◎※○○
○○○※◎◎◎※○○ ┼->◎
○○○※◎※※○○○ ●為┼所延展的點
○○※◎◎◎※○○○
○○※◎◎※○○○○
○○○※◎※○○○○
○○○※◎◎※○○○
○○○○※◎◎※○○ (沒相似的像素了)
○○○※◎◎◎※○○
○○○※◎※※○○○->設只有●的像素和
○○※◎◎◎※○○○ ◎像素相似, 再由
○○※◎◎※○○○○ ┼延展繼續找
○○○※◎※○○○○ ●->┼
○○○※◎◎※○○○
○○○○※◎◎※○○
○○○※◎◎◎※○○ ┼->◎
○○○※◎※※○○○ ●為┼所延展的點
○○※◎◎◎※○○○
○○※◎◎※○○○○
○○○※◎※○○○○
由上面階段性的下來可知道,所有◎皆是和剛開始那個◎像素相近的點,
這時候在將◎標示出來,即可知道在所點的這塊區域,哪邊像素是雷同的。
老師說需要用到陣列來儲存,
讓程式知道哪個像素已經做過處理,哪個像素還沒。
多媒體專題_3(色彩三屬性)
色彩的三屬性:
1.色相:色彩的相貌
ex: 紅,黃,藍‧‧
2.明度:色彩的明暗程度,
色彩的明度和光線的反射率有關,
反射較多時,色彩較亮,明度較亮,
反之,吸收光線較多時,色彩較暗,明度較低。
明度為區別色彩明暗深淺的差異程度,
ex:"深"藍色,"淺"藍色‧‧
任何顏色混合"白色",明度會上升,
任何顏色混合"黑色",明度會下降,
ex:有彩色(except黑白灰)光譜色中,黃色明度最高,藍紫色最低。
3.彩度:色彩中的飽和程度 or 色彩的純粹度。
純色不含任何雜色-->飽和度及純粹度最高,
因此任何色的純色,均為該色中彩度最高的顏色,
純色一但混合其他顏色,不論白,黑,灰或有彩色,都會降低其彩度,
混合越多彩度越低,
50%純紅+50%白色 的彩度 > 30%純紅+70%白色 的彩度,
A:40%純紅+60%白色(A和B比較下 A的明度大)
B:60%純紅+40%黑色(A和B比較下 B的彩度大)
無彩色-->只有明度-->無彩度無色相,
其他-->有彩色-->有色相有彩度有明度。
1.色相:色彩的相貌
ex: 紅,黃,藍‧‧
2.明度:色彩的明暗程度,
色彩的明度和光線的反射率有關,
反射較多時,色彩較亮,明度較亮,
反之,吸收光線較多時,色彩較暗,明度較低。
明度為區別色彩明暗深淺的差異程度,
ex:"深"藍色,"淺"藍色‧‧
任何顏色混合"白色",明度會上升,
任何顏色混合"黑色",明度會下降,
ex:有彩色(except黑白灰)光譜色中,黃色明度最高,藍紫色最低。
3.彩度:色彩中的飽和程度 or 色彩的純粹度。
純色不含任何雜色-->飽和度及純粹度最高,
因此任何色的純色,均為該色中彩度最高的顏色,
純色一但混合其他顏色,不論白,黑,灰或有彩色,都會降低其彩度,
混合越多彩度越低,
50%純紅+50%白色 的彩度 > 30%純紅+70%白色 的彩度,
A:40%純紅+60%白色(A和B比較下 A的明度大)
B:60%純紅+40%黑色(A和B比較下 B的彩度大)
無彩色-->只有明度-->無彩度無色相,
其他-->有彩色-->有色相有彩度有明度。
多媒體專題_2
所謂的飽和度,
指的其實是色彩的純度,
純度越高,表現越鮮明,
純度較低,表現則較黯淡,
分類歸納色彩系統時,
大都是植基於色彩的三個屬性-色相、飽和度及明亮度。
在 PhotoImpact 中選色時,除了顯示 RGB 的值外,
也會顯示 HSB 的對應值,
此處的 HSB,指的便是色相(Hue)、飽和度(Saturation)及明亮度( Brightness )。
色相 ( Hue )-也稱為色度,
可以想成特定波長的可見光,
也就是平常我們講的紅色、藍色、草綠...等,
飽和度(Saturation)-也稱為彩度,
指的是色彩的純度。
明亮度( Brightness )-指色彩的明黯度。
英文中的明亮度 Brightness,也以 Lightness、Value 表之,
所以,HSB、HSL、HSV...亦是同一件事情。
為了對應 RGB=256x256x256 的色域,
有的影像軟體也將 HSB 的程度分為 256x256x256=16,777,216 。
我們可以計算 Saturation 在各色相的分佈值,
進而求其平均數或中數,
便可以表達相同場景、條件下,兩張相片誰較飽和些
( 計算值應該介於 0 - 255 間,255 最大、0 最小 )?
指的其實是色彩的純度,
純度越高,表現越鮮明,
純度較低,表現則較黯淡,
分類歸納色彩系統時,
大都是植基於色彩的三個屬性-色相、飽和度及明亮度。
在 PhotoImpact 中選色時,除了顯示 RGB 的值外,
也會顯示 HSB 的對應值,
此處的 HSB,指的便是色相(Hue)、飽和度(Saturation)及明亮度( Brightness )。
色相 ( Hue )-也稱為色度,
可以想成特定波長的可見光,
也就是平常我們講的紅色、藍色、草綠...等,
飽和度(Saturation)-也稱為彩度,
指的是色彩的純度。
明亮度( Brightness )-指色彩的明黯度。
英文中的明亮度 Brightness,也以 Lightness、Value 表之,
所以,HSB、HSL、HSV...亦是同一件事情。
為了對應 RGB=256x256x256 的色域,
有的影像軟體也將 HSB 的程度分為 256x256x256=16,777,216 。
我們可以計算 Saturation 在各色相的分佈值,
進而求其平均數或中數,
便可以表達相同場景、條件下,兩張相片誰較飽和些
( 計算值應該介於 0 - 255 間,255 最大、0 最小 )?
多媒體專題_1
動態影像拍攝視訊大小為 320*240 像素,
每秒 30 個畫面 (frame),所以不含聲音部份,
原始視訊資料量應該為 320*240*3*30*12 = 82,944,000 Bytes。
換句話說, 就是 82.9 MB
(or 82,944,000 / 2^20 = 79.1MB)經過壓縮後, 才會變成不到 6 MB 的!)
Q1 :為什麼320*240*3*30*12 = 82,944,000 Bytes 中,要乘以3??
因為像素中有R,G,B三種色調,所以每種色調都需要抓一次,
所以320*240
(動態影像拍攝視訊大小)*3(抓R,G,B,共三次)*30(每秒30個畫面)*12(錄了12秒)
每一張影像中的每一個像素(一個點)
其實有3種基本色素組成"RGB"..紅.綠.藍..
所以同依畫面必須要 (記錄320*240個畫素再*3種顏色)
這就是一個畫面所需的儲存空間之後再*30張每秒*12秒
Q2 :為什麼像素要寫入陣列內??會比較好??
用兩個for迴圈將圖裡的像素(Pixel)寫入陣列(Array)中,
for(i=...)
for(j=...)
M[i][j]=GetRValue(Image1->Canvas->Pixel[i][j]);
將Image1第i行第j列的像素抓起來assing到陣列的第i行第j列,
設定好i,j值的範圍後讓M[i][j]=某種色
例如:(0,0,0) or clRed or 抓圖上的色...
總之...聽完的結果是...將像素放入陣列中運作,
會比較"快"。
每秒 30 個畫面 (frame),所以不含聲音部份,
原始視訊資料量應該為 320*240*3*30*12 = 82,944,000 Bytes。
換句話說, 就是 82.9 MB
(or 82,944,000 / 2^20 = 79.1MB)經過壓縮後, 才會變成不到 6 MB 的!)
Q1 :為什麼320*240*3*30*12 = 82,944,000 Bytes 中,要乘以3??
因為像素中有R,G,B三種色調,所以每種色調都需要抓一次,
所以320*240
(動態影像拍攝視訊大小)*3(抓R,G,B,共三次)*30(每秒30個畫面)*12(錄了12秒)
每一張影像中的每一個像素(一個點)
其實有3種基本色素組成"RGB"..紅.綠.藍..
所以同依畫面必須要 (記錄320*240個畫素再*3種顏色)
這就是一個畫面所需的儲存空間之後再*30張每秒*12秒
Q2 :為什麼像素要寫入陣列內??會比較好??
用兩個for迴圈將圖裡的像素(Pixel)寫入陣列(Array)中,
for(i=...)
for(j=...)
M[i][j]=GetRValue(Image1->Canvas->Pixel[i][j]);
將Image1第i行第j列的像素抓起來assing到陣列的第i行第j列,
設定好i,j值的範圍後讓M[i][j]=某種色
例如:(0,0,0) or clRed or 抓圖上的色...
總之...聽完的結果是...將像素放入陣列中運作,
會比較"快"。
訂閱:
文章 (Atom)
