2014年2月15日 星期六

[OpenCV] Mat 點線面取值技巧

Mat m;

取二維技巧
m(Rect(p1,p2));

m(Range(rx,ry) , Range(cx,cy));
全範圍可以用 Range::all()

或乾脆這樣做
m.rowRange(rx,ry);
m.colRange(cx,cy);


取一條線技巧
m.row(r).colRange(cx,cy);
m.col(c).rowRange(rx,ry);

取一點
m.data[x*step + y] (效率較高,但無邊界判斷)
m.at(x,y)

2013年10月1日 星期二

[named pipe教學] 讓C++和C#的程序互相溝通(IPC) 附程式碼

pipe的用途是讓同一台電腦上的兩個不同的process在執行時互相溝通,或是讓不同網路的兩台電腦互相溝通,大多數作業系統,如Linux、Free BSD、windows都各自有自己的pipe的API,本文以windows為主

windows上的pipe有兩種
1. anonymous pipe
2. named pipe

顧名思義,前者的pipe沒有名字,後者有名字
anonymous pipe主要用在parent process和child process之間的溝通,但只能用在單一電腦上。至於named pipe就比較強大,可以用在跨網路上

本文以windows上的named pipe為範例

C# server
using System.IO.Pipes;

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mypipe"))
                {
                    pipeStream.WaitForConnection();
                    StreamReader sr = new StreamReader(pipeStream);                  
                 
                    string tmp;
                    while ((tmp = sr.ReadLine()) != null)                                          
                        pipeMsg.Text += tmp + "\r\n";
                 
                }


C++ client

#include <windows.h>
#include <stdio.h>

hFile = CreateFile("//./pipe/mypipe", GENERIC_WRITE,
                         FILE_SHARE_READ | FILE_SHARE_WRITE , NULL, OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
DWORD dw = GetLastError();
printf("CreateFile failed for Named Pipe client\n:" );
break;
}
else
{
flg = WriteFile(hFile, s.c_str(), s.length(), &dwWrite, NULL);
if (FALSE == flg)
printf("WriteFile failed for Named Pipe client\n");

CloseHandle(hFile);
}
C#已經把windows的named pipe API包得好好的,因此程式碼看起來比較平易近人。
至於C++這邊要注意的是,連到named  pipe時的路徑,要在pipe名稱前面加上
//./pipe/
否則會連不上唷

以下為完整可編譯的專案 (VS 2012)
https://docs.google.com/file/d/0Byr8Dpnq_aK8cUN3UjhPbUdsTUE/edit?usp=sharing


參考資料
http://www.cnblogs.com/yukaizhao/archive/2011/08/04/system-io-pipes.html

2013年5月7日 星期二

Inverted File 簡介

搜尋引擎在搜尋的時候,如果單純用字串比對就太遜了,效率太差
一定要用索引(indexing)的技術,顧名思義,索引就像是去圖書館借書一樣,
從館藏目錄中,依據字母順序找到想要的書,書名旁邊標示著書本放在哪個櫃子

這邊介紹一個經典的索引技術 - Inverted File
Inverted File 是一種資料結構,記錄著每個字所在的位置,以下舉一個教科書經典例子

假設

S1 = "Have you ever seen tropical fish?"
S2 = "Do you like fish?"
S3 = "My uncle raise tropical fish."
S4 = "My cat ate fish and tropical fruits."



存成 Inverted File 資料結構為:
"單字" : { (單字在哪份文件,單字在該文件的位置) }


"and"     : {(4,5)}
"ate"     : {(4,3)}
"cat"     : {(4,2)}
"do"      : {(2,1)}
"ever"    : {(1,3)}
"fish"    : {(1,6), (2,4), (3,5), (4,4)}
"fruits"  : {(4,7)}
"have"    : {(1,1)}
"like"    : {(2,3)}
"my"      : {(3,1), (4,1)}
"raise"   : {(3,3)}
"seen"    : {(1,4)}
"tropical": {(1,5), (3,4), (4,6)}
"uncle"   : {(3,2)}
"you"     : {(1,2), (2,2)}


