Buscar un objeto dentro de una escena

Imagen de palichis

Opencv no solo trabaja con el archivo de entrenamiento, si no que también lo hace con dos imágenes.
El ejemplo que traigo ahora es el reconocimiento de un objeto dentro de una escena, es decir presentamos dos imágenes, la primera del objeto a reconocer y la segunda de la escena.


El siguiente algoritmo reconoce patrones mas destacados de la primera imagen y realiza una busqueda dentro de la segunda para reconocerlo dentro de esta.

#!/usr/bin/env python
from sys import argv, stderr
from ctypes import *
from cv import *
import cv
from numpy import *

image = None

def compareSURFDescriptors(d1, d2, best, length):
    total_cost = 0
    length = len(d1)
    assert( length % 4 == 0 )
    for i in range(0, length, 4):
        t0 = d1[i] - d2[i]
        t1 = d1[i+1] - d2[i+1]
        t2 = d1[i+2] - d2[i+2]
        t3 = d1[i+3] - d2[i+3]
        total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3
        if total_cost > best:
            break
    return total_cost

def naiveNearestNeighbor(vec, laplacian, model_keypoints, model_descriptors):
    length = len(model_keypoints)
    neighbor = -1
    dist1 = 1e6
    dist2 = 1e6

    for i in range(len(model_descriptors)):
        if  laplacian != model_keypoints[i][1]:
            continue
        d = compareSURFDescriptors(vec, model_descriptors[i], dist2, length)
        if d = 0:
            ptpairs.append((i,nn))
    
    return ptpairs

def locatePlanarObject(objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, src_corners, dst_corners):
    ptpairs = findPairs(objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors)
    n = len(ptpairs)
    if n  ]\n" \
            % (object_filename, scene_filename))
        exit(-1)
    
    object_color = cv.CreateImage(cv.GetSize(object), 8, 3)
    resutl_color = cv.CreateImage(cv.GetSize(image), 8, 3)
    cv.CvtColor( object, object_color, cv.CV_GRAY2BGR )
    cv.CvtColor( image, resutl_color, cv.CV_GRAY2BGR )
    imageKeypoints = None
    imageDescriptors = None
    params = (1, 2000, 3, 2)

    tt = float(cv.GetTickCount())
    objectKeypoints, objectDescriptors = cv.ExtractSURF( object, None, storage, params )
    imageKeypoints, imageDescriptors = cv.ExtractSURF( image, None, storage, params )
    tt = float(cv.GetTickCount()) - tt
    src_corners = ((0,0), (object.width,0), (object.width, object.height), (0, object.height))
    dst_corners = []
    correspond = cv.CreateImage((image.width, object.height+image.height), 8, 1 )
    cv.SetImageROI( correspond, ( 0, 0, object.width, object.height ) )
    cv.Copy( object, correspond )
    cv.SetImageROI( correspond,( 0, object.height, correspond.width, correspond.height ) )
    cv.Copy( image, correspond )
    cv.ResetImageROI( correspond )
    if locatePlanarObject( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, src_corners, dst_corners ):
        print dst_corners, "corners"
	for i in range(4):
            r1 = dst_corners[i%4]
            r2 = dst_corners[(i+1)%4]
	    print r1,"  ",r2
            cv.Line( correspond,(r1[0], r1[1]+object.height ),(r2[0], r2[1]+object.height ), colors[0] )
	    cv.Line( resutl_color,(r1[0], r1[1] ),(r2[0], r2[1] ), colors[0] )

    ptpairs = findPairs(objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors)
    for i in range(len(ptpairs)):
	r1 = objectKeypoints[ptpairs[i][0]]
	r2 = imageKeypoints[ptpairs[i][1]]
        cv.Line( correspond, (cv.Round(r1[0][0]),cv.Round(r1[0][1])), (cv.Round(r2[0][0]), cv.Round(r2[0][1]+object.height)), colors[1] )

    cv.ShowImage( "Object Correspond", correspond )
    for ((x, y), laplacian, size, dir, hessian) in objectKeypoints:

            center = (cv.Round(x),cv.Round(y))
            radius = cv.Round(size*1.2/9.*2)
            cv.Circle( object_color, center, radius, colors[0], 1, 8, 0 )

    cv.ShowImage( "Object", object_color )
    cv.ShowImage( "Colores", resutl_color )

    cv.WaitKey(0)

Como vemos en la imagen reconoce a la caja dentro de la escena, aun cuando el objeto a reconocer dentro de la escena este parcialmente cubierta.

El ejemplo original esta dentro de opencv/samples/c/find_obj.cpp, lo que yo hice fue optimizarle para python }:)

saludos

Comentarios

En la línea 155 esta esto </scene_filename></object_filename> no se porque aparece pero hay que borrarlo y funciona
probé haciendole buscar un caldo maggy en la despensa desorganizada de mi suegra :)

Play Ogg

Imagen de palichis

jeje bien.. si puedes sube una captura... he tratado de editar la línea 155, pero no asoma, solo aparece en el publicado, le dí enter a la última línea y ahora es la 156 jeje

Talvez sea alguna falla en el resaltador de sintaxis
Aquí las capturas

http://dl.dropbox.com/u/2950141/Screenshot.png
http://dl.dropbox.com/u/2950141/Screenshot-1.png

Estoy con problemas en el portal desde que migre a otro server, espero tener mas tiempito y checarlo, tambien quiciera migrarlo a drupal 6, has migrado tu del 5 al 6 ???

Play Ogg

Que tal, de nuevo molestando, no lo tienes en C o C++??
Soy principiante en C/C++ es por eso que me ha costado bastante trasladarlo de python a C/C++.

Saludos.

Imagen de palichis

este lo puedes encontrar en los ejemplos de opencv en la carpera..... OpenCV-2.1.0/samples/c/find_obj.cpp