2012-08-07 12 views
7

Powiel możliwe:
An iPhone library for shape recognition via the camerajak zrobić rozpoznawania obrazu w aplikacjach iPhone

Jestem iPhone aplikacji mobilnych programista i szukam bibliotek rozpoznawania obrazu zintegrować w jednym z mojej aplikacji, które powinien działać jak funkcjonalność gogli google.

Zobaczyłem https://www.iqengines.com/ i obniżyłem jego ios sdk i działało dobrze. Ale nie jest to darmowa wersja. Szukam open source sdk.

także w jaki sposób opencv jest przydatny w realizacji tego? ponieważ niektóre źródła przekierowują do openCV.

Proszę dać mi znać, jeśli ktoś się z tym spotka. Dzięki

+0

jaki jest twój ostateczny cel? co chcesz rozpoznać na zdjęciach? – holex

+0

Cześć Holeks, chcę wykryć rodzaj obrazu, tak jak wtedy, gdy przechwyciłem obraz Nike, wtedy wynikiem rozpoznawania obrazu powinien być Nike, który może następnie przejść do wyszukiwania google z wynikiem. To samo, co funkcjonalność Gogli w aplikacji Google ios. Dzięki – ratnasomu

+0

Wykonywanie rozpoznawania obrazu jest bardzo złożonym zadaniem, ale sugestia podana w połączonym pytaniu jest dobrym miejscem do rozpoczęcia. Aby poznać inne zasoby dotyczące korzystania z OpenCV do rozpoznawania obrazów, zobacz odpowiedź karlphilip na pytanie [Tutorial for Iphone OpenCV na temat rozpoznawania kształtów] (http://stackoverflow.com/questions/5738792/tutorial-for-iphone-opencv-on-shape- rozpoznawanie) –

Odpowiedz

8

Tak, OpenCV działa na iOS i zapewni Ci dobrą bibliotekę narzędzi do użycia. Możesz zbudować własny .framework (trochę męczący) lub pobrać jeden z Internetu.

Po tym, powinieneś być w stanie zbudować komputer oprogramowanie wizyjne na iOS, być Uważaj jednak, przetwarzanie obrazu może zająć dużo energii i pamięci.

OpenCV ma swoje klas C++ dla obrazów, prawdopodobnie będzie trzeba przekształcić je w tę iz powrotem do UIImage do wprowadzania i wyświetlania

zostawiam tutaj ten kawałek kodu używam do NSImage, należy znaleźć na tyle aby zmienić nieco kod 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 

I

// 
// 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)

Powiązane problemy