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 上提供一层薄层。类似的结构在Realm和 EmguCV(C#中)使用。
以下示例展示了在 Swift 和 Objective-C 中与 LegoCV 相比,与 C++ 中的原生 OpenCV 的区别。此示例是从 LegoCV 中提供的 Face detection 示例代码中提取的。在 iOS 上,它使用 OCVVideoCamera
类从相机获取图像流(包装 OpenCV 的 CvVideoCamera
,以保持向后兼容性)。
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 }
}
- (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];
}
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 可以通过 CocoaPods 或 Carthage 进行安装。它只依赖于 OpenCV 框架,可以从其网站上下载。
pod 'LegoCV'
要构建 LegoCV 项目,你需要 cmake
。使用 brew install cmake
安装它,并确保你已安装 Xcode 命令行工具。使用 xcode-select --install
进行触发以进行检查。另外,确保你使用的是最新版本的 Xcode,而不是 master 分支的测试版。