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)
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
Set giá trị của Working Directory là $(OutDir) giống như Output Directory
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ọnOutput 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 Directories là E:\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.
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\Debug và E:\lib\opencv300\build\x86\vc12\lib
Với mode Release: E:\lib\opencv300\build\lib\Release và E:\lib\opencv300\build\x86\vc12\lib
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
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
[bg_collapse view=”button-orange” color=”#4a4949″ expand_text=”Show More” collapse_text=”Show Less” ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <opencv2/core/core.hpp #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; int main( int argc, char** argv ) { Mat image; image = imread("D:\\img1.jpg", IMREAD_COLOR); // doc file if(! image.data ) //kiem tra doc thanh cong hay khong { cout << "Could not open or find the image" << std::endl ; return -1; } imshow( "Display window", image ); // hien thi anh waitKey(0); // Wait for a keystroke in the window return 0; } |
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 :
1 cv::Mat image;hoặc không có namespace:
12 using namespace cv;Mat image;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)
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
Để 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++
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
Hi bạn
Mình mới upload source template mới cho OpenCV 3.0.0, bạn chạy bằng Visual Studio 2013
vậy h e add thêm source template này vào hay phải gỡ cái cũ ra trước a :v
Xóa bỏ source cũ đi bạn, source mới giải nén ra là build được
dạ e làm dc r cảm ơn anh nhiều 🙂
mà cho e hỏi cái file TGMTtemplate trong tập giải nén đó mình dùng luôn cũng dc hả anh e thấy nó k cần thiết lập j cả :v
Uhm, vì mình thiết lập sẵn hết cho bạn rồi
mình cũng bị lỗi như bạn. Làm sao để fix vậy bạn
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
Dạ e làm được rùi anh
cám ơn a nhé
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 “
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
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
Bạn dùng Visual Community 2015 để build nhé.
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
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
Admin huong dan hay
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ị.
Đã trả lời bạn trong group Facebook Thị giác máy tính rồi nhé: https://www.facebook.com/groups/thigiacmaytinh/?multi_permalinks=1918963911730554
Anh ơi cho em hỏi khi em nhấn chuột phải vào project chọn Properties để thiết lập thì ko có dòng C/C++; em xài cả 3 bản 2010, 2015 và 2019 đều ko hiện…
anh giúp em với!
em cám ơn anh nhiều!
Để biết chính xác thì bạn chụp màn hình rồi đăng vào group https://www.facebook.com/groups/thigiacmaytinh/ nhé