Sử dụng OpenCV với Swift trong iOS

I. Giới Thiệu

  • Nói đến thư viện hỗ trợ cho xử lý ảnh, không ai không nghĩ ngay tới OpenCV. Đây là một thư viện mã nguồn mở, được phát hành miễn phí và hỗ trợ khá nhiều các platform khác nhau. OpenCV có khá nhiêu các thuật toán hỗ trợ cho Computer Vision. Hơn thế nữa, cộng đồng sử dụng OpenCV cũng khá là đông đảo, luôn cập nhật các hướng dẫn và fix lỗi cho thư viện.
  • Đối với iOS, chúng ta có thể lựa chọn các thư viện xử lý ảnh như GPUImage hoặc CoreImage. Tuy nhiên, chúng ta vẫn có thể sử dụng OpenCV trên iOS một cách bình thường. Bài viết dưới đây sẽ hướng dẫn bạn cách để cài đặt thư viện `OpenCV` cho dự án iOS

II. Cài Đặt

  • Về cơ bản, OpenCV được viết bằng ngôn ngữ C++ . Để có thể sử dụng trên Swift, chúng ta cần phải có một lớp bridge được viết bằng ngôn ngữ Objective-C ở giữa để có thể gọi các hàm của OpenCV. Cấu trúc sẽ theo như mô hình dưới dây:

1. Chuẩn Bị

1.1 Cài đặt CocaoPods
  • Đầu tiên, chúng ta cần cài đặt CocaoPods cho máy tính. Các bạn có thể tham khảo cách cài đặt ở bài viết dưới đây:
    Cài đặt CocaoPods
1.2 Tạo XCode Project
  • Mở Xcode, ta tạo một project, lựa chọn folder để lưu project. Ở đây, chúng ta sẽ tạo project cơ bản là "Single Application Project".

1.3 Cài đặt OpenCV
  • Sau khi cài đặt thành công CocaoPods cũng như tạo xong Project, ta tiến hành mở Terminal để cài đặt CocaoPods cho Project hiện tại bằng lệnh:
pod init
  • Tiếp theo, ta mở file Pod lên, và thêm vào dòng lệnh
pod 'OpenCV'
  • Cuối cùng, ta save lại, tắt file và chạy lệnh để thực hiện cài đặt OpenCV
pod install
  • File Pod cuối cùng
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'testOpenCVSwift' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for testOpenCVSwift
  pod 'OpenCV'
end

2. Thiết Lập

2.1 Tạo lớp Bridge
  • Ở Project của thư mục, ta tạo một file mới, file type là Cocoa Touch Class, đặt tên OpenCVWarpper. Sau khi tạo, XCode sẽ tự động nhận diện xác nhận chúng ta có muốn tạo 1 lớp Bridge hay không.


  • Sau khi tạo lớp Bridge, chúng ta sẽ thấy có 3 file xuất hiện là OpenCVWarpper.h, OpenCVWarpper.m<TenProject>-Bridging-Header.h
  • Tiếp theo, ta đổi tên file OpenCVWarpper.m thành OpenCVWarpper.mm để cho XCode nhận diện file này là file Objective-C.
2.2 Thiết lập file Bridging-Header
  • Ở file Bridging-Header, ta thêm vào dòng lệnh
#import "OpenCVWarpper.h"
  • Ở file OpenCVWarpper.mm,ta thêm import của thư viện opencv vào
#import <opencv2/opencv.hpp>
#import "OpenCVWarpper.h"

3. Chạy Thử

3.1 Cài đặt hàm và header
  • Ở file OpenCVWarpper.mm, ta thêm vào dòng code sau dưới đây. Lưu ý là ta phải import thư viện openCV trước khi import file header của OpenCVWarpper
#ifdef __cplusplus
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"

#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>
#import "OpenCVWarpper.h"

#pragma clang pop
#endif

using namespace cv;
using namespace std;

@implementation OpenCVWarpper
+ (NSString *)openCVVersionString {
    return [NSString stringWithFormat:@"OpenCV Version %s",  CV_VERSION];
}
@end
  • Ở file OpenCVWarpper.h, ta khai báo header của hàm đã tạo phía trên
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface OpenCVWarpper : NSObject
+ (NSString *)openCVVersionString;
@end

NS_ASSUME_NONNULL_END
3.2 Gọi hàm trên Swift
  • Mở file ViewController.swift, thêm thực hiện việc gọi hàm OpenCV thông qua warpper.
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        print("\(OpenCVWarpper.openCVVersionString())")
    }
}
  • Cuối cùng, ta chạy thử ứng dụng, kết quả sẽ được đưa ra ở màn hình console như sau:

  • Như vậy, việc cài đặt của chúng ta đã hoàn tất, từ giờ chúng ta có thể viết code ở file OpenCVWarpper.mm để sử dụng các hàm của OpenCV, sau đó trên Swift ta có thể gọi hàm đó.

III. Tổng Kết

  • Nhìn chung, việc kết hợp OpenCV vào Swift khá là dễ dàng, không quá phức tạp. Hơn nữa, do OpenCV được viết bằng C++ nên có thể dễ dàng làm việc với Swift thông qua lớp bridge viết bằng Objectice-C.
  • Tuy nhiên, do chúng ta chỉ có thể làm việc với OpenCV qua Objective-C, cho nên việc sử dụng đòi hỏi Developer cũng phải có một chút kiến thức về Objective-C để có thể sử dụng một cách hiệu quả.
  • Cấu trúc syntax, việc khai báo biến của C khá chặt chẽ. Vì thế Dev cần phải đọc kỹ tài liệu về thiết kế của từng hàm, giá trị nhận vào, giá trị trả về, cách sử dụng hàm để có thể gọi và truyền vào tham số một cách chính xác (Không giống như Python, khi khai báo biến không cần phải xác định loại của biến).

IV. Tham Khảo