搜尋此網誌

2010年5月7日 星期五

WPF : Translate & Rotate

以Grid來舉例,在Grid.RenderTransform時,先做「TranslateTransform」或是先做「RotateTransform」是有差別的:

確實以(0,0)點做Rotate,意即先Rotate再做Translate:

<Grid.RenderTransform>
 <TransformGroup>
  <RotateTransform CenterX="0" CenterY="0" Angle="0"
  x:Name="Crash_MidFront_Rotate"/>
  <TranslateTransform X="560" Y="300"/>
 </TransformGroup>
</Grid.RenderTransform>


反之,將Translate放在Rotate之前,會先做Translate,再以(0,0)點做Rotate

2010年4月14日 星期三

Silverlight : Point Animation of Storyboard

運用Path元件中 LineSegment來製造3D的假像,以下紀錄對於LineSegment中 Point動畫的設定:


<Storyboard x:Name="BoxSide_LeftSide_Back" Duration="0:0:1" >
 <PointAnimation x:Name="PointMove_Left_TL"
  Storyboard.TargetName="BoxSide_LeftSide_TL"
  Storyboard.TargetProperty="(LineSegment.StartPoint)"
  From="0,0" To="0,0"/>
 <PointAnimation x:Name="PointMove_Left_TR"
  Storyboard.TargetName="BoxSide_LeftSide_TR"
  Storyboard.TargetProperty="(LineSegment.Point)"
  From="0,0" To="0,0"/>

 <PointAnimation x:Name="PointMove_Left_BL"
  Storyboard.TargetName="BoxSide_LeftSide_BL"
  Storyboard.TargetProperty="(LineSegment.Point)"
  From="0,0" To="0,0"/>
 <PointAnimation x:Name="PointMove_Left_BR"
  Storyboard.TargetName="BoxSide_LeftSide_BR"
  Storyboard.TargetProperty="(LineSegment.Point)"
  From="0,0" To="0,0"/>
</Storyboard>

其中一個Path元件的內容如下:

<Path  x:Name="BoxSide_BackSide" Stroke="Gold">
 <Path.RenderTransform>
  <TranslateTransform X="200" Y="0"/>
 </Path.RenderTransform>
 <Path.Fill>
  <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
   <GradientStop Color="#FF770000" Offset="0.0"/>
   <GradientStop Color="Black" Offset="1.0"/>
  </LinearGradientBrush>
 </Path.Fill>
 <Path.Data>
  <PathGeometry >
   <PathFigure StartPoint="90,100" IsClosed="True"   
    x:Name="BoxSide_BackSide_TL">
    <LineSegment Point="310,100" x:Name="BoxSide_BackSide_TR"/>
    <LineSegment Point="300,150" x:Name="BoxSide_BackSide_BR"/>
    <LineSegment Point="100,150" x:Name="BoxSide_BackSide_BL"/>
   </PathFigure>
  </PathGeometry>
 </Path.Data>
</Path>



假若Target直接指定Path元件,則TargetProperty設定值為:

Storyboard.TargetProperty=
 "(Path.Data).(PathGeometry.Figures)[0].
 (PathFigure.Segments)[0].(LineSegment.Point)"

可做到的效果(按下box前端及右端做上下拖拽):Box

2010年3月18日 星期四

C#:Dynamic Array

適用於 .NET 2.0 以上

無法確定陣列長度,要動態存取Grid陣列時:

List<Grid> dynamicGrid = new List<Grid>();

加入物件:

Grid myGrid = new Grid();
dynamicGrid.Add(myGrid)

取得物件,假設想要取得第一萬兩千三百四十五個Grid:

Grid tmpGrid = dynamicGrid[12345];


參考頁:http://forums.asp.net/p/1188478/2036031.aspx#2036031

2010年3月3日 星期三

3D Gesture:蠻有感覺的3D Gesture

參考頁:http://web.media.mit.edu/~mhirsch/bidi/
研究3D Gesture者可以參考一下,其內容為一種融合觸控及3D Gesture的LCD,其中他們同時提供paper,說明使用LCD同時達成「capture」及「display」。

Bidi Screen於YouTube的影片

2010年3月1日 星期一

Silverlight、C#:Unicode轉換

在C#中可使用以下程式碼對字串轉換為Unicode或將Unicode轉換為字元:

Encode

using System.Text;

private string StringToUnicode(string srcText)
{
  string dst = "";
  char[] src = srcText.ToCharArray();
  for (int i = 0; i < src.Length; i++)
  {
   byte[] bytes = Encoding.Unicode.GetBytes(src[i].ToString());
   string str = @"\u" + bytes[1].ToString("X2") + bytes[0].ToString("X2");
   dst += str;
  }
  return dst;
}

Decode

using System.Globalization;

private string UnicodeToString(string srcText)
{
string dst = "";
string src = srcText;
int len = srcText.Length / 6;

for (int i = 0; i <= len - 1; i++)
{
  string str = "";
  str = src.Substring(0, 6).Substring(2);
  src = src.Substring(6);
  byte[] bytes = new byte[2];
  bytes[1] =  
   byte.Parse(int.Parse
    (str.Substring(0,2),NumberStyles.HexNumber).ToString());
  bytes[0] = byte.Parse(int.Parse
    (str.Substring(2,  2),NumberStyles.HexNumber).ToString());
  dst += Encoding.Unicode.GetString(bytes);
  }
  return dst;
}