假設我們今天要搜尋 "raise tropical fish"
利用Inverted File一個一個字去查,對單字在哪份文件取交集
{(3,3)} ∩ {(1,5), (3,4), (4,6)} ∩  {(1,6), (2,4), (3,5), (4,4)}  =  {(3,3~5)}
我們可以得知 "raise tropical fish" 這句話在S3的第3~5個字

2013年4月30日 星期二

Kalman Filter 簡介

一開始先講,這裡的filter是什麼呢
假設從初始時間開始,系統就紀錄了某一系統狀態的值
而這個值受到雜訊的影響, 所以你不能直接拿來用

利用從第一筆資料到目前的資料,來估算之前某一時刻的狀態值, 這種演算法稱為smoothing
利用從第一筆資料到目前的資料,來估算目前的狀態值, 這種演算法稱為filtering
利用從第一筆資料到目前的資料,來估算未來某一時刻的狀態值, 這種演算法稱為prediction

Kalman filter只是在做上述的filtering動作,這方法源自於Kalman在1960年代發表的論文,連結如下
http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf 


Kalman filter概念

為了簡單快速了解,這裡舉了一個簡單的例子來說明Kalman filter的概念

假設我們要研究一個房間的溫度,根據經驗判斷,這個房間是恆溫的。
但事實上,房間不是恆溫的,你的經驗估出來的溫度,可能會有幾度的誤差,這些誤差就是所謂的 white Gaussian noise,和時間無關地的雜訊。

此外,我們也在房間內放了一支溫度計,但溫度計也不是準確的,測量值和實際值也存在著誤差( white Gaussian noise )。

接下來,Kalman filter要做的事,就是根據你的經驗法則和溫度計量到的溫度,來估算房間實際的溫度。
這邊要注意的是,這個估算出來的實際溫度也會有誤差,但隨著時間往後,每次算出來的實際溫度的誤差也會越來越小!

計算過程:
經驗法則預測的誤差 和 溫度計的誤差為已知的系統參數

Step 1 , state and covariance prediction
假設我們要估算時間K的實際溫度,首先我們根據K-1時刻的溫度,來預測K時刻的溫度。
假設K-1時刻時,房間溫度是23度,我們預測K時刻房間溫度也是23度K時刻預測的誤差為5度

這邊的5度是如何得知的呢?如果K-1時刻實際溫度的誤差是3,經驗法則預估的誤差為4,那麼將他們平方相加在開根號,就是K時刻預測的誤差。

然後再去看我們溫度計量出來的結果,假設為25度,同時該溫度計的誤差是4度。

Step 2 , Kalman gain correction and state correction
我們預測房間溫度是23度,測量到的溫度是25度,那麼實際溫度到底是多少呢?
該相信哪邊多一點呢? 這邊就要看Kalman gain了。
Kalman gain的計算要用到前面的兩個誤差  
Kg^2 = 5^2 /  (5^2 + 4^2) = 0.78

Kalman gain的值,我們可以推算出K時刻的實際溫度是
預測值 + Kalman gain * (量測值 - 預測值)
23 + 0.78* (25 -23) = 24.56
這邊可以看出,因為溫度計的誤差較K時刻預測的誤差小(比較相信溫度計),所以實際溫度偏向溫度計的值

Step 3 , covariance correction
但是這個實際溫度還是有誤差,可由以下式子算出K時刻實際溫度的誤差
((1-Kg)*5^2)^0.5=2.35 
這裡的5是K時刻預測的誤差,算出來的2.35對應到前面的3 (K-1時刻的實際溫度誤差)
接下來我們就可以進入K+1時刻了!

根據以上規則,Kalman filter一直迭代下去,
我們可以發現實際溫度的誤差(covariance)會慢慢的變小,我們得到的實際溫度也會越來越準確!


看完以上部分,是否對Kalman filter有簡單的認識呢?
關於Kalman filter演算法嚴謹的數學描述,有時間我會在本篇文章繼續更新!


