Cài đặt OpenCV 3.0 với Visual Studio 2012 trên Windows 10 64bit (Phần 2)

Sau khi đã cài đặt thư viện OpenCV và thiết lập System PATH trong Windows, việc tiếp theo đó là thiết lập để tích hợp thư viện OpenCV vào 1 dự án (Project) bên trong bộ ứng dụng phát triển nổi tiếng Visual Studio (VS) của Microsoft. Trong phần này chúng ta sử dụng phiên bản Visual Studio 2012 Pro và nên tảng Windows 10 64bit.

Lưu ý rằng phiên bản VS không phải là “Pro” (Professional) có thể không có chức năng tích hợp thư việc bên ngoài. Tác giả đã từng thử nghiệm với phiên bản VS 2008 Expresss Edition và thấy rằng phiên bản này không thể tích hợp thư viện OpenCV vào dự án, nhưng sau khi nâng cấp lên phiên bản VS 2008 Professional Edition thì công việc diễn ra hoàn toàn bình thường. Hãy cùng tiếp tục.

Mọi thứ tôi nói ở đây sẽ áp dụng cho giao diện (interface) C/C++ của thư viện OpenCV. Ở đây tôi mặc định rằng các bạn đã đọc và hoàn thành bước 1 – Cài đặt OpenCV lên Windows. Tiếp theo, hãy chắc chắn rằng bạn đã có một thư mục OpenCV nơi chứa các tập tin header cùng với các tập tin binaries (các tập tin đã được biên dịch của thư viện từ đó có thể thực thi) và bạn đã thiết lập các biến môi trường (enviroment variables) như đã miêu tả ở phần trước.

OpenCV_Install_Directory

Thư viện OpenCV trên hệ điều hành Microsoft Windows là Thư viện Liên kết Động (Dynamic Linked Libraries hay DLL). Nó có ưu điểm là tất cả nội dung của thư viện được tải (load) chỉ trong thời gian chạy (runtime) khi có yêu cầu, và có vô số các chương trình có thể sử dụng cùng một tập tin thư viện. Điều này có nghĩa rằng nếu bạn có 10 ứng dụng sử dụng thư viện OpenCV, bạn sẽ không cần phải có mỗi phiên bản cho mỗi một ứng dụng trong số chúng. Dĩ nhiên, bạn vẫn cần có thư viện OpenCV DLL trên tất cả các hệ thống mà bạn muốn chạy chúng.

Một phương pháp khác đó là sử dụng thư viện tĩnh (static lirbraries) mà có phần mở rộng lib. Bạn có thể xây dựng chúng bằng cách sử dụng các tập tin nguồn được miêu tả trong bài trước. Khi bạn sử dụng thư viện dạng này chúng sẽ được xây dựng (build) ngay bên trong file.exe của bạn. Do đó sẽ không có cơ hội để người sử dụng chẳng may xóa chúng vì một lý do nào đó. Lúc đó, ứng dụng của bạn sẽ lớn hơn và, do đó, sẽ mất nhiều thời gian hơn để tải trong quá trình khởi động.

Để xây dựng ứng dụng (Build an Application) với OpenCV bạn sẽ cần làm 2 thứ:

  • Nói cho trình biên dịch (compiler) rằng bạn muốn thư viện OpenCV sẽ như thế nào. Bạn làm điều này bằng việc chỉ cho trình biên dịch những tập tin header.
  • Nói cho trình liên kết (linker) biết cần phải lấy các hàm (function) hoặc cấu trúc dữ liệu (data structure) của OpenCV từ đâu khi chúng được sử dụng tới.

Nếu bạn sử dụng hệ thống lib, bạn phải thiết lập đường dẫn tới các tập tin thư viện và tập tin nào trong số chúng cần kết nối. Trong suốt quá trình xây dựng (build), trình kết nối sẽ nhìn vào những thư viện này và sẽ bổ sung những khái niệm (definitions) và sự thực thi của tất cả những hàm và cấu trúc dứ liệu sẽ được sử dụng tới trong tập tin chạy (executable file).