但上述程式碼中,Decode的部份在Slilverlight會出現「... is inaccessable due to its protection level」的錯誤,請改為以下內容,程式即可正常編譯:
Decode at Silverlight

string UnicodeToString(string srcText)
{
 string dst = "";
 string src = srcText;
 int len = srcText.Length / 6;

 for (int i = 0; i <= len - 1; i++)
 {
  string str = "";
  str = src.Substring(0, 6).Substring(2);
  src = src.Substring(6);
  byte[] bytes = new byte[2];
  bytes[1] = byte.Parse(int.Parse(str.Substring(0, 2),
   NumberStyles.HexNumber).ToString());
  bytes[0] = byte.Parse(int.Parse(str.Substring(2, 2),
   NumberStyles.HexNumber).ToString());

  Encoding enc = Encoding.GetEncoding("utf-16");
  dst += enc.GetString(bytes, 0, bytes.Length);

 }
  return dst;
}

2010年2月23日 星期二

HandVu:試以不同Posture做為『Start Posture』

最初HandVu在執行時,必需使用「Closed」手勢告知程式去「Start Recognize」:

這裡將嘗試使用「Vectory」手勢做為Start Recongnize手勢:


1、到config資料夾,可以找到以下檔案:
 a.  default.conductor
 b.  all_extended_0_5_10_15_closed_30x20.cascade
 c.  all_extended_0_5_10_15_closed_30x20.mask
 d.  all_hands_combined.cascade
 e.  victory.mask

2、請額外建立兩個檔案:
 a.  gestureTest.cascade
 b.  gestureTest.mask

3、將以上檔案(原有及新建共7個檔案)以文字檔的方式開啟,並同時將
 a.「all_extended_0_5_10_15_closed_30x20.cascade」的內容copy至「gestureTest.cascade」。
 b.「victory.mask」的內容copy至「gestureTest.mask」

4、到default.conductor(約第25行的位置)找到

1 detection cascades
all_extended_0_5_10_15_closed_30x20.cascade

all_extended_0_5_10_15_closed_30x20.cascade
改為gestureTest.cascade
上述動作即對原本讀取「all_extended_0_5_10_15_closed_30x20.cascade」來做Start Recognize Posture改為讀取「gestureTest.cascade」為之。
同時請到default.conductor檔案尾,將「all_extended_0_5_10_15_closed_30x20.mask」改為「gestureTest.mask」。

5、到「gestureTest.mask」,約第4行的位置,原先為

Mask "victory", 25x25, ratio 0.8

改為

Mask "start_on_victory", 25x25, ratio 0.8


6、到「all_hands_combined.cascade」,由內容往下(第83行)找到:

BRANCH 0 "victory" (fpr:8.48039e-21, dr:0.247505)


移到下一行,從「7 strong classifiers.」開始copy內容,直到發現下一個 「BRANCH」為止(copy至第369行)。

7、「gestureTest.cascade」中,找到「9 strong classifiers.」(約第4行),將此行以下的內容全數刪除,並將第6步所copy的內容由此處貼上。

8、到「gestureTest.cascade」約第3行,原為:

ClassifierCascade "CreatTest_closed_30x20" ... ...

取代為

ClassifierCascade "start_on_victory", sequential, 25x25, ratio 0.8 (fpr:1, dr:1, successful)


以上動作完成後,啟動程式,即能夠使用「victory posture」來做為 Start posture。

2010年2月2日 星期二

HandVu:Beta3.0 Source Code

一個已暫停開發且Open Source的手勢辦識Project:HandVu

有興趣可以下載研究一下(借用Google的App Engine,上傳檔案最大只能到10Mb,這裡將OpenCV分割後提供下載,請全部下載後再一起解壓縮):
OpenCV 0.97
OpenCV0.97-001
OpenCV0.97-002
OpenCV0.97-003
OpenCV0.97-004
OpenCV0.97-005
OpenCV0.97-006
HandVu Beta3.0
HandVu_Beta_3-001
HandVu_Beta_3-002
HandVu_Beta_3-003


這裡使用 MS Visual Studio 2008作為開發工具,執行時請注意,自備一臺Camera(NB上的Camera就行),另外需注意的是您必需將以下檔案置入 WINDOWS\system32 內:
1、highgui096.dll
2、cxcore097.dll
3、cv097.dll

以上檔案到OpenCV097搜尋都能找到(下載後,解壓縮會得到OpenCV097)。

如果你拿到了陽春的、沒有編譯過的HandVu Beta3.0檔案,大致上環境建立的步驟如下:

1、Setup OpenCV 0.97 (OpenCV : Intel® 的 Open Source Computer Vision Library),在這裡下載的OpenCV不需另外做Setup的動作。
2、編譯前別忘到 Options → Projects and Solutions → VC++ Directories 指定標頭檔及lib檔路徑(OpenCV's Library)
3、依序編譯HandVu Beta3.0內的Cublicles、HandVu、hv_OpenCV等專案(使用VS2008,自行指定需要被Include的h及lib檔案)。
4、編譯成功後,執行Release內的cmd.exe檔案,鍵入「hv_OpenCV.exe ..\..\config\default.conductor」,或者您可以製作一個 .bat檔案方便執行(將需鍵入的指命直接copy至.bat的內容即可)。