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.

Trong Solution có nhiều project:
– libjpeg-turbo: dùng để xử lý ảnh jpg
– libpng: dùng để xử lý ảnh png
– zlib: nén/giải nén data, dùng cho 2 project trên
– opencv_core, opencv_highgui, opencv_imgcodecs, opencv_imgproc: các lib của OpenCV
– Sample: project xử lý ảnh viết bằng C++ build ra file lib
– UI: project C# để làm giao diện
– TGMTbridge: cầu nối giữa UI và Sample

https://github.com/thigiacmaytinh/TGMTcpp

Facebook Comments

6 thoughts on “Tạo ứng dụng OpenCV bằng C#

  1. Chào bạn, những bài viết của bạn ở trang này rất tuyệt.
    Nhưng mình vẫn không hiểu cái lib ở bước 1 có liên quan gì đến việc tạo dll ở bước thứ hai không? Mong bạn giúp mình hiểu. Mình cảm ơn. (Mình xin lỗi vì đọc trên github của bạn mình thấy rất rối, không biết chỗ nào là tạo lib, chỗ nào là tạo dll, và chỗ nào là kết nối dll với project C#. Nếu bạn giúp mình hiểu được thì tốt cho mình quá).

    1. Hi bạn, để làm theo project cần tới 3 project. Project C++ build ra file .lib, project CLR build ra .dll còn C# là .exe

      Do OpenCV viết bằng C++ nên project xử lý thuật toán là project C++, mà C++ thì rất khó làm UI nên viết UI bằng C#, để kết nối 2 project lại với nhau ta sử dụng CLR.

    2. Cảm ơn bạn đã trả lời mình, mình đã hiểu nguyên tắc này. Cho mình hỏi thêm rằng: trong phần code mẫu trên Github của bạn thì cái nào là project để tạo lib file, cái nào là project tạo dll file, và cái nào là project C# đã sử dụng dll file kia?
      Mình thấy có project CsCallCpp.sln, nhưng khi load vào VS2019 community thì nó chỉ load được 1 project là UI (các project còn lại như libpng, zlib,…là không load được). Ngoài ra, trong mục reference của project UI thì bị missing nhưng thư viện như AForge.Video, AForge.Video.DirectShow và IPSSBridge (mình không hiểu chúng lấy từ đâu ra?). Mong bạn xem giúp.

    3. – Về source code đúng là ở mode x64 build ra bị lỗi, mình đã fix rồi. Bạn pull code mới về là được hoặc chuyển sang mode x86 cũng được.
      – Project Sample để xử lý ảnh, project UI để tạo giao diện và TGMTbridge để làm cầu nối giữa 2 project

    4. Cảm ơn bạn đã hồi đáp mình. Những bài viết của bạn rất hay. Mình sẽ lưu lại làm tài liệu tham khảo cho bản thân mình khi làm việc với lĩnh vực này. Một lần nữa rất cảm ơn bạn đã hỗ trợ mình nhiều như vậy. Chúc bạn luôn mạnh khỏe và thành công hơn nữa trong lĩnh vực theo đuổi của bạn.

Leave a Reply