參考資料:
http://bilgin.esme.org/BitsBytes/KalmanFilterforDummies.aspx
http://allenluadvance.blogspot.tw/2009/09/kalman-filter.html
http://tw.knowledge.yahoo.com/question/question?qid=1009071507134
http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf 






2013年4月24日 星期三

Information Retrieval

最近比賽要用到的query expansion,是Information Retrieval領域的一部分
以下為參考資料

陳信希教授開的 Information Retrieval and Extraction 

只有2009年這課程的投影片沒設密碼,所以這邊貼出09年的課程網站
不過還是可以根據底下列的推薦用書去查query expansion部分
連結:http://nlg.csie.ntu.edu.tw/courses/IR/IR2009.html

Introduction to Information Retrieval 

2008出版的IR參考書,官網上有電子書和投影片,我們要的query expansion在第九章
連結:http://nlp.stanford.edu/IR-book/


Modern Information Retrieval

整個第五章在講query expansion,礙於版權問題,就不放連結
去GOOGLE一下就有電子書了
http://www.cs.utexas.edu/~mooney/ir-course/
這連結是本書的相關課程的投影片

2013年4月11日 星期四

如何在.NET平台繪製統計圖表 (使用C# + ZedGraph函式庫)

首先先去官方網站http://zedgraph.sourceforge.net/linesamples.html
下載ZedGraph之後

導入visual studio 2010

在visual studio 2010的工具箱,右鍵→選擇項目→在.NET FRAMEWORK的頁面下按瀏覽,
找到ZedGraph.dll,加入後就可以在工具箱看到ZedGraphControl了


簡介


將ZedGraphControl拉近程式後,可以看到空的圖表,如果要看title、X axis、Y axis這幾個字樣不爽的話,我們可以透過以下的程式碼來修改


zedGraphControl1.GraphPane.Title.Text = "標題測試";
zedGraphControl1.GraphPane.XAxis.Title.Text = "X軸";
zedGraphControl1.GraphPane.YAxis.Title.Text = "Y軸";



接下來我們以長條圖和折線圖作範例

首先定義資料


double[] data1 = { 1, 3, 5, 7, 9, 11 };

double[] data2 = { 2, 4, 6, 8, 10, 12 };

double[] data3 = { 5, 2, 6, 7, 5, 2 };



長條圖

BarItem myBar;  //長條圖
myBar = zedGraphControl1.GraphPane.AddBar("資料1", null, data1, Color.Red);
myBar.Bar.Fill = new Fill(Color.Red, Color.White, Color.Red);
myBar = zedGraphControl1.GraphPane.AddBar("資料2", null, data2, Color.Green);
myBar.Bar.Fill = new Fill(Color.Green, Color.White, Color.Green);
myBar = zedGraphControl1.GraphPane.AddBar("資料3", null, data3, Color.Purple);
myBar.Bar.Fill = new Fill(Color.Purple, Color.White, Color.Purple);

折線圖

LineItem myCurve;   //折線圖

myCurve = zedGraphControl1.GraphPane.AddCurve("資料1", null, data1, Color.Red);
myCurve.Line.Fill = new Fill(Color.Red, Color.White, Color.Red);
myCurve = zedGraphControl1.GraphPane.AddCurve("資料2", null, data2, Color.Green);
myCurve.Line.Fill = new Fill(Color.Green, Color.White, Color.Green);
myCurve = zedGraphControl1.GraphPane.AddCurve("資料3", null, data3, Color.Purple);
myCurve.Line.Fill = new Fill(Color.Purple, Color.White, Color.Purple);

以上二選一,接下來設定座標軸資料、更新圖表,就可以畫出統計圖了!


string[] xTitle = { "1", "2", "3", "4", "5", "6" }; //X軸的刻度資料
zedGraphControl1.GraphPane.XAxis.Scale.TextLabels = xTitle;
zedGraphControl1.GraphPane.XAxis.Type = AxisType.Text;
zedGraphControl1.GraphPane.Chart.Fill = new Fill(Color.White, Color.FromArgb(255, 255, 166), 90F);
zedGraphControl1.GraphPane.Fill = new Fill(Color.FromArgb(250, 250, 255));
zedGraphControl1.AxisChange();
zedGraphControl1.Refresh();

如果要清除統計圖,可以這樣做

zedGraphControl1.GraphPane.CurveList.Clear();//把舊的圖資清掉


2013年4月6日 星期六

26個應聘時最漂亮的回答

覺得這篇文章還不錯,就轉過來了
轉貼自:http://aobiman.blogspot.tw/2013/03/26.html  (原始出處不可考)



1、請你自我介紹一下自己好嗎?
  
  回答提示:一般人回答這個問題過於平常,只說姓名、年齡、愛好、工作經驗,這些在簡歷上都有。
其實,企業最希望知道的是求職者能否勝任工作,包括:最強的技能、最深入研究的知識領域、個性中最積極的部分、
做過的最成功的事,主要的成就等,這些都可以和學習無關,也可以和學習有關,但要突出積極的個性和做事的能力,
說得合情合理企業才會相信。企業很重視一個人的禮貌,求職者要尊重考官,在回答每個問題之後都說一句“謝謝”,企業喜歡有禮貌的求職者。
  
2、你覺得你個性上最大的優點是什麼?
  
  回答提示:沉著冷靜、條理清楚、立場堅定、頑強向上、樂於助人和關心他人、適應能力和幽默感、樂觀和友愛。
我在北大青鳥經過一到兩年的培訓及專案實戰,加上實習工作,使我適合這份工作。
  
3、說說你最大的缺點?
  
  回答提示:這個問題企業問的概率很大,通常不希望聽到直接回答的缺點是什麼等,如果求職者說自己小心眼、愛忌妒人、非常懶、脾氣大、工作效率低,企業肯定不會錄用你。
絕對不要自作聰明地回答“我最大的缺點是過於追求完美”,有的人以為這樣回答會顯得自己比較出色,但事實上,他已經岌岌可危了。
企業喜歡求職者從自己的優點說起,中間加一些小缺點,最後再把問題轉回到優點上,突出優點的部分,企業喜歡聰明的求職者。
  
4、你對薪資的要求?
  
  回答提示:如果你對薪酬的要求太低,那顯然貶低自己的能力;如果你對薪酬的要求太高,那又會顯得你分量過重,公司受用不起。
一些雇主通常都事先對求聘的職位定下開支預算,因而他們第一次提出的價錢往往是他們所能給予的最高價錢,他們問你只不過想證實一下這筆錢是否足以引起你對該工作的興趣。
  
  回答樣本一:我對工資沒有硬性要求,我相信貴公司在處理我的問題上會友善合理。
                       我注重的是找對工作機會,所以只要條件公平,我則不會計較太多。
  
  回答樣本二:我受過系統的軟體程式設計的訓練,不需要進行大量的培訓,而且我本人也對程式設計特別感興趣。
                       因此,我希望公司能根據我的情況和市場標準的水準,給我合理的薪水。
  
  回答樣本三:如果你必須自己說出具體數目,請不要說一個寬泛的範圍,那樣你將只能得到最低限度的數字。
最好給出一個具體的數字,這樣表明你已經對當今的人才市場作了調查,知道像自己這樣學歷的雇員有什麼樣的價值。
  
5、你對加班的看法?
  
  回答提示:實際上好多公司問這個問題,並不證明一定要加班,只是想測試你是否願意為公司奉獻。
  
  回答樣本:如果工作需要我會義不容辭加班,我現在單身,沒有任何家庭負擔,可以全身心的投入工作。但同時我也會提高工作效率,減少不必要的加班。
  

  
6、如果通過這次面試我們錄用了你,但工作一段時間卻發現你根本不適合這個職位,你怎麼辦?
  
  回答提示:一段時間發現工作不適合我,有兩種情況:①如果你確實熱愛這個職業,那你就要不斷學習,
虛心向領導和同事學習業務知識和處事經驗,瞭解這個職業的精神內涵和職業要求,力爭減少差距;②你覺得這個職業可有可無,
那還是趁早換個職業,去發現適合你的,你熱愛的職業,那樣你的發展前途也會大點,對單位和個人都有好處。
  
7、談談你對跳槽的看法?
  
  回答提示:①正常的“跳槽”能促進人才合理流動,應該支持。②頻繁的跳槽對單位和個人雙方都不利,應該反對。
  
8、工作中難以和同事、上司相處,你該怎麼辦?
  
  回答提示:①我會服從領導的指揮,配合同事的工作。②我會從自身找原因,仔細分析是不是自己工作做得不好讓領導不滿意,
同事看不慣。還要看看是不是為人處世方面做得不好,如果是這樣的話我會努力改正。③如果我找不到原因,我會找機會跟他們溝通,
請他們指出我的不足,有問題就及時改正。④作為優秀的員工,應該時刻以大局為重,即使在一段時間內,領導和同事對我不理解,
我也會做好本職工作,虛心向他們學習,我相信,他們會看見我在努力,總有一天會對我微笑的。
  
9、你對於我們公司瞭解多少?
  
  回答提示:在去公司面試前上網查一下該公司主營業務。如回答:貴公司有意改變策略,加強與國外大廠的OEM合作,自有品牌的部分則透過海外經銷商。
  
10、最能概括你自己的三個詞是什麼?
  
  回答提示:我經常用的三個詞是:適應能力強,有責任心和做事有始終,結合具體例子向主考官解釋,
  
11、你的業餘愛好是什麼?
  
  回答提示:找一些富於團體合作精神的,這裡有一個真實的故事:有人被否決掉,因為他的愛好是深海潛水。主考官說:因為這是一項單人活動,我不敢肯定他能否適應團體工作。
  

  
12、作為被面試者給我打一下分?
  
  回答提示:試著列出四個優點和一個非常非常非常小的缺點(可以抱怨一下設施,沒有明確責任人的缺點是不會有人介意的)。
  
13、你為什麼要離開原來的公司?
  
  回答提示:①回答這個問題時一定要小心,就算在前一個工作受到再大的委屈,對公司有多少的怨言,都千萬不要表現出來,
尤其要避免對公司本身主管的批評,避免面試官的負面情緒及印象。建議此時最好的回答方式是將問題歸咎在自己身上,
例如覺得工作沒有學習發展的空間,自己想在面試工作的相關產業中多加學習,或是前一份工作與自己的生涯規劃不合等等,
回答的答案最好是積極正面的。②我希望能獲得一份更好的工作,如果機會來臨,我會抓住。我覺得目前的工作,已經達到頂峰,即沒有升遷機會。
  
14、你欣賞哪種性格的人?
  
  回答提示:誠實、不死板而且容易相處的人、有“實際行動”的人。
  
15、你通常如何對待別人的批評?
  
  回答提示:①沈默是金,不必說什麼,否則情況更糟,不過我會接受建設性的批評。②我會等大家冷靜下來再討論。
  
16、怎樣對待自己的失敗?
  
  回答提示:我們大家生來都不是十全十美的,我相信我有第二個機會改正我的錯誤。
  

  
17、你為什麼願意到我們公司來工作?
  
  回答提示:對於這個問題,你要格外小心,如果你已經對該單位作了研究,你可以回答一些詳細的原因,像“公司本身的高技術開發環境很吸引我。
”、“我同公司出生在同樣的時代,我希望能夠進入一家與我共同成長的公司。”、“你們公司一直都穩定發展,在近幾年來在市場上很有競爭力。
”、“我認為貴公司能夠給我提供一個與眾不同的發展道路。”這都顯示出你已經做了一些調查,也說明你對自己的未來有了較為具體的遠景規劃。
  
18、對這項工作,你有哪些可預見的困難?
  
  回答提示:①不宜直接說出具體的困難,否則可能令對方懷疑應聘者不行。②可以嘗試迂回戰術,
說出應聘者對困難所持有的態度——工作中出現一些困難是正常的,也是難免的,但是只要有堅忍不拔的毅力、良好的合作精神以及事前周密而充分的準備,任何困難都是可以克服。
  
19、如果錄用了你,你將怎樣開展工作?
  
  回答提示: ①如果應聘者對於應聘的職位缺乏足夠的瞭解,最好不要直接說出自己開展工作的具體辦法。
②可以嘗試採用迂回戰術來回答,如“首先聽取領導的指示和要求,然後就有關情況進行瞭解和熟悉,接下來制定一份近期的工作計畫並報領導批准,最後根據計畫開展工作。”。
  
  分析:這個問題的主要目的也是瞭解應聘者的工作能力和計劃性、條理性,而且重點想要知道細節。如果向思路中所講的迂回戰術,面試官會認為回避問題,如果引導了幾次仍然是回避的話,此人絕對不會錄用了。
  
20、你希望與什麼樣的上級共事?
  
  回答提示:①通過應聘者對上級的“希望”可以判斷出應聘者對自我要求的意識,這既上一個陷阱,又是一次機會。②最好回避對上級具體的希望,多談對自己的要求。③如“做為剛步入社會的新人,我應該多要求自己儘快熟悉環境、適應環境,而不應該對環境提出什麼要求,只要能發揮我的專長就可以了。
  
  分析:這個問題比較好的回答是,希望我的上級能夠在工作中對我多指導,對我工作中的錯誤能夠立即指出。總之,從上級指導這個方面談,不會有大的紕漏。
  
21、與上級意見不一時,你將怎麼辦?
  
  回答提示:①一般可以這樣回答“我會給上級以必要的解釋和提醒,在這種情況下,我會服從上級的意見。”②如果面試你的是總經理,而你所應聘的職位另有一位經理,且這位經理當時不在場,可以這樣回答:“對於非原則性問題,我會服從上級的意見,對於涉及公司利益的重大問題,我希望能向更高層領導反映。”
  
  分析:這個問題的標準答案是思路①,如果用②的回答,必死無疑。你沒有摸清楚改公司的內部情況,先想打小報告,這樣的人沒有人敢要。
  

  
22、為什麼選擇我們公司?
  
  回答提示:曾經在報章雜誌看過關於貴公司的報導,與自己所追求的理念有志一同。而貴公司在業界的成績也是有目共睹的,而且對員工的教育訓練、升遷等也都很有制度。
  
  分析:去面試前先做功課,瞭解一下該公司的背景,讓對方覺得你真的很有心想得到這份工作,而不只是探探路。
  
  23、談談如何適應辦公室工作的新環境?
  
  回答提示①辦公室裡每個人有各自的崗位與職責,不得擅離崗位。②根據領導指示和工作安排,制定工作計畫,提前預備,並按計劃完成。③多請示並及時彙報,遇到不明白的要虛心請教。④抓間隙時間,多學習,努力提高自己的政治素質和業務水準。
  
24、除了本公司外,還應聘了哪些公司?
  
  回答提示:很奇怪,這是相當多公司會問的問題,其用意是要概略知道應徵者的求職志向,所以這並非絕對是負面答案,就算不便說出公司名稱,也應回答“銷售同種產品的公司”,如果應聘的其他公司是不同業界,容易讓人產生無法信任的感覺。
  
25、你還有什麼問題要問嗎?
  
  回答提示:企業的這個問題看上去可有可無,其實很關鍵,企業不喜歡說“沒問題”的人,因為其很注重員工的個性和創新能力。企業不喜歡求職者問個人福利之類的問題,如果有人這樣問:貴公司對新入公司的員工有沒有什麼培訓項目,我可以參加嗎?或者說貴公司的晉升機制是什麼樣的?企業將很歡迎,因為體現出你對學習的熱情和對公司的忠誠度以及你的上進心。
  
26、如果你被錄用,何時可以到職?
  
  回答提示:大多數企業會關心就職時間,最好是回答“如果被錄用的話,到職日可按公司規定上班”,但如果還未辭去上一個工作、上班時間又太近,似乎有些強人所難,因為交接至少要一個月的時間,應進一步說明原因,錄取公司應該會通融的。