2012-08-07 18 views
7

Duplicar posible:
An iPhone library for shape recognition via the cameracómo hacer el reconocimiento de imágenes en aplicaciones para el iPhone

Soy móvil iPhone desarrollador de aplicaciones y busco bibliotecas de reconocimiento de imágenes para integrar en una de mi aplicación, que debería funcionar como la funcionalidad de gafas de google.

Vi https://www.iqengines.com/ y bajé su ios sdk y funcionó bien. Pero no es una versión gratuita. Estoy buscando SDK de código abierto.

¿qué utilidad tiene opencv para lograr esto? porque algunas de las fuentes están redirigiendo a openCV.

Háganme saber si alguien se encuentra con esto. Gracias

+0

¿cuál es su objetivo final? ¿Qué quieres reconocer en las imágenes? – holex

+0

Hola Holex, quiero detectar el tipo de imagen, como si capturara la imagen de Nike, entonces el resultado del reconocimiento de la imagen debería ser Nike, que además puede ir a la búsqueda de Google con el resultado. Lo mismo que la funcionalidad de Goggles en la aplicación Google ios. Gracias – ratnasomu

+0

Realizar reconocimiento de imágenes es una tarea muy compleja, pero la sugerencia proporcionada en la pregunta vinculada es un buen lugar para comenzar. Para otros recursos sobre el uso de OpenCV para el reconocimiento de imágenes, consulte la respuesta de karlphilip a la pregunta [Tutorial para Iphone OpenCV sobre el reconocimiento de formas] (http://stackoverflow.com/questions/5738792/tutorial-for-iphone-opencv-on-shape- reconociendo) –

Respuesta

8

Sí, OpenCV funciona en iOS y le proporcionará una buena biblioteca de herramientas para usar. Puedes construir tu propio .framework (un poco molesto) o descargar uno de Internet.

Después de eso, usted debe ser capaz de construir software de visión por ordenador en IOS, será sin embargo, el procesamiento de imágenes puede tomar mucha potencia y memoria.

OpenCV tiene sus propias clases de C++ para las imágenes, es probable que necesite para convertirlos ida y vuelta a UIImage para la entrada y la visualización de

aquí dejo este pedazo de código que utilizo para NSImage, usted debe encontrar suficiente para cambiar un poco el código para UIImage

// 
// NSImage+OpenCV.h 
// 

#import <AppKit/AppKit.h> 

@interface NSImage (NSImage_OpenCV) { 

} 

+(NSImage*)imageWithCVMat:(const cv::Mat&)cvMat; 
-(id)initWithCVMat:(const cv::Mat&)cvMat; 

@property(nonatomic, readonly) cv::Mat CVMat; 
@property(nonatomic, readonly) cv::Mat CVGrayscaleMat; 

@end 

Y

// 
// NSImage+OpenCV.mm 
// 

#import "NSImage+OpenCV.h" 

static void ProviderReleaseDataNOP(void *info, const void *data, size_t size) 
{ 
    return; 
} 


@implementation NSImage (NSImage_OpenCV) 

-(CGImageRef)CGImage 
{ 
    CGContextRef bitmapCtx = CGBitmapContextCreate(NULL/*data - pass NULL to let CG allocate the memory*/, 
                [self size].width, 
                [self size].height, 
                8 /*bitsPerComponent*/, 
                0 /*bytesPerRow - CG will calculate it for you if it's allocating the data. This might get padded out a bit for better alignment*/, 
                [[NSColorSpace genericRGBColorSpace] CGColorSpace], 
                kCGBitmapByteOrder32Host|kCGImageAlphaPremultipliedFirst); 

    [NSGraphicsContext saveGraphicsState]; 
    [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:bitmapCtx flipped:NO]]; 
    [self drawInRect:NSMakeRect(0,0, [self size].width, [self size].height) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; 
    [NSGraphicsContext restoreGraphicsState]; 

    CGImageRef cgImage = CGBitmapContextCreateImage(bitmapCtx); 
    CGContextRelease(bitmapCtx); 

    return cgImage; 
} 


-(cv::Mat)CVMat 
{ 
    CGImageRef imageRef = [self CGImage]; 
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef); 
    CGFloat cols = self.size.width; 
    CGFloat rows = self.size.height; 
    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels 

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,     // Pointer to backing data 
                cols,      // Width of bitmap 
                rows,      // Height of bitmap 
                8,       // Bits per component 
                cvMat.step[0],    // Bytes per row 
                colorSpace,     // Colorspace 
                kCGImageAlphaNoneSkipLast | 
                kCGBitmapByteOrderDefault); // Bitmap info flags 

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), imageRef); 
    CGContextRelease(contextRef); 
    CGImageRelease(imageRef); 
    return cvMat; 
} 

-(cv::Mat)CVGrayscaleMat 
{ 
    CGImageRef imageRef = [self CGImage]; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 
    CGFloat cols = self.size.width; 
    CGFloat rows = self.size.height; 
    cv::Mat cvMat = cv::Mat(rows, cols, CV_8UC1); // 8 bits per component, 1 channel 
    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,     // Pointer to backing data 
                cols,      // Width of bitmap 
                rows,      // Height of bitmap 
                8,       // Bits per component 
                cvMat.step[0],    // Bytes per row 
                colorSpace,     // Colorspace 
                kCGImageAlphaNone | 
                kCGBitmapByteOrderDefault); // Bitmap info flags 

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), imageRef); 
    CGContextRelease(contextRef); 
    CGColorSpaceRelease(colorSpace); 
    CGImageRelease(imageRef); 
    return cvMat; 
} 

+ (NSImage *)imageWithCVMat:(const cv::Mat&)cvMat 
{ 
    return [[[NSImage alloc] initWithCVMat:cvMat] autorelease]; 
} 

- (id)initWithCVMat:(const cv::Mat&)cvMat 
{ 
    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()]; 

    CGColorSpaceRef colorSpace; 

    if (cvMat.elemSize() == 1) 
    { 
     colorSpace = CGColorSpaceCreateDeviceGray(); 
    } 
    else 
    { 
     colorSpace = CGColorSpaceCreateDeviceRGB(); 
    } 

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 

    CGImageRef imageRef = CGImageCreate(cvMat.cols,          // Width 
             cvMat.rows,          // Height 
             8,            // Bits per component 
             8 * cvMat.elemSize(),       // Bits per pixel 
             cvMat.step[0],         // Bytes per row 
             colorSpace,          // Colorspace 
             kCGImageAlphaNone | kCGBitmapByteOrderDefault, // Bitmap info flags 
             provider,          // CGDataProviderRef 
             NULL,           // Decode 
             false,           // Should interpolate 
             kCGRenderingIntentDefault);      // Intent 


    NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef]; 
    NSImage *image = [[NSImage alloc] init]; 
    [image addRepresentation:bitmapRep]; 

    CGImageRelease(imageRef); 
    CGDataProviderRelease(provider); 
    CGColorSpaceRelease(colorSpace); 

    return image; 
} 

@end 

(source)

Cuestiones relacionadas