符文識別
因為最近想做一個符文解鎖的東西,用手畫一個符文好簡單,問題是怎麼讓電腦「知道」你畫的是什麼東西。

總之先由簡單的方式開始吧,用計算斜率變動方式來偵測出「角」的位置:

( 由於要識別的符文並不是什麼複雜的圖案,所以我就天真地覺得這種識別方式已經足夠了 )

然後便開始著手寫個小程序測試實用性:
由於這不太算是技術討論,只是總結一下近來做的東西,所以源碼會像這樣收起來。
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 ) ,可以算是神經網絡中的一種元素。

只要組合得當,也許能做出一些好像好帥的東西?雖然運作方式不同於腦部神經元,以入門來説應該足夠了吧?

( 待續 )
Profile picture
斟酌 鵬兄
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 服務被牆掉了,所以不能回覆了