2012-06-14 31 views
2

我必須開發一個強度計,它將基本顯示均勻曝光圖像的平均強度等級。作爲照相機的焦點改變時,指針開始移動到正確的值在以下顯示:如何使用OpenCV創建動畫數字撥號/指示器?

enter image description here

隨着一個文本字段將顯示在數字的精確的強度值,以及,如在圖中可以看到。

到目前爲止,我已經能夠捕獲圖像並將其強度值存儲在文本文件中。現在我必須開發這個動畫圖像。我從來沒有使用OpenCV做過任何動畫,所以我正在尋找一些關於如何使用OpenCV來處理這種動畫的想法。

任何指針?

我的完整應用程序基於Windows窗體(C++),我使用OpenCV作爲其他
圖像處理任務(此處未列出)。

注意:儀表將基本顯示均勻曝光區域的平均強度等級。

更新

我已經得到了一些解決方案在這裏。

所以有一些研究,我知道現在的算法:

THETA = A *我

其中,

THETA =在該角度指針旋轉

A =比例係數

I =強度等級

旋轉角度將與強度水平成正比。

所以現在這裏是我計劃如何去:

1-使用cvNamedWindow

2-顯示圖像的靜態部分創建一個新的窗口,即圖中的轉盤,這永遠不會改變

3-顯示在中間

4-垂直指針指向獲取強度水平I的值,並應用上面的公式來計算西塔。

5-根據上面計算的角度,使用OpenCv函數旋轉指針。

可以驗證一下我的理解嗎?特別是請告訴我旋轉指針的最快功能是什麼?請讓我知道你是否可以進一步改進它。

+0

你說的圖像的亮度是什麼意思?不同的像素具有不同的強度。所以請解釋一下。 –

+0

儀表將基本顯示相機下均勻曝光區域的平均強度水平。 – gpuguy

+0

是否有你想用opencv做顯示部分的原因?我沒有製作GUI的經驗,但我曾經使用過一種叫做LabVIEW的語言,它有很多刻度盤,儀表等等。如果你有一些看起來像你正在製作的東西,你只需要控制用文本值撥號並粘貼一個文本框,它會對你有用嗎? – KobeJohn

回答

0

我會建議兩個選項。

  1. 使用庫:類似WxIndustrialControls我在評論中鏈接。
  2. 如果你真的想在opencv中繪製東西,請發佈迄今爲止的代碼,以便答案可以專注於你卡住的部分。

我沒有做過的OpenCV的繪畫,但我想我找到了部分你需要:

  • 簡單的圖像負載(例如imread或cvLoadImage
  • 繪圖功能(例如:fillPoly到畫你的針
  • 看起來像你可以使用簡單的cvShowImage快速更新圖像爲this person did with a camera feed
  • 一個公式可以將您的輸入強度值轉換爲一組點ts for fillPoly

請更新有關卡住哪些零件的更多詳細信息的問題。很抱歉,如果我鏈接到多個版本的opencv文檔。我猜這些基本功能應該不重要。

更新公式:

我沒有測試過這在所有,但它似乎像好玩的東西拿出:

假設:

  • 左中心==> 180度
  • 右中間==> 0度
  • 圖像原點是左上角
  • 像素順序是[列,行](即,[X,Y])

配置變量:

  • min_v ==>的值去在錶盤上的左邊緣
  • max_v ==>的值去在右側撥號邊緣
  • arc_size ==>您想要用於您的強度範圍的圓頂的度數
  • 半徑==>您的撥號頂部到中心的距離虛擬圓圈(大半徑==>扁平撥號)
  • top_padding ==>的靜態圖像的頂部針指向直線上升
  • needle_l當距離==>你想得出

輸入變量針/多邊形的長度:

  • needle_v ==>用於針值來表示

輸出變量:

  • needle_end ==>針在圖像方面外點座標
  • needle_start ==>針在圖像方面的內點座標

計算:

的可讀性:

left_a = 90 + (arc_size/2)    (angle for min_v) 
right_a = 90 - (arc_size/2)    (angle for max_v) 
value_range = (max_v - min_v) 

拿到角度針

value_proportion = (needle_v - min_v)/value_range 
needle_a = left_a - (value_proportion * arc_size) 

得到圓的虛擬中心(例如,該中心的一個在您的示例圖像將圖像外)

dial_origin = [int(image_width/2) , top_padding + radius] 

得到針起點和終點

needle_end[x] = dial_origin[x] - radius * cos(needle_a) 
needle_end[y] = dial_origin[y] - radius * sin(needle_a) 
needle_start[x] = dial_origin[x] - (radius - needle_l) * cos(needle_a) 
needle_start[y] = dial_origin[x] - (radius - needle_l) * sin(needle_a) 
+0

您的算法成功運行!我還探討了WXindustrialControl,但沒有理解代碼如此選擇我自己的實現。 – gpuguy

+0

聽起來很棒。你最終調用cvShowImage很多次,使它動畫?它光滑嗎? – KobeJohn

+0

使用步進電機改變焦點,所以它突然不平滑,事實上,我真的不再需要流暢的動畫了。感謝您的算法。 – gpuguy