Mục tiêu của bài viết

Bài viết có 3 mục tiêu chính:

  • Giúp người đọc nắm được một số kiến thức cơ bản về xử lý ảnh
  • Cài đặt OpenCV
  • Viết một chương trình đơn giản với OpenCV

1. Giới thiệu OpenCV

OpenCV (Open Source Computer Vision Library) là một thư viện mã nguồn mở về thị giác máy (computer vision) và học máy (machine learning). OpenCV được phát hành theo giấy phép BSD, do đó nó hoàn toàn miễn phí cho cả học thuật và thương mại. Nó có các interface C++, C, Python, Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để tính toán hiệu quả và với sự tập trung nhiều vào các ứng dụng thời gian thực. Được viết bằng tối ưu hóa C/C++, thư viện có thể tận dụng lợi thế của xử lý đa lõi. Được sử dụng trên khắp thế giới, OpenCV có cộng đồng hơn 47 nghìn người dùng và số lượng download vượt quá 6 triệu lần. Phạm vi sử dụng từ nghệ thuật tương tác, cho đến lĩnh vực khai thác mỏ, bản đồ trên web hoặc công nghệ robot.

2. Kiến thức cơ bản về xử lý ảnh

2.1 Ảnh kĩ thuật số (Digital image)

Ảnh kĩ thuật số (digital image) là một dạng biểu diễn của ảnh ở dạng ma trận số 2 chiều. Tùy vào độ phân giải của ảnh có cố định hay không, ảnh kĩ thuật số được chia ra làm 2 loại là ảnh vector (độ phân giải không cố định) và ảnh raster (hay còn gọi là bitmapped, độ phân giải cố định). Thuật ngữ ảnh kĩ thuật số thường được dùng để nói đến ảnh raster.

2.2 Độ phân giải của ảnh (Resolution)

Độ phân giải ảnh là mức độ chi tiết mà ảnh có thể thể hiện. Thuật ngữ này được dùng cho ảnh raster. Độ phân giải càng cao, ảnh càng nhiều chi tiết. Ví dụ: độ phân giải 640 x 480.

2.3 Điểm ảnh (Pixel)

Trong ảnh kĩ thuật số, một điểm ảnh (pixel) là phần tử nhỏ nhất của ảnh raster (raster image). Mỗi một điểm ảnh là một mẫu (sample) của ảnh. Càng nhiều điểm ảnh, ảnh kĩ thuật số càng biểu diễn chính xác hơn về nội dung của ảnh gốc. Đặc trưng của một điểm ảnh gồm 2 thành phần: tọa độ (x,y) và cường độ sáng (intensity).

2.4 Mức xám của ảnh (Grayscale)

Mức xám của ảnh (greyscale) là một trong những giá trị số của điểm ảnh biểu diễn mức độ ánh sáng (light intensity) tại điểm ảnh đấy. Thông thường, trong xử lý ảnh hiện tại, mức xám hay sử dụng nhất là mức 256 (có giá trị mức xám từ 0 -> 255).

2.5 Ảnh màu

Để biểu diễn ảnh màu, theo cách biểu diễn RGB, ba ma trận mức xám 256, ứng với ba màu đỏ (R), lục (G), lam(B) được sử dụng. Màu sắc của một điểm ảnh được quyết định bởi giá trị cường độ (intensity) tại ba ma trận màu cùng tọa độ.

3. Cài đặt OpenCV

Bước 1: Tải OpenCV

Tải OpenCV tại địa chỉ https://opencv.org/releases.html
Ở đây, mình sẽ sử dụng OpenCV cho windows (Win pack)
hinh1

Bước 2: Giải nén OpenCV

Sau khi tải xong, click vào file vừa tải và tiến hành cài đặt. Trong ví dụ này, mình sẽ cài đặt OpenCV tại ổ E
hinh2
hinh3
Sau khi cài đặt xong, thư mục OpenCV sẽ xuất hiện tại ổ E:

3.1 Cài đặt OpenCV cho Python

Sau khi cài đặt xong OpenCV, trong thư mục build của openCV, thư viện OpenCV của python đã được chuẩn bị sẵn.
hinh4
Copy file cv2.pyd vào trong Lib/site-packages của thư mục gốc của Python2.7
hinh5
Thư viện OpenCV cho python sử dụng numpy. Để cài đặt numpy, hãy cài đặt pip và sử dụng pip để cài đặt numpy.
Tải file get-pip.py tại địa chỉ: https://bootstrap.pypa.io/get-pip.py
Cài đặt pip: python get-pip.py
Cài đặt numpy: pip install numpy

3.2 Cài đặt OpenCV cho C++ từ Source Code

