Setup project OpenCV cho ngôn ngữ C++

Setup project OpenCV cho ngôn ngữ C++

Bài này sẽ hướng dẫn các bạn cách để tạo project ứng dụng OpenCV cho ngôn ngữ C++. Hầu hết các project example trong blog này sẽ thiết lập giống như vậy để dễ nắm được cấu trúc file/folder.

Ngôn ngữ C++ có ưu điểm là nhanh, chạy được nhiều platform khác nhau. Ngoài ra đa số các example trên mạng cũng đa phần là viết bằng C++ hoặc python, bài viết này dành cho người mới làm quen OpenCV và muốn thử nghiệm các bài tutorial trên mạng.

Các lib cho ngôn ngữ C++ được build ra 2 loại file output:
– Static lib có đuôi là *.lib. File *.lib khi build được embed vào trong file exe.
– Dynamic lib có đuôi là *.dll. File *.dll nằm riêng bên cạnh file exe và có thể sử dụng cho nhiều ứng dụng cùng lúc.

Bạn phải setup opencv c++ được để hiểu các file cần thiết tối thiểu của opencv, không nên nhảy vọt sang các bài khác.

Các bước thực hiện:
1. Chuẩn bị lib OpenCV (với các file *.lib và *.dll)
2. Include lib vào trong project
3. Test thử chương trình

Bước 1: Chuẩn bị lib OpenCV

Các bạn có thể làm theo 1 trong những cách sau:
– Làm theo bài Build lib cho OpenCV 3.x để build lib OpenCV phù hợp với nhu cầu.
– Sử dụng các file lib mà opencv build sẵn cho các bạn
– Hoặc sử dụng lib opencv 3.2.0 build sẵn cho Visual Sudio 2015: https://github.com/thigiacmaytinh/opencv320

Bước 2: Include lib vào trong project

Đầu tiên tạo project C++: mở Visual studio lên và tạo project Console, cứ ấn Next rồi Finish (Chọn console để demo code dễ dàng)
create_cpp_project

 

Giả sử rằng đường dẫn của OpenCV là E:\lib\opencv300

Ấn chuột phải vào project chọn Properties để thiết lập
project_properties

 

Set giá trị của Working Directory là $(OutDir) giống như Output Directory
outdir

Các macro như $(SolutionDir), $(Configuration) sẽ thay đổi tùy theo cấu hình của user. Có nghĩa là ở mỗi máy thì các macro này sẽ cho kết quả khác nhau:
$(SolutionDir) là thư mục chứa file *.sln của project, mỗi lần di chuyển project thì $(SolutionDir) sẽ thay đổi.
$(Configuration) là mode Debug, Release tùy theo bạn chọn

Output Directory là thư mục output của project
Working Directory là nơi chương trình sẽ hoạt động, bao gồm đọc đường dẫn file asset, file lib,…

=> Như vậy chọn Working Directory giống như Output Directory cho thống nhất

Tiếp theo set giá trị của Additional Include DirectoriesE:\lib\opencv300\build\include. Đây là các thư mục chứa file *.h cần thiết, khi các bạn rành thì có thể sử dụng macro.

header_dir

Tiếp theo set giá trị của Additional Library Directories. Đây là thư mục chứa các file *.lib của opencv
Với mode Debug: E:\lib\opencv300\build\lib\DebugE:\lib\opencv300\build\x86\vc12\lib
Với mode Release: E:\lib\opencv300\build\lib\ReleaseE:\lib\opencv300\build\x86\vc12\lib

lib_dir

 

Mode Debug và Release có thiết lập khác nhau, bao gồm những thiết lập phổ biến như tên file ouput, các lib include, tốc độ thực thi,… Do đó đừng setup nhầm mode rồi thắc mắc tại sao code không chạy.

Set giá trị cho Input

các bạn chỉ định sẽ include file *.lib nào vào chương trình

Với mode debug các bạn thêm:
opencv_world300d.lib

Với mode release các bạn thêm các lib tương tự không có chữ d (d là dành cho Debug):
opencv_world300.lib

Đối với các ứng dụng đơn giản bạn chỉ cần sử dụng opencv_world vì file này đã chứa đầy đủ các hàm. Khi bạn đã rành có thể tham khảo cách thêm thư viện cho phù hợp: Cấu trúc OpenCV

lib_file_include

Copy file opencv_world*.dll vào thư mục $(OutDir): tức là $(SolutionDir)\bin

