2011-03-13 131 views
1

我已經使用EmguCV(openCV的包裝)在C#中編寫了一個程序。該程序使用camshift算法跟蹤對象。在對象周圍畫一個矩形。光標在矩形的中心移動。輸入來自攝像頭。通過OpenCV的Camshift算法控制鼠標指針(或鼠標基本功能)

最初的問題是光標無法覆蓋整個屏幕。其運動僅限於框架尺寸。所以我應用了一個乘法因子:

屏幕寬度/ framewidth在X方向上移動。

screenheight /在Y方向

運動通過該鼠標frameheight覆蓋整個區域。但鼠標移動不再流暢。我無法指出兩個密切相關的圖標。我怎樣才能使鼠標移動平滑,同時覆蓋整個屏幕,就像真正的鼠標一樣?

回答

5

要指出明顯:鼠標實現的非平滑來自於一個事實,即CAMSHIFT給出的矩形只精確到一個像素的精度,所以儘可能小的運動將屏幕尺寸/四捨五入到最近的屏幕像素。

如果是這種情況,可以應用某種類型的指針加速,就像使用真正的低質量鼠標時一樣(當然,如果使用數千dpi激光鼠標,則不需要對於這樣的事情)。基本上,光標在屏幕上移動的距離不是指針輸入的距離(在這種情況下是camshift矩形位移),而是其巧妙選擇的功能。所以,使用加速度函數f(x),移動指針的步驟將是這樣的:輸入指針的位移

  1. 計算向量,讓通過v來表示。
  2. 計算相應的單位長度向量,讓它表示爲u
  3. 屏幕上的指針的位移是V」 = F(| v |)* ü

我選擇F(X)在像測試 * E形式^(阿爾法 * X - 1),其中0 < 阿爾法和0 < 測試 < = 1是應憑經驗選擇的參數。

基本上,任何函數都會在0時導出1或更小的值(允許您爲精確的光標移動使用輸入的完整準確度),當x增加時轉爲無窮大(大移動應該對應於光標的大運動)是單調遞增的並具有單調遞增的第一導數。 編輯:還需要在0時加速度函數的值爲0,否則會發生非常奇怪的運動。:)

還期望有F(framewidth)= 屏幕寬度使得跨在光標所在幀結果移動被跟蹤的對象被在屏幕上移動。一個指數公式非常令人滿意,但使用二次或更高階的多項式可能會變得更簡單,這取決於在那裏的性能要求...

+0

我會做數學並且回饋給您。 – nishant 2011-03-14 05:38:05

+0

我有同樣的問題,先生您能否介紹一些關於您解釋的材料的鏈接?我需要爲基於網絡攝像頭的眼動追蹤HCI項目執行目光估計光標移動。 我的瞳孔位置因凝視而異,但我需要將它們映射爲健康平滑的光標移動。 這會很有幫助,謝謝。 – 2012-04-29 05:15:30