Calculation of volumes on sharks


Esta publicación que os presentamos versa sobre el cálculo de volúmenes de tiburones empleando análisis de imagen. El objetivo es obtener volúmenes exactos de individuos de varias especies de tiburones pelágicos mediante fotografías referenciadas, y de esta manera poder llevar a cabo en el futuro estudios precisos sobre hidrodinámica, comportamiento de termorregulación, y ratios de consumo energético. Ha sido presentada recientemente en el congreso MARTECH 2011 celebrado en Cádiz.

System calculation of volumes by image analysis on sharks

Ignacio Gonzalez, Gonzalo Mucientes

Abstract: Determining the volume of an animal can help us to understand certain aspects of its hydrodynamics and thermodynamics, such as behavioral thermoregulation and energy consumption. This determination is difficult due to the irregular shapes of the animal’s body. On the other hand, large calibrated tanks are needed for measurements and this is not functional. We have designed an innovative mechanism to register morphological characteristics in a fast, low-cost way, using standard digital photography.

10 respuestas a “Calculation of volumes on sharks

Add yours

  1. La cuestion es que era mas facil (y mas rapido) utilizar admesh que rehacer el script python… (llamadme vago… :-P)

    Para la proxima version intentaremos pulirlo un poco mas…

  2. mmmh.. parece que el problema está al postear en ésta página, obviamente el código anterior quedaba así, sustituyendo espacios por_ para que se vea

    for f in faces:
    ___fverts = f.vertices
    ___ab,ac,ad = (verts[fverts[0]].co, verts[fverts[1]].co, verts[fverts[2]].co

  3. un ejemplo:

    for f in faces:
    fverts = f.vertices # getting face’s vertices
    ab = verts[fverts[0]].co
    ac = verts[fverts[1]].co
    ad = verts[fverts[2]].co

    entramos en un bucle que examina cada elemento de faces y la siguiente línea TIENE que estar indentada, es obligatorio por python, como no es el caso el bloque entero falla. Todo este bloque debería estar escrito más o menos así (con una pequeña corrección de paso para abreviar)

    for f in faces:
    fverts = f.vertices
    ab,ac,ad = (verts[fverts[0]].co, verts[fverts[1]].co, verts[fverts[2]].co

    Pero… como se ha perdido la indentación tampoco sabemos en donde acaba el buble, y eso ya es un problema más serio

  4. > «El que si que probé, y no funciona, es este:»

    El problema que tienes con tu script es típico de Python, ese script está deshecho porque ha perdido los tabuladores y espacios, no sólo es difícil arreglarlo sino incluso saber qué hace

    Por lo demás es cierto que los nombres de los módulos han cambiado, así que el primer script no va en el blender nuevo efectivamente, lo he mirado y necesita unos cuantos retoques para funcionar

  5. veo que el script es del 2005… y no creo que funcione en el blender actual (aunque he de decir que no lo he probado).

    El que si que probé, y no funciona, es este:

    Así que la opción de admesh es la mas sencilla (aparte de que de regalo te pule la malla y te cierra los huecos!!)

    # Made by Alexander Zubkov
    # mail to: contact@artdds.com OR mail@al-z.name
    # find me at http://www.artdds.com AND http://www.al-z.name

    import bpy

    class LayoutPanel(bpy.types.Panel):
    bl_label = «Volume & Mass Calc»
    bl_space_type = «PROPERTIES»
    bl_region_type = «WINDOW»
    bl_context = «data»
    density = 1.0
    volume_mass = 0.000

    bpy.types.Mesh.density = bpy.props.FloatProperty(
    name=»Material Density»,
    description=»Density of the Material»,
    default=1.0,
    min=0,
    max=100)

    def draw(self, context):
    layout = self.layout

    obj = bpy.context.object
    obj_data = obj.data

    row = layout.row()
    row.label(text=obj.name, icon=’OBJECT_DATA’)
    row.label(text=obj_data.name, icon=’MESH_DATA’)

    layout.label=(«Pulse la medida a calcular»)
    row =layout.row(aling=True)
    row.alignment = ‘EXPAND’
    row.operator(«object.button»,text=»Vol»).mode = 1
    row.operator(«object.button»,text=»Mass», icon=’MESH_DATA’).mode = 2

    row = layout.row()
    row.label(text=»Please check: ALL your mesh’s faces must be TRIs», icon=’INFO’)

    row = layout.row()
    row.prop(obj_data, «density»)

    row =layout.row(aling=False)
    row.label(«Volumen: » + str(round(volume_mass,3)), icon=’MESH_DATA’)
    row.label(text=»Masa: » + str(round(volume_mass * obj_data.density,3)), icon=’MESH_DATA’)

    class OBJECT_OT_Button(bpy.types.Operator):
    bl_idname = «object.button»
    bl_label = «Button»

    def execute(self,context):
    print(«Calculando lo mandado…»)

    verts = obj_data.vertices # array of vertices
    faces = obj_data.faces # array of faces
    volume_mass = 0; # VOLUME OF THE OBJECT

    for f in faces:
    fverts = f.vertices # getting face’s vertices
    ab = verts[fverts[0]].co
    ac = verts[fverts[1]].co
    ad = verts[fverts[2]].co

    # calculating determinator
    det = (ab[0]*ac[1]*ad[2]) – (ab[0]*ac[2]*ad[1]) – (ab[1]*ac[0]*ad[2]) + (ab[1]*ac[2]*ad[0]) + (ab[2]*ac[0]*ad[1]) – (ab[2]*ac[1]*ad[0])

    volume_mass = volume_mass + (det/6)

    print(«Volume: » + str(round(volume_mass,3)))
    print(«Mass: » + str(round(volume_mass * obj_data.density,6)))

    print(self.mode)
    return{‘FINISHED’}

    def register():
    bpy.utils.register_module(__name__)
    pass

    def unregister():
    bpy.utils.unregister_module(__name__)
    pass

    if __name__ == «__main__»:
    register()

  6. Ah, añado que Blender permite calcular volúmenes mediante varios plugins, y tambien podemos crearnos nuestros propios scripts y añadirselos sacando el destornillador y peleando con Python o mejor C

    De hecho veo que ya han hecho algo así:

    Autor: Scorpius, Nueva Jersey
    fuente: http://blenderartists.org/forum/showthread.php?49216-AreaVolume-script

    import Blender, vector, time

    object = Blender.Object.GetSelected()
    objname = object[0].name
    meshname = object[0].data.name
    mesh = Blender.NMesh.GetRaw(meshname)

    def tri_area1(face):
    v1, v2, v3 = face.v
    v1, v2, v3 = v1.co, v2.co, v3.co
    e1 = v1-v2
    e2 = v3-v2
    cp = Blender.Mathutils.CrossVecs(e1,e2)
    area = cp.length/2
    return area

    def tri_area2(face):
    v1, v2, v3 = face.v
    v1, v2, v3 = v1.co, v2.co, v3.co
    e1 = vector.vsub(v1,v2)
    e2 = vector.vsub(v3,v2)
    cp = vector.vcross(e1, e2)
    area = vector.vlen(cp)/2
    #volume = vector.vdot(v1, cp) * area / 3
    return area

    print
    start = time.clock()
    print «Area1:», sum([tri_area1(face) for face in mesh.faces]),
    end = time.clock()
    print «in %.2f %s» % (end-start, «seconds»)

    start = time.clock()
    print «Area2:», sum([tri_area2(face) for face in mesh.faces]),
    end = time.clock()
    print «in %.2f %s» % (end-start, «seconds»)

Replica a pvaldes Cancelar la respuesta

Crea un blog o un sitio web gratuitos con WordPress.com.

Subir ↑