2017-04-13 54 views
0

目標:我想通過Vuforia(網絡攝像頭/手機攝像頭)的AR攝像頭查看真實物體的寬度。圖像中物體的統一/ C#邊界框


點子:使用來自Vuforia的AR相機拍照,並找到的物體的邊界框(例如杯子)從該圖像;然後獲取邊界框的寬度(使用寬度信息我將縮放一個3d對象)。

例如:

image example1

image example2

我知道,有OpenCV進行的資產商店的統一,但我正在尋找一個免費的方法。 如果您對如何實現所提出的想法或任何有關如何實現目標的新想法有任何想法,任何事情都將不勝感激。

+0

你想達到什麼是可能的,只有手機可以首先承認某種標記的(可能是一張紙)。這將把3D環境映射到真實的世界環境。否則,你將不得不猜測物體的實際尺寸(以釐米爲單位)。你永遠無法辨別尺寸,因爲你不知道圖像是否被拍攝了10釐米。從物體或1米。來自對象。 – Hristo

回答

0

(編者)

一些搜索後,我發現你這個外觀極好方法here

public static Rect ObjectBounds(GameObject go) 
    { 
     Vector3 cen = go.GetComponent<Renderer>().bounds.center; 
     Vector3 ext = go.GetComponent<Renderer>().bounds.extents; 
     Vector2[] extentPoints = new Vector2[8] 
     { 
     HandleUtility.WorldToGUIPoint(new Vector3(cen.x-ext.x, cen.y-ext.y, cen.z-ext.z)), 
     HandleUtility.WorldToGUIPoint(new Vector3(cen.x+ext.x, cen.y-ext.y, cen.z-ext.z)), 
     HandleUtility.WorldToGUIPoint(new Vector3(cen.x-ext.x, cen.y-ext.y, cen.z+ext.z)), 
     HandleUtility.WorldToGUIPoint(new Vector3(cen.x+ext.x, cen.y-ext.y, cen.z+ext.z)), 
     HandleUtility.WorldToGUIPoint(new Vector3(cen.x-ext.x, cen.y+ext.y, cen.z-ext.z)), 
     HandleUtility.WorldToGUIPoint(new Vector3(cen.x+ext.x, cen.y+ext.y, cen.z-ext.z)), 
     HandleUtility.WorldToGUIPoint(new Vector3(cen.x-ext.x, cen.y+ext.y, cen.z+ext.z)), 
     HandleUtility.WorldToGUIPoint(new Vector3(cen.x+ext.x, cen.y+ext.y, cen.z+ext.z)) 
     }; 
     Vector2 min = extentPoints[0]; 
     Vector2 max = extentPoints[0]; 
     foreach (Vector2 v in extentPoints) 
     { 
      min = Vector2.Min(min, v); 
      max = Vector2.Max(max, v); 
     } 
     return new Rect(min.x, min.y, max.x - min.x, max.y - min.y); 
    } 

調用該方法,以一個矩形和繪圖它在屏幕上的一個例子:

void OnGUI() //EditorGUI.DrawRect must be in this function name 
{ 
    //create a rect using the method and the GameObject this script is attached to (gameObject) 
    Rect boundsRect = new Rect(GUIRectWithObject(gameObject)); 
    //draw a blue rect on the box of the rect (will hide the object) 
    EditorGUI.DrawRect(boundsRect, Color.blue); 
} 

爲了得到rect寫的寬度:

float boundswidth = boundsRect.width; 
+0

對不起,也許我還沒有得到足夠清晰,目標是通過網絡攝像頭/手機攝像頭看到一個真實的3D對象......我更新的問題 – Nap

+0

@Nap現在我明白了...我所提供的例子是獲取場景中存在的相對於其旋轉的實際3d對象的大小,但是您要達到的效果不同,請檢查它。 –

+0

@Nap我編輯了我的答案,你需要什麼,這個腳本會創建你的gameObject的「看到」框的矩形 –