LegoCV 0.1.0

LegoCV 0.1.0

测试已测试
语言语言 Objective C++Objective C++
许可证 BSD
发布最新发布2017年3月

Dal Rupnik维护。



LegoCV 0.1.0

LegoCV 是专为 Swift 和 Objective-C 项目构建的本地 OpenCV 框架。它消除了使用 Objective-C++ 的需求,并允许与本地 Swift 项目完全兼容。唯一的依赖项是本地的 OpenCV 框架 for iOS。

目标

Swift 语言是一种发展最快的语言之一,但无法直接使用 C++ 框架,就像在 Objective-C/C++ 中一样。

此项目的目的是创建一个简单、易于使用的原生 Swift 框架来访问 OpenCV。项目添加了 Swift 和 Objective-C 方便方法,但将完全转换为 OpenCV API。

该理念简单地将 OpenCV 的本地 C++ 类包装成 Objective-C 类,然后将其原生地桥接到 Swift 中,从而在原生 OpenCV 上提供一层薄层。类似的结构在RealmEmguCV(C#中)使用。

示例

以下示例展示了在 Swift 和 Objective-C 中与 LegoCV 相比,与 C++ 中的原生 OpenCV 的区别。此示例是从 LegoCV 中提供的 Face detection 示例代码中提取的。在 iOS 上,它使用 OCVVideoCamera 类从相机获取图像流(包装 OpenCV 的 CvVideoCamera,以保持向后兼容性)。

Swift (LegoCV)

let faceDetector = OCVCascadeClassifier();
faceDetector.load(path: "haarcascade_frontalface_alt2.xml")

func process(image: OCVMat) {
    let scale = 2.0

    let minSize = OCVSize(width: 30, height: 30)

    let gray = OCVMat()
    let smallImage = OCVMat(rows: Int(round(Double(image.rows) / scale)), cols: Int(round(Double(image.cols) / scale)), type: .cv8U, channels: 1)

    OCVOperation.convertColor(from: image, to: gray, with: .BGR2GRAY)
    OCVOperation.resize(from: gray, to: smallImage, size: smallImage.size, fx: 0, fy: 0, interpolation: .linear)
    OCVOperation.equalizeHistogram(from: smallImage, to: smallImage)

    // Faces are returned as OCVRect instances, so they are mapped in Swift, as they are structs.
    let faces : [OCVRect] = faceDetector.detectMultiscale(with: smallImage, scaleFactor: 1.1, minNeighbours: 2, flags: 0, minSize: minSize).map { $0.rect }
}

Objective-C (LegoCV 与 Objective-C)

- (void)setupClassifier {
    self.faceDetector = [[OCVCascadeClassifier alloc] init];
    [self.faceDetector loadPath:@"haarcascade_frontalface_alt2.xml"];
}

- (void)processImage:(OCVMat *)image {
    double scale = 2.0;

    OCVSize minSize;
    minSize.width = 30;
    minSize.height = 30;

    OCVMat* gray = [[OCVMat alloc] init];
    OCVMat* smallImage = [[OCVMat alloc] initWithRows:round(image.rows / scale) cols:round(image.cols / scale) type: OCVDepthTypeCv8U, channels: 1)

    [OCVOperation convertColorFromSource:image toDestination:gray with:OCVColorConversionTypeBGR2GRAY];
    [OCVOperation resizeFromSource:gray toDestination:smallImage size:smallImage.size fx:0 fy:0 interpolation:OCVInterpolationTypeLinear];
    [OCVOperation equalizeHistogramFromSource:smallImage toDestination:smallImage];

    // Faces are returned as OCVRectValue instances, which wrap OCVRect structs.
    NSArray<OCVRectValue *>* faces = [self.faceDetector detectMultiscaleWith:smallImage scaleFactor:1.1 minNeighbours:2 flags: 0 minSize:minSize];
}

C++ (OpenCV)

using namespace cv;

void setup () {
    _faceDetector = new CascadeClassifier();
    _faceDetector->load("haarcascade_frontalface_alt2.xml");
}

void processImage(cv::Mat img) {
    double scale = 2.0;
    Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );

    cvtColor( img, gray, COLOR_BGR2GRAY );
    resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
    equalizeHist( smallImg, smallImg );

    cv::Size minSize(30,30);

    vector<cv::Rect> faceRects;

    // Faces are returned in provided faceRects vector
    _faceDetector->detectMultiScale(smallImg, faceRects, 1.1, 2, 0, minSize);
}

更多示例,包括 Swift playground,可以在示例项目中找到。

文档

由于这是一个正在进行中的项目,随着开发的进行,文档将逐个添加到 Wiki 中。

性能

由于 Objective-C 传输系统,与纯原生 C++ 代码的 OpenCV 相比,性能影响较小。如果您需要高性能代码,仍建议用 C++ 编写算法,并将其桥接到 LegoCV 或 Objective-C。

安装

LegoCV 可以通过 CocoaPodsCarthage 进行安装。它只依赖于 OpenCV 框架,可以从其网站上下载。

pod 'LegoCV'

构建

要构建 LegoCV 项目,你需要 cmake。使用 brew install cmake 安装它,并确保你已安装 Xcode 命令行工具。使用 xcode-select --install 进行触发以进行检查。另外,确保你使用的是最新版本的 Xcode,而不是 master 分支的测试版。

许可证

BSD许可证,并尊重 OpenCV 许可证。