Tạo ứng dụng OpenCV bằng C#

Bạn thích viết 1 project bằng C# vì nó dễ thiết kế giao diện, các API thân thiện, dễ sử dụng. Tuy nhiên OpenCV không hỗ trợ C#, do đó để có thể sử dụng các tính năng trong OpenCV có nhiều phương pháp, phổ biến nhất hiện nay là dùng EmguCV. EmguCV là thư viện wrapper chuyển đổi tất cả các hàm của openCV từ C++ sang .NET. Tuy nhiên nó có nhiều nhược điểm: tốc độ xử lý chậm, bắt buộc người dùng phải include tất cả file dll dung lượng lớn.

Để khắc phục vấn đề trên thì sử dụng c++ để viết các hàm tính toán sử dụng openCV, dùng C# để thiết kế giao diện và CLR (common language runtime) để làm cầu nối cho 2 project đó. Như vậy chương trình sẽ có ưu điểm:

  • Dễ thiết kế giao diện, dễ tùy biến
  • Tốc độ xử lý nhanh
  • Dung lượng nhỏ

Nhược điểm là hơi lằng nhằng, phức tạp và khó debug.

Các bước thực hiện:

1. Tạo project C++ rồi dùng project này làm lib
2. Tạo project windows form bằng C#
3. Tạo project kết nối 2 project trên

Project chính dùng để tạo UI viết bằng C#, build ra file .exe
Project opencv viết bằng C++ để xử lý hình ảnh, build ra file .lib
Project trung gian viết bằng CLR để gọi hàm từ C# qua C++, build ra file .dll

Bước 1: Tạo project C++ để làm lib

Các bạn làm theo bài viếtSetup project OpenCV cho ngôn ngữ C++ để tạo project opencv. Project này sẽ xử lý hình ảnh, trả về kết quả, hay nói cách khác là core của chương trình.

Theo bài viết trên thì output là file exe để thực thi, bạn phải chuyển thành file .lib ở Configuration

config_to_lib


Bước 2: Tạo project CLR để kết nối 2 project

CLR là viết tắt của Common Language Runtime, bạn có thể hiểu nó là 1 ngôn ngữ hơi lai giữa C# và C++ (Giải thích như vậy không đúng với định nghĩa, chỉ là giúp bạn dễ hình dung)


Tạo project clr


Cấu hình để project CLR build ra file dll mà .NET dùng được. Các bạn nhớ config giống trong hình

Các bước include lib làm giống như bài tạo project C++


Bước 3: Tạo project C#

Tạo project C# với dạng Windows Form, sau đó add reference tới project CLR

Kiểm tra: Tiếp theo là viết vài dòng code đơn giản để kiểm tra chạy thành công hay chưa:
+ Bên c++ viết hàm để trả về 1 Mat
+ Bên clr include file vừa viết, viết hàm trả về bitmap
+ Bên C# tạo 1 Picture box và hiển thị bitmap nhận được

Để tránh code rườm rà khó hiểu mình đưa toàn bộ code vào project mẫu. Các bạn down về chạy thử, nếu xuất ra hình ảnh là ok.

Tham khảo: Convert Bitmap sang Mat và ngược lại

C# sử dụng định dạng hình ảnh bitmap, còn OpenCV là Mat, do đó cần có hàm để convert Mat thành Bitmap

Còn đây là hàm convert Bitmap thành Mat

Download

Nếu các bước trên phức tạp đối với bạn hoặc gặp lỗi khó giải quyết thì sử dụng source có sẵn. Mình có viết 1 sample đơn giản để minh họa việc gọi C++ từ C#. Trong repo Github có nhiều project sample, các bạn chạy riêng CsCallCpp.sln để hiểu cách C# gọi C++;

Solution CsCallCpp.sln load 1 ảnh rồi làm mờ bằng thuật toán blur(). Nhớ là clone submodule mới build được chương trình.

https://github.com/thigiacmaytinh/TGMT

One Response to Tạo ứng dụng OpenCV bằng C#

  1. Nguyen KHai says:

    Quá tuyệt vời. Ad thêm giải thích code nữa cho dễ hiểu dễ học

Leave a Reply