符文識別 
  因為最近想做一個符文解鎖的東西,用手畫一個符文好簡單,問題是怎麼讓電腦「知道」你畫的是什麼東西。
總之先由簡單的方式開始吧,用計算斜率變動方式來偵測出「角」的位置:

( 由於要識別的符文並不是什麼複雜的圖案,所以我就天真地覺得這種識別方式已經足夠了 )
然後便開始著手寫個小程序測試實用性:
  
結果發現了一個個問題 ( 紅色圈標記斜率變動 -∞ <=> -1 <=> 0 <=> 1 <=> +∞ ):

首先是最後一個點怎麼看都應該是紅色才對

( 這個也好奇怪 )
弄了老半天才發現,手機觸屏 / 滑鼠 所給出的接觸點窄看之下沒有問題,但實際上是這個這子:

這很明顯是噪音問題 ( Noise ) 。由於識別的控制點 ( Control Point ) 並不需要太過準確,所以可以降低取樣頻率解決:

好了,這樣就能大致取得控制點了。
取得控制點之後要做什麼?
另一點則涉及到在機器學習 ( Machine Learning ) 中,一個叫模式識別 ( Pattern Recognition ) 的分支。
好處就是如果符文的樣式改變,我只須讓它重新學習一下就可以了,加上得出的數據某程度上來説人是解讀不了的,所以也可以放心開源。
本來我是想用簡單的方式,直接計算控制點的相對位置就算了。不過我想藉此機會開始踏入機器學習的領域上,這也跟我其中一個專案有著很大關係。加上要做的話我想以我的方式表現出來。理念就跟我的 blog 一樣,在這些功能背後所施展的工程,甚至某些功能本身,都坐在一角靜靜地等待被人發現。
懂了沒?簡單來説這個東西可以將東西分門別類,個人覺得這個發明好偉大。有點像是計算機的三極管 ( transistor ) ,可以算是神經網絡中的一種元素。
只要組合得當,也許能做出一些好像好帥的東西?雖然運作方式不同於腦部神經元,以入門來説應該足夠了吧?
( 待續 )
        總之先由簡單的方式開始吧,用計算斜率變動方式來偵測出「角」的位置:
( 由於要識別的符文並不是什麼複雜的圖案,所以我就天真地覺得這種識別方式已經足夠了 )
然後便開始著手寫個小程序測試實用性:
由於這不太算是技術討論,只是總結一下近來做的東西,所以源碼會像這樣收起來。
 private class ContinuousSlope
{
	private Vector2[] Points = new Vector2[ 2 ];
	public float Slope { get; private set; }
	public bool SlopeChanged = false;
	public ContinuousSlope()
	{
		Points[ 0 ] = new Vector2();
		Points[ 1 ] = new Vector2();
	}
	public void FeedPoint( Vector2 P )
	{
		Points[ 1 ] = Points[ 0 ];
		Points[ 0 ] = P;
		float OSlope = Slope;
		Slope = ( A.Y - B.Y ) / ( A.X - B.X );
		SlopeChanged = ( Slope < 0 && 0 < OSlope ) || ( Slope < 0 && 0 < OSlope );
	}
	Vector2 A { get { return Points[ 0 ]; } }
	Vector2 B { get { return Points[ 1 ]; } }
}結果發現了一個個問題 ( 紅色圈標記斜率變動 -∞ <=> -1 <=> 0 <=> 1 <=> +∞ ):
首先是最後一個點怎麼看都應該是紅色才對
( 這個也好奇怪 )
弄了老半天才發現,手機觸屏 / 滑鼠 所給出的接觸點窄看之下沒有問題,但實際上是這個這子:
這很明顯是噪音問題 ( Noise ) 。由於識別的控制點 ( Control Point ) 並不需要太過準確,所以可以降低取樣頻率解決:
好了,這樣就能大致取得控制點了。
取得控制點之後要做什麼?
識別符文的方式
方法有兩種,簡單一點的就是計算控制點的相對位置,例如第一個點必須在第二個點的左上方,第三個點必須在垂直方向的第一二點之間、第二點的右方等等。另一點則涉及到在機器學習 ( Machine Learning ) 中,一個叫模式識別 ( Pattern Recognition ) 的分支。
好處就是如果符文的樣式改變,我只須讓它重新學習一下就可以了,加上得出的數據某程度上來説人是解讀不了的,所以也可以放心開源。
本來我是想用簡單的方式,直接計算控制點的相對位置就算了。不過我想藉此機會開始踏入機器學習的領域上,這也跟我其中一個專案有著很大關係。加上要做的話我想以我的方式表現出來。理念就跟我的 blog 一樣,在這些功能背後所施展的工程,甚至某些功能本身,都坐在一角靜靜地等待被人發現。
感知器 ( Perceptron )
請先移步至 wiki 。懂了沒?簡單來説這個東西可以將東西分門別類,個人覺得這個發明好偉大。有點像是計算機的三極管 ( transistor ) ,可以算是神經網絡中的一種元素。
只要組合得當,也許能做出一些好像好帥的東西?雖然運作方式不同於腦部神經元,以入門來説應該足夠了吧?
( 待續 )

Mon Jun 06 2016 13:35:13 GMT+0000 (Coordinated Universal Time)
  Last modified: Sun Apr 10 2022 12:25:10 GMT+0000 (Coordinated Universal Time)
    Comments 
  No comments here.
   Do you even comment?
   website:   
 Not a valid website
 Invalid email format
 Please enter your email
 *Name: 
 Please enter a name
 Submit
 抱歉,Google Recaptcha 服務被牆掉了,所以不能回覆了