2015-06-22 2 views
3

Я пытаюсь использовать OpenCV в проекте Swift (iOS). Единственный полный проект, который я нашел, - Tesseract-OCR-iOS, у которого нет документации. Есть несколько примеров, но все используют Objective-C. Как this one:Использование OpenCV с Swift

- (cv::Mat)cvMatFromUIImage:(UIImage *)image 
{ 
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); 
    CGFloat cols = image.size.width; 
    CGFloat rows = image.size.height; 

    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha) 

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,     // Pointer to 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), image.CGImage); 
    CGContextRelease(contextRef); 

    return cvMat; 
} 
- (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image 
{ 
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); 
    CGFloat cols = image.size.width; 
    CGFloat rows = image.size.height; 

    cv::Mat cvMat(rows, cols, CV_8UC1); // 8 bits per component, 1 channels 

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,     // Pointer to 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), image.CGImage); 
    CGContextRelease(contextRef); 

    return cvMat; 
} 

После обработки мы должны преобразовать его обратно в UIImage. Код ниже может обрабатывать как преобразования серого, так и цветного изображения (определяется количеством каналов в операторе if).

cv::Mat greyMat; 
cv::cvtColor(inputMat, greyMat, CV_BGR2GRAY); 

После обработки мы должны преобразовать его обратно в UIImage.

(UIImage *)UIImageFromCVMat:(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); 

    // Creating CGImage from cv::Mat 
    CGImageRef imageRef = CGImageCreate(cvMat.cols,         //width 
            cvMat.rows,         //height 
            8,           //bits per component 
            8 * cvMat.elemSize(),      //bits per pixel 
            cvMat.step[0],       //bytesPerRow 
            colorSpace,         //colorspace 
            kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info 
            provider,         //CGDataProviderRef 
            NULL,          //decode 
            false,          //should interpolate 
            kCGRenderingIntentDefault     //intent 
            ); 


    // Getting UIImage from CGImage 
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    CGDataProviderRelease(provider); 
    CGColorSpaceRelease(colorSpace); 

    return finalImage; 
} 

Конечный результат:

enter image description here

Я понятия не имею, как сделать такую ​​простую задачу в Swift, можно преобразовать эти функции в Swift?

ответ

2

Swift не работает непосредственно с C++. Если вы хотите использовать C++ i в своем проекте, вам нужно написать обертку Objective-C++ вокруг вашего кода на C++ и вызывать эти методы обертки из вашего кода Swift.

Here вы можете найти проект OpenCV в Свифт.

Смежные вопросы