2017-04-13 1 views
0

Objectif: Je voudrais connaître la largeur d'un objet réel vu à travers la caméra AR de Vuforia (caméra webcam/téléphone).Unity/C# bounding box de l'objet de l'image


Idée: utiliser la caméra AR de Vuforia pour prendre une photo, et trouver la boîte englobante d'un objet (par exemple une tasse) de cette image; puis obtenir la largeur de la boîte de délimitation (avec les informations de largeur, je vais mettre à l'échelle un objet 3D).

exemple:

image example1

image example2

Je suis conscient qu'il ya OpenCV pour l'unité dans le magasin d'actifs, mais je suis à la recherche d'une méthode gratuite. Si vous avez des idées sur la façon de réaliser l'idée proposée ou de nouvelles idées sur la façon de mettre en œuvre l'objectif, tout serait grandement apprécié.

+0

Ce que vous voulez réaliser n'est possible que si le téléphone peut d'abord reconnaître une sorte de marqueur (pourrait être un morceau de papier). Cela permettrait de mapper l'environnement 3d à l'environnement réel. Sinon, vous devrez deviner la taille réelle (disons en centimètres) de l'objet. Vous ne pouvez jamais dire la taille, car vous ne savez pas si l'image est prise 10 cm. de l'objet ou 1 m. de l'objet. – Hristo

Répondre

0

(ÉDITÉ)

Après quelques recherches, je trouve cette méthode excelent here pour vous:

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); 
    } 

Un exemple d'appeler la méthode à un rect et le dessin sur l'écran:

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); 
} 

Pour que vous obteniez la largeur du rect, écrivez:

float boundswidth = boundsRect.width; 
+0

je suis désolé peut-être que je n'ai pas été assez clair, l'objet est un objet réel 3D vu à travers l'appareil photo webcam/téléphone ... j'ai mis à jour la question – Nap

+0

@Nap maintenant je comprends ... L'exemple que je fournis est pour obtenir la taille de l'objet 3d réel qui existe dans la scène par rapport à sa rotation, mais ce que vous essayez d'obtenir est différent, vérifiez-le. –

+0

@Nap J'ai édité ma réponse à ce dont vous avez besoin, ce script va créer un rect de la boîte "vu" de votre gameObject –