Nếu bạn sử dụng hệ thống DLL, bạn phải một lần nữa thiết lập (specify – nguyên văn là “chỉ rõ ra”) tất cả điều này, tuy nhiên, với một lý do khác. Đây là một công cụ (stuff) cụ thể của hệ điều hành Microsoft. Nó dường như là trình liên kết cần phải biết được vị trí trong tập tin DLL để tìm kiếm cấu trúc dữ liệu và hàm tại thời điểm chạy. Thông tin này được lưu trữ trong tập tin lib. Tuy nhiên, chúng không phải là thư viện tĩnh. Chúng được gọi là những thư viện nhập (import libaries). Đây là lý do tại sao khi bạn tạo vài tập tin DLLs trong Windows bạn cũng sẽ có được một vài thư viện với đuôi mở rộng lib. Điều đáng mứng ở đây là tại thời gian thực thi chỉ cần tập tin DLL.

Để thực hiện (pass) tất cả điều này trong môi trường phát triển (IDE) Visual Studio, bạn có thể hoặc là thực hiện chúng toàn cục (globally – do đó tất cả các dự án tiếp theo sẽ tự động có những thiết lập này) hoặc cục bộ (locally – tức là chỉ cho dự án hiện tại của bạn). Lợi thế của việc thiết lập toàn cục là bạn chỉ phải làm 1 lần cho mọi dự án, tuy nhiên, nó có thể không được mong muốn khi gộp tất cả các dự án của bạn tại mọi thời điểm với những thiết lập này. Trong trường hợp thiết lập toàn cục, các bạn làm phụ thuộc vào Microsoft VS mà bạn sử dụng. Có cách thiết lập cho phiên bản 2008 và trước đó cũng như phiên bản 2010 (chúng ta sẽ thực hiện với phiên bản 2012). Tôi sẽ trình bày những điểm khác nhau chính trong phần toàn cục (global section).

Đơn vị cơ sở (base item) của một dự án trong VS là một giải pháp (solution). Một giải pháp có thể chứa rất nhiều dự án (project). Các dự án này là những khối xây dựng (building block) của một ứng dụng (Application). Mỗi một dự án sẽ làm (realize) một điều gì đó và bạn sẽ có dự án chính, mà trong đó bạn có thể đặt cùng với dự án này (dự án sử dụng OpenCV). Trong trường hợp nhiều ứng dụng đơn giản (like many of the tutorials will be), bạn sẽ không cần phải chia ứng dụng thành các mô-dun (modules). Trong những trường hợp như vậy, dự án chính của bạn (main project) sẽ chỉ là 1 dự án duy nhất mà thôi. Bây giờ hãy tạo một giải pháp mới bên trong VS bằng cách chọn File ‣ New ‣ Project. Chọn dạng Win32 Console Application. Nhập tên và chọn đường dẫn lưu trữ. Sau đó, trong họp thoại hiện ra, hãy chắc chắn rằng bạn sẽ tạo một dự án rỗng (empty project).

NewProjectVisualStudio

Phương pháp Cục bộ

Mỗi một dự án được xây dựng tách biệt lẫn nhau. Như vậy mỗi một dự án có gói quy tắc riêng của mình. Bên trong gói quy tắc này lưu trữ tất cả những thông tin mà IDE cần biết để xây dựng nên dự án của bạn. Cho mỗi ứng dụng có ít nhất 2 chế độ xây dựng (2 build modes): bản phát hành (Release) và bản gỡ lỗi (Debug). Bản gỡ lỗi có rất nhiều tính năng giúp bạn có thể tìm và giải quyết dễ dàng hơn các lỗi (bugs) bên trong ứng dụng của mình. Ngược lại, bản phát hành là một phiên bản tối ưu, mục đích của nó là làm sao để ứng dụng chay nhanh hoặc có kích cỡ nhỏ nhất có thể. Bạn có thể nhận thấy rằng các chế độ này đòi hỏi những quy tắc khác nhau để sử dụng trong quá trình xây dựng (build). Do đó, tồn tại những gói quy tắc khác nhau cho mỗi một chế độ xây dựng ứng dụng của bạn. Những gói quy tác này được gọi bên trong IDE như là thuộc tính của dự án và bạn có thể xem và chỉnh sửa chúng bằng cách sử dụng trình quản lý thuộc tính Property Manager. Bạn có thể xem ở View ‣ Property Pages. Mở ra và bạn sẽ thấy những gói quy tắc đang tồn tại (được gọi là Property Sheets).

PropertyPageExample

