Buscar un objeto dentro de una escena
Enviado por palichis en Vie, 08/06/2010 - 10:39
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
- blog de palichis
- Inicie sesión o regístrese para comentar

Comentarios
En la línea 155 esta esto
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 :)
jeje bien.. si puedes sube
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
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 ???
Lo tienes en C o C++??
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.
este lo puedes encontrar en
este lo puedes encontrar en los ejemplos de opencv en la carpera..... OpenCV-2.1.0/samples/c/find_obj.cpp