Nếu bạn đam mê về nhận dạng khuôn mặt hoặc video stream, thích khám phá lĩnh vực computer vision hay xây dựng một đường pipeline hoàn chỉnh cho việc phân loại ảnh, chắc chắn bạn sẽ gặp OpenCV ở một nơi nào đó trên hành trình học tập và thử nghiệm của mình. Nhưng OpenCV là gì và nó có gì đặc biệt?
Trước đây, việc học OpenCV gặp rất nhiều khó khăn gấp 100 lần so với hiện tại. Tài liệu học khó tìm kiếm và không rõ ràng, các hướng dẫn cũng không hoàn chỉnh. Nhưng may mắn thay, hiện nay việc nghiên cứu OpenCV dễ dàng hơn nhiều. Bài viết này sẽ giúp bạn hiểu rõ hơn về định nghĩa, tính năng và phạm trù cơ bản nhất của OpenCV để bạn biết bạn cần phải làm gì tiếp theo và nơi để tìm kiếm thông tin về OpenCV.
OpenCV là gì?
Dự án OpenCV bắt đầu từ Intel vào năm 1999 do Gary Bradsky sáng lập. OpenCV viết tắt của Open Source Computer Vision Library. OpenCV là một thư viện nguồn mở hàng đầu dành cho Computer Vision và Machine Learning. Hiện nay, nó đã tích hợp thêm tính năng tăng tốc GPU cho các hoạt động thời gian thực.
OpenCV được phát hành dưới giấy phép BSD, vì vậy nó miễn phí cho việc học tập và sử dụng cả với mục đích thương mại. Thư viện này hỗ trợ các ngôn ngữ lập trình C++, C, Python và Java, và có khả năng chạy trên các hệ điều hành Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để tính toán hiệu quả và đặc biệt hữu ích cho các ứng dụng thời gian thực. Nếu được viết bằng C/C++ tối ưu, thư viện này có thể tận dụng được sự đa nhân cực mạnh của bộ xử lý đa lõi.
Chú thích:
Giấy phép BSD là một giấy phép đơn giản chỉ yêu cầu tất cả các mã được cấp phép theo giấy phép BSD nếu được phân phối lại ở định dạng mã nguồn.
OpenCV có một cộng đồng người dùng rất lớn hoạt động trên toàn thế giới, bởi vì nhu cầu sử dụng computer vision của các công ty công nghệ ngày càng gia tăng. OpenCV đã được áp dụng rộng rãi trên toàn cầu, với một cộng đồng lên đến hơn 47.000 người, phục vụ nhiều mục đích và tính năng khác nhau từ nghệ thuật tương tác, khai thác mỏ, khai thác web map cho đến robot cao cấp.
Ứng dụng của OpenCV là gì?
OpenCV được sử dụng rộng rãi trong nhiều mục đích và lĩnh vực khác nhau, bao gồm:
- Hình ảnh street view
- Kiểm tra và giám sát tự động
- Robot và xe tự lái
- Phân tích hình ảnh y học
- Tìm kiếm và phục hồi hình ảnh/video
- Phim – cấu trúc 3D từ chuyển động
- Nghệ thuật sắp đặt tương tác
Để tìm hiểu thêm về các API hàng đầu của Computer Vision, hãy truy cập đường dẫn này.
Tính năng và các module phổ biến của OpenCV
Theo tính năng và ứng dụng của mình, OpenCV được chia thành các nhóm tính năng và module tương ứng như sau:
- Xử lý và hiển thị hình ảnh/ video/ I/O (core, imgproc, highgui)
- Phát hiện các vật thể (objdetect, features2d, nonfree)
- Computer vision 2D dựa trên mô hình ảnh (calib3d, stitching, videostab)
- Computational photography (photo, video, superres)
- Machine learning & clustering (ml, flann)
- Tăng tốc CUDA (gpu)
OpenCV được tổ chức thành các module, tức là bao gồm một số thư viện liên kết tĩnh hoặc thư viện liên kết động. Dưới đây là một số module phổ biến có sẵn trong OpenCV:
- Core functionality (core): module nhỏ gọn dùng để xác định cấu trúc dữ liệu cơ bản, bao gồm mảng đa chiều và nhiều chức năng cơ bản được sử dụng bởi các module khác.
- Xử lý hình ảnh (imgproc): module xử lý hình ảnh bao gồm lọc hình ảnh tuyến tính và phi tuyến, phép biến đổi hình học, chuyển đổi không gian màu, biểu đồ và nhiều thành phần khác.
- Phân tích video (video): module phân tích video bao gồm ước tính chuyển động, tách nền và các thuật toán theo dõi vật thể.
- Hiệu chuẩn camera và xây dựng 3D (calib3d): module hỗ trợ hiệu chuẩn camera đơn và stereo, ước tính vị trí đối tượng, thuật toán phù hợp cho việc ghép ảnh 3D.
- Frame tương đối 2D (features2d): module phát hiện các đặc trưng nổi bật của đối tượng, trích xuất thông tin, so sánh đối tượng.
- Phát hiện đối tượng (objdetect): module phát hiện các đối tượng và mô phỏng của các hàm được định nghĩa sẵn như khuôn mặt, mắt, cốc, con người, xe hơi và nhiều hơn nữa.
- Giao diện đồ họa cao cấp (highgui): giao diện dễ sử dụng để tương tác với người dùng.
- Công cụ I/O video (videoio): giao diện dễ sử dụng để thu và mã hóa video.
- Tăng tốc GPU (gpu): tận dụng các thuật toán tăng tốc GPU từ các module OpenCV khác.
- Và các module hỗ trợ khác như FLANN, Google test wrapper, Python binding, và nhiều hơn nữa.
Chọn ngôn ngữ lập trình cho OpenCV
Hiện nay, OpenCV hỗ trợ nhiều ngôn ngữ lập trình, mỗi ngôn ngữ có những ưu điểm riêng. Tùy thuộc vào nhu cầu và tính chất của dự án, bạn có thể chọn ngôn ngữ phù hợp như:
- C++: Ngôn ngữ phổ biến nhất hiện nay, nhanh chóng và đa chức năng, đặc biệt là phù hợp với Visual Studio IDE. Cấu hình của C++ rất hữu ích cho các dự án phát triển sau này, tuy nhiên học ban đầu có thể gặp một số khó khăn.
- Python: Ngôn ngữ phổ biến để thực hiện thử nghiệm và demo OpenCV vì cú pháp đơn giản và không cần cấu hình phức tạp. Nếu bạn sử dụng Python, bạn cũng có thể chạy mã trên nhiều hệ điều hành khác nhau.
- Android: OpenCV tích hợp sẵn với các tính năng camera nên việc phát triển trên nền tảng Android rất thuận tiện và có thể trở thành xu hướng của OpenCV trong tương lai.
- Java: Java nhanh chóng và đa nền tảng, tương tự như C++.
- C#: C# cung cấp tiện ích và dễ sử dụng, có thư viện đa nền tảng EmguCV hỗ trợ. Tuy nhiên, một nhược điểm là EmguCV yêu cầu người dùng sao chép toàn bộ tệp .dll của thư viện kèm theo ứng dụng, làm cho ứng dụng trở nên nặng hơn.
Hãy dựa vào nhu cầu và tính chất của dự án của bạn để chọn ngôn ngữ lập trình phù hợp nhất. Ví dụ: bạn có thể sử dụng C++ để xử lý hình ảnh và sau đó chuyển sang C# để thiết kế giao diện người dùng. Hoặc sử dụng Python để thực hiện các demo nhanh hoặc trên nhiều hệ điều hành khác nhau. Mỗi ngôn ngữ đều có ưu điểm và hạn chế của riêng nó, vì vậy hãy cân nhắc và chọn ngôn ngữ phù hợp với dự án của bạn.
Cách cài đặt OpenCV
Đầu tiên, hãy tải OpenCV tại địa chỉ https://opencv.org/releases.html. Tác giả sẽ sử dụng phiên bản OpenCV cho Windows trong ví dụ này.
Sau khi tải xong, hãy nhấp vào tệp vừa tải và tiến hành quá trình cài đặt. Trong ví dụ này, chúng tôi sẽ cài đặt OpenCV trong ổ E.
Sau khi cài đặt, thư mục OpenCV sẽ xuất hiện trong ổ E.
Cài đặt OpenCV cho Python
Sau khi cài đặt OpenCV, trong thư mục build của OpenCV, thư viện OpenCV cho Python đã được chuẩn bị sẵn. Hãy sao chép tệp cv2.pyd vào thư mục Lib/site-packages trong thư mục gốc của Python 2.7.
Thư viện OpenCV cho Python sử dụng thư viện numpy. Để cài đặt numpy, hãy cài đặt pip bằng cách tải tệp get-pip.py tại địa chỉ này, sau đó chạy các lệnh sau:
python get-pip.py
pip install numpy
Cài đặt OpenCV cho C++ từ mã nguồn
Trước tiên, tải và cài đặt CMake từ địa chỉ https://cmake.org/download/.
Tiếp theo, tải và cài đặt Mingw từ địa chỉ https://sourceforge.net/projects/mingw-w64/.
Cách thiết lập thư viện OpenCV từ mã nguồn bằng CMake
- Tại trường “Where is the source code”, chọn địa chỉ mã nguồn trong thư mục OpenCV đã cài đặt, ví dụ “E:/opencv/sources”.
- Tại trường “Where to build the binaries”, chọn một thư mục để build. Ví dụ: “E:/opencv/build/x86”.
- Bỏ chọn dòng ENABLE_PRECOMPILED_HEADERS trong cửa sổ config.
- Nhấp vào nút Generate.
Sau khi CMake hoàn tất, chạy lệnh mingw32-make từ thư viện Mingw vừa cài đặt. Nếu muốn sử dụng nhiều lõi CPU (tăng tốc xử lý), bạn có thể chạy lệnh mingw32-make -j4 (-j4 ở đây có nghĩa là build trên 4 lõi CPU).
Đối mặt với lỗi trong quá trình build module ‘videoio’, hãy mở tệp cap_dshow.cpp và thêm dòng mã sau vào đầu tệp: #define STRSAFE_NO_DEPRECATE
Tự học OpenCV ở đâu?
Không thiếu tài liệu tốt để bạn khởi đầu! Bạn hoàn toàn có thể bắt đầu bằng các tài liệu và tài liệu chính thức từ OpenCV.
-
Nếu bạn muốn sử dụng C và C++, bạn có thể theo các tài liệu sau:
- OpenCV Tutorials
- OpenCV Tutorial C++
- Forum iitk.ac.in
-
Nếu bạn muốn sử dụng Python, hãy tham khảo tài liệu này:
- OpenCV-Python Tutorials
Để tải file hướng dẫn đầy đủ, hãy truy cập vào đường dẫn này.
Ngoài ra, có một cuốn sách về OpenCV đã khá lâu nhưng rất hay: http://www.cs.haifa.ac.il/~dkeren/ip/OReilly-LearningOpenCV.pdf
Ngoài ra, có rất nhiều tài liệu tham khảo khác. Giống như bất kỳ ngôn ngữ lập trình nào, bạn nên bắt đầu viết mã OpenCV ngay sau khi bắt đầu học. OpenCV hỗ trợ nhiều IDE để làm việc, nhưng Microsoft Visual Studio là IDE tốt nhất. Bắt đầu viết mã ngay khi bạn bắt đầu học là điều quan trọng nhất. Nếu bạn gặp bất kỳ vấn đề, nhầm lẫn hoặc nghi ngờ nào, có rất nhiều diễn đàn hỗ trợ OpenCV mà bạn có thể tìm hiểu thêm.
Ở bên lề, dưới đây là một số nguồn tài nguyên bạn có thể tham khảo:
Website / Blog
- OpenCV Webinar: Học từ stream webinar của NVIDIA
- Documentations: Tài liệu tổng hợp từ OpenCV
- Issue tracking: Hỗ trợ theo dõi các vấn đề trong quá trình lập trình
- Kho tính năng OpenCV: Các tính năng bổ sung cho OpenCV
- AiShack: Giáo trình học OpenCV từ AIShack
- Thị giác máy tính: https://thigiacmaytinh.com/opencv-co-ban/ (hỗ trợ tiếng Việt)
- Vietnam Lab: https://blog.vietnamlab.vn (hỗ trợ tiếng Việt)
Khóa học (cả miễn phí và có phí)
- Chính thức OpenCV: https://opencv.org/courses
- Udemy: Tổng hợp khóa học OpenCV từ Python, C/C#, đến các khóa học chi tiết theo từng lĩnh vực như hình ảnh, gương mặt, video.
- Datacamp: Có một số khóa học miễn phí về Face Recognition, Python bạn có thể tham khảo.
- Learn OpenCV: Blog tự tạo tập trung vào Face Recognition
- Pyimagesearch: Tổng hợp các khóa học về Computer Vision, Deep Learning và OpenCV.
Tài liệu tham khảo:
- https://developer.nvidia.com/opencv
- https://docs.opencv.org/master/
- https://thigiacmaytinh.com/nen-lap-trinh-opencv-bang-ngon-ngu-nao/
Đọc thêm tuyển dụng lập trình IT mới nhất tại Dnulib.