Build thư viện OpenCV từ Source Code bằng CMake

Tại trường “Where is the source code”, chọn địa chỉ source code trong thư mục OpenCV vừa cài đặt là E:/opencv/sources, và trường “Where to build the binaries” tại một thư mục sẽ sử dụng để build. Ở đây mình chọn là E:/opencv/build/x86.
Sau khi chọn xong ấn vào nút Configure.
Các bạn chọn genertor bằng MinGW Makefiles
Chú ý: Khi hiển thị config lên, các bạn nhớ bỏ chọn dòng ENABLE_PRECOMPILED_HEADERS
Ấn nút Generate
hinh6
hinh7
Sau khi CMake tạo xong, các bạn hãy chạy lệnh mingw32-make từ thư viện MinGW vừa cài.
Nếu các bạn muốn chạy nhiều core (tăng tốc thực hiện), có thể thực hiện lệnh mingw32-make -j4 (-j4 ở đây mang ý nghĩa build trên 4 core CPU)
hinh8
Chú ý: Khi gặp phải lỗi khi build module videoio, hãy mở đến file cap_dshow.cpp và thêm dòng code sau trên đầu file
#define STRSAFE_NO_DEPRECATE
hinh9

4. Chương trình đầu tiên với OpenCV

4.1 Python

import cv2
img = cv2.imread('E:/cv_example/example.png', 1)
cv2.imshow('example', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Để sử dụng được OpenCV, bước đầu tiên, ta cần phải khai báo thư viện OpenCV bằng dòng lệnh import cv2. Tiếp đến, để đọc ảnh từ file vào, OpenCV đã hỗ trợ hàm imread với tham số đầu vào là đường dẫn đến file và chế độ màu của ảnh. Để hiển thị ảnh ngoài màn hình, ta có thể sử dụng hàm imshow do OpenCV hỗ trợ với tham số thứ nhất là tên cửa sổ ảnh và tham số thứ hai là nội dung ảnh. Sau khi hiển thị nội dung ảnh, bằng lệnh cv2.waitKey(0), chương trình sẽ chờ cho đến khi người dùng nhấn một phím bất kì rồi mới thoát khỏi chương trình.
hinh10

4.2 C++

Trong tutorial này, mình sẽ hướng dẫn các bạn sử dụng OpenCV trên CodeBlock
Tải CodeBlock tại địa chỉ: http://www.codeblocks.org/downloads/26
Đầu tiên, tạo một project mới với CodeBlock, chọn chế độ Console application
hinh11
Tiếp theo, đặt tên project và nơi chứa project.
hinh12
Để sử dụng được OpenCV cho C++, ta cần phải khai báo thư mục chứa header của thư viện OpenCV và linker đến file thư viện
Đầu tiên, khai báo thư mục chứa các file header của OpenCV
hinh13
Tiếp đến, khai báo thư mục chứa các file linker
hinh14
Thêm các file linker
hinh15
Kết quả sau khi thêm xong
hinh16

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{
    cv::Mat img;
    img = cv::imread("E:/cv_example/example.png", 1);
    cv::imshow("Demo", img);
    cv::waitKey(0);
    return 0;
}

Cũng giống như với python, để đọc ảnh vào, ta sử dụng imread; và để hiển thị ảnh ra, ta sử dụng imshow.
hinh17
Sau khi compile và chạy chương trình, bạn có thể sẽ gặp phải lỗi như hình dưới. Đây là lỗi thông báo không tìm thấy file thư viện của OpenCV.
hinh18

Có 2 cách để giải quyết vấn đề này:

  • Cách 1: Copy toàn bộ file thư viện vừa build đặt cùng thư mục với file chương trình
    hinh19
    hinh20
  • Cách 2: Thêm đường dẫn của thư viện OpenCV vào trong Path của system
    hinh22
    Kết quả sau khi chạy file chương trình
    hinh21

Tổng kết

Bài viết trên vừa khái quát một số khái niệm cơ bản về xử lý ảnh, hướng dẫn cách build source code, cài đặt OpenCV với python và C++, và viết một chương trình đọc ảnh cơ bản với OpenCV. Hi vọng bài viết sẽ mang lại kiến thức cơ bản cho những bạn mới bắt đầu học xử lý ảnh, cũng như giúp những bạn đang vướng mắc trong việc cài đặt OpenCV từ source code. Bài viết kế tiếp sẽ đề cập đến một số kĩ thuật xử lý ảnh cơ bản như biến đổi từ ảnh màu sang ảnh xám và làm mịn ảnh (blur). Hẹn gặp lại các bạn trong kỳ tới.

HMD.

References