Kiểm tra project tạo có thành công hay không

Các bạn thêm đoạn code ngắn bên dưới để biết mình có cài đặt thành công hay không

Nếu thành công thì chúc mừng bạn, còn gặp lỗi thì chụp hình lỗi đưa lên đây mình sẽ xem giúp.

Lưu ý: có 2 cách viết code. Cách 1 với namespace đứng đầu :

hoặc không có namespace:

Với kinh nghiệm bản thân mình đề nghị sử dụng namespace (cách 1 ) vì các lợi ích sau:
– Nhìn vào là biết hàm nào của OpenCV
– Khi sử dụng nhiều lib cho 1 project thì sử dụng namespace sẽ giúp tránh bị trùng tên hàm
– Tránh bị trùng tên hàm khi sử dụng nhiều ngôn ngữ lập trình trong 1 project (C# và C++ bị trùng string)

Download

Project config với opencv_world*.dll, chỉ build được mode x64 với cách config của bài viết
TGMTlite (GitHub)

Project config với các project module của OpenCV
TGMT (Github)

20 Responses to Setup project OpenCV cho ngôn ngữ C++

  1. Trần Thanh Hải says:

    A Vĩ cho e hỏi, OpenCv có setup trên C# dc không vậy ạ? e đang xài bản 2013 UL

    • vohungvi says:

      Để chạy được OpenCV bằng C# có 2 cách:
      – Cách 1: sử dụng cross-platform của nó là EmguCV
      – Cách 2: viết code xử lý bằng C++, sau đó viết hàm trong C# gọi C++

  2. Toan Van says:

    anh ơi em không hiểu đoạn này:
    Copy file *.dll vào thư mục $(SolutionDir)$(Configuration)\:
    – Các file *300d.dll vào thư mục $(SolutionDir)\Debug
    – Các file *300.dll vào thư mục $(SolutionDir)\Release

    em bỏ qua nên khi chay code của anh nó báo lỗi này anh ạ
    Error 1 error LNK1104: cannot open file ‘opencv_contrib300d.lib’ c:\Users\PC\documents\visual studio 2013\Projects\VToan\VToan\LINK VToan

  3. Dạ chào anh
    em làm tới bước
    Copy file *.dll vào thư mục $(SolutionDir)$(Configuration)\:
    – Các file *300d.dll vào thư mục $(SolutionDir)\Debug
    – Các file *300.dll vào thư mục $(SolutionDir)\Release
    Thì không biết làm sao
    anh có thể nói rõ hơn xíu được không anh

  4. Tô Bạn says:

    Cho em hỏi em tạo 1 solution chứa 1 project, nhưng em tạo 2 source files (vì muốn dùng chung thư viện đã import), nhưng tại sao khi chạy file main() thứ 2 thì nó báo lỗi “error LNK2005: main already defined in “

    • vohungvi says:

      1 chương trình chỉ cho phép 1 hàm main thôi nhé, search xem còn hàm main chỗ nào khác thì xoá đi

  5. Tuan Ngo van says:

    anh Vĩ cho em hỏi em tải cái mẫu anh built rồi sao nó lại bị lỗi này k
    Error 1 error MSB8020: The build tools for v140 (Platform Toolset = ‘v140’) cannot be found. To build using the v140 build tools, please install v140 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting “Upgrade Solution…”.
    em dùng visual 2013 luôn

  6. bạn cho mình hỏi lỗi “did you forget to add ‘#include stdafx.h ‘ to your source” thì sửa như thế nào vậy? Mình bị lỗi này

    • vohungvi says:

      Bạn tự tạo project mới đúng ko? Nếu đúng thì có 2 cách:
      1. Thêm dòng bên dưới vào các file source:
      #include “stdafx.h”

      2. Không dùng stdafx.h: Ấn chuột phải vào project, chọn Properties -> C/C++ -> Precompiled Headers, tại combox box Precompiled Header chọn Not Using Precompiled Headers là được

  7. Khoa Le Thanh Nguyen says:

    A cho e hỏi e làm xong tất cả các bước rồi nhưng khi chạy thì bị lỗi cannot open file ‘opencv_ml343d.lib’. E dùng vs2017 và opencv 3.4.3. Em có remove các file lib trong Linker->Input ra rồi add vào và test từng file .lib một thì các file

    opencv_core300d.lib
    opencv_imgproc300d.lib
    opencv_highgui300d.lib

    không bị lỗi này, đến ml343d thì bị.

Leave a Reply