Điều hay (stuff) ở đây là bạn có thể tạo một gói quy tắc chỉ 1 lần và sau đó có thẻ chỉ cần thêm vào dự án mới để tái sử dụng mà không mất công thiết lập lại. Tạo một lần và tái sử dụng sau này. Chúng ta muốn tạo một Property Sheet (trang thuộc tính) mà sẽ chứa tất cả quy tắc mà trình biên dịch và trình kết nối cần biết. Đương nhiên chúng ta sẽ cần một bản riêng rẽ cho Debug và 1 bản riêng rẽ cho Release Builds. Hãy bắt đầu với bản dành cho Debug như trên hình sau:

AddNewPropertySheet

Nhập tên ví dụ như OpenCV_Debug. Sau đó chọn ấn chuột phải Right Click ‣ Properties. Tiếp theo tôi sẽ hướng dẫn cho các bạn thiết lập những quy tắc OpenCV cục bộ, do tôi thấy không cần thiết phải “làm bẩn” (pollute) các dự án với những quy tắc tùy chỉnh mà tôi không cần sử dụng đến nó. Vào nhóm C++ ‣ General ‣ Additional Include Directories và thêm đường dẫn đến OpenCV include. Nếu bạn khong có “C/C++” group, bạn sẽ phải bổ sung bất cứ tập tin.c/.cpp nào của OpenCV cho dự án.

$(OPENCV_DIR)\..\..\include

PropertySheetOpenCVInclude

Khi bổ sung các thiết lập của các thư viện của nhà phát triển thứ 3, đó là ý tưởng tốt khi sử dụng sức mạnh đằng sau các biên môi trường. Đường dẫn đầy đủ của thư viện OpenCV có thể khác nhau trên mỗi hệ thống. Hơn nữa, bạn thậm chí có thể tự di chuyển thư mục đã cài đặt vì một lý do nào đó. Nếu bạn muốn đưa ra một đường dẫn rõ ràng bên trong trang thuộc tính (Property Sheet) của mình, chương trình của bạn sẽ không chạy được khi bạn đưa nó cho ai sử dụng đường dẫn đến thư mục cài đặt OpenCV khác. Ngoài ra, việc sửa nó sẽ đòi hỏi phải làm thủ công cho mỗi đường dẫn. Một giải pháp “ngon lành” hơn là sử dụng biên môi trường. Bất cứ thứ gì bạn đặt bên trong dấu ngoặc bắt đầu với dấu đô-la ($) sẽ được thay thế bằng biên môi trường hiện hành khi thực thi. Đây là lúc biên môi trường, mà chúng ta đã thiết lập trong bài trước, thể hiện vai trò của mình

Vào Linker ‣ General và bên dưới “Additional Library Directories” bổ sung thư mục libs:

$(OPENCV_DIR)\lib

PropertySheetOpenCVLib

 

Sau đó bạn sẽ cần phải xác định thư viện mà trình kết nội linker sẽ truy cập vào. Để làm điều đó, vào Linker ‣ Input và bên dưới mục “Additional Dependencies” thêm tên của tất cả các mô-đun mà bạn muốn sử dụng:

PropertySheetOpenCVLibrariesDebugSmple

 

PropertySheetOpenCVLibrariesDebug

Tên của các thư viện như dưới đây:

opencv_(The Name of the module)(The version Number of the library you use)d.lib

Một danh sách đầy đủ, cho phiên bản sau cùng sẽ như sau:

opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_ml249d.lib
opencv_nonfree249d.lib
opencv_objdetect249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_videostab249d.lib

Chữ “d” ở đằng sau chỉ ra rẳng những thư viện này được dùng cho chế độ Debug. Bây giờ ấn vào nút “OK” để lưu và làm tương tự với mục quy tắc Release. Hãy chắc chắn bạn bỏ qua các thư việc có chữ “d”.

PropertySheetOpenCVLibrariesRelease

Bạn có thể tim thấy Property Sheet bên trong thư mục dự án của bạn. Lưu giữ chúng vào một thư mục đặc biệt là một quyết định không tồi để có thể sẽ dụng lại chúng bất cứ lúc nào khi bạn cần tạo một dự án OpenCV. Lưu ý rằng với VS2010, tập tin có đuôi mở rộng là props, còn với VS2008 – vsprops, với VS2012 – ???.

PropertySheetInsideFolder

Lần sau, khi bạn muốn tạo một dự án OpenCV, bạn chỉ việc sử dụng menu “Add Existing Property Sheet…” bên trong Property Manager để dễ dàng bổ sung những quy tắc build OpenCV.

PropertyPageAddExisting

Phương pháp Toàn cục

Trong trường hợp bạn thấy khó khăn khi thêm những trang thuộc tính cho một hay mỗi một dự án mới, bạn cũng có thể thêm quy tắc cho “Trang thuộc tính toàn cục” (global property page). Tuy nhiên, cái này áp dụng chỉ cho những thư mục include và library bổ sung. Tên của những thư viện sử dụng bạn vẫn cần phải thiết lập thủ công bằng cách sử dụng phiên bản Property Page.

Trong VS2008, bạn có thể tìm ở đây: Tools ‣ Options ‣ Projects and Solutions ‣ VC++ Directories.

PropertySheetOpenCVLibrariesDebug

Trong VS2010, nó đã được chuyển thành Global Property Sheet được sự động thêm vào mỗi dự án mà bạn tạo ra.

VCDirectories2010

Tiến trình giống như đã miêu tả đối với trường hợp thiết lập cho chế độ Cục bộ. Chỉ cần bổ sung các thư mục include bằng cách sử dụng biên môi trường OPENCV_DIR.

Kiểm tra

Bây giờ hãy thử tải về một bài test nhỏ hoặc lấy nó từ thư mục code mẫu trong nguồn OpenCV. Thêm nó vào dự án và build nó.

Bạn có thể build dự án từ 2 nơi. Hoặc là bên trong IDE (tổ chợp Ctrl+F5) hoặc là bằng cách tìm đến thư mục build và kích đúp vào ứng dụng. 2 cách này không giống nhau: Khi bạn chạy chương trình từ IDE thì thư mục làm việc hiện tại chính là thư mục dự án, còn khi chạy từ ngoài thì thư mục làm việc hiện tại lại là thư mục chưa tập tin chạy. Ngoài ra, khi chạy từ IDE thì cửa sổ console sẽ không đóng lại, khi chương trình chạy xong, nó sẽ đợi bạn ấn một phím.

Điều này rất quan trong khi bạn tải logo này về phải đúng thư mục làm việc hiện tại để chương trình có thể tìm được đúng file này. Kết quả khi chạy chương trình:

SuccessVisualStudioWindows
Theo OpenCV Docs


Mạng Ký Giả: Cuộc thi viết với chủ đề Việt Nam - Đất nước - Con người

 




Bài liên quan

Có 7 phản hồi cho bài viết “Cài đặt OpenCV 3.0 với Visual Studio 2012 trên Windows 10 64bit (Phần 2)”:

  1. Nelly viết:

    It’s always a relief when someone with obvious exreitpse answers. Thanks!

  2. And Sondra Locke sucked as an actress.I was under the impression there is a common law marriage [law] in place in TN. 7 years, I believe. At least my ex believes it. She won't stay with any of her live ins more than 6.5 years. I might be able to weasel out of paying her way then.

  3. mihaela spune:va rog foarte mult sa ma ajutati, desi problema mea nu tine de subiectul acestui post.. am o foarte mare nedumerire. daca bunicul logodnicului meu este var de gradul 2 cu mama mea, ne mai putem casatori? Bunicul bunicului logodnicului meu fiind frate cu tatal bunicului meu. Va rog foarte mult sa ma ajutati. Va multumesc anticipat!

  4. http://www./ viết:

    That’s an intelligent answer to a difficult question xxx

  5. http://www./ viết:

    “Not that every Muslim is dangerous, or that every mosque is a hotbed of jihad zealotry. But many dangerous and seditious radicals do live in the Muslim communities and conspire in their mosques.”What is that other than a sop to the PC gods? Until and unless we recognize that EVERY Muslim must be regarded as a threat to our civilization and our culture we will not survive. They don’t have to be throwing bombs to destroy us. Their beliefs are incompatible with our Western principles.

  6. Per contro, ho visto molte zanzare (ma MOLTE, visto che ho abitato a lungo a Pavia) passare indenni attraverso una ragnatela pur avendola toccata.Beh, per forza; se stavi lì tu ad osservare, il ragno di certo non se ne saltava fuori. I ragni sono come i gatti, capiscono subito se gli vuoi bene.

  7. que sí te encantaría estimado emprendedor, por eso te daremos estas tres opciones de negocios mas rentables  con sus respectivas y breves descripciones; que luego tú mismo podrás analizar  y pensar por

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Cùng chủ đề