Bài viết hướng dẫn sử dụng OpenCV để đọc 1 hình ảnh và hiển thị lên cửa sổ Windows.
Chương trình đọc và hiển thị hình ảnh
Chương trình đọc hình ảnh từ file và hiển thị lên cửa sổ sử dụng thư viện OpenCV.
// // main.cpp // OpenCVTest // // Created by NguyenNghia on 11/11/16. // Copyright © 2016 nguyennghia. All rights reserved. // #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace std; using namespace cv; #define INPUT "input.jpg" int main(int argc, const char * argv[]) { // Data structure store image Mat image; // Read image from file with flags CV_LOAD image = imread(INPUT, CV_LOAD_IMAGE_COLOR); // Check image if(image.empty()) { cout << "Can't open or read image" << endl; } else { // Create window to display namedWindow("OpenCV", WINDOW_AUTOSIZE); // Show image imshow("OpenCV", image); waitKey(); } return 0; }
Giải thích mã nguồn
Cài đặt thư viện
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace std; using namespace cv;
#define INPUT "input.jpg"
- Thư viện
iostream
: hỗ trợ nhận input hoặc xuất output ra console thông quacin
,cout
, ... - Module
core
: định nghĩa các cấu trúc, các hàm xử lý ảnh cơ bản và sử dụng trong các module khác. Ví dụ như cấu trúc lưu trữ hình ảnhMat
trong OpenCV. - Module
highgui
: hỗ trợ tương tác với người dùng trên UI (User Interface) như hiển thị hình ảnh, video capturing.
Cấu trúc Mat
Mat image;
// Read image from file with flags CV_LOAD
image = imread(INPUT, CV_LOAD_IMAGE_COLOR);
Mat
là cấu trúc dùng để lưu giữ dữ liệu của hình ảnh được sử dụng trong OpenCV.
Hàm imread
là hàm dùng để đọc hình ảnh từ đường dẫn file.
- Đối số truyền vào thứ nhất là 1 đầu vào chứa tên file.
- Đối số thứ hai là 1 cờ chỉ định cách mà OpenCV sẽ load ảnh.
Các giá trị enum
enum { /* 8bit, color or not */ CV_LOAD_IMAGE_UNCHANGED =-1, /* 8bit, gray */ CV_LOAD_IMAGE_GRAYSCALE =0, /* ?, color */ CV_LOAD_IMAGE_COLOR =1, /* any depth, ? */ CV_LOAD_IMAGE_ANYDEPTH =2, /* ?, any color */ CV_LOAD_IMAGE_ANYCOLOR =4 };
Trong đó thường quan tâm tới các giá trị dưới đây:
CV_LOAD_IMAGE_COLOR
: hình ảnh load lên dưới định dạng 3 kênh màu RGB (red, green, blue).CV_LOAD_IMAGE_GRAYSCALE
: hình ảnh load lên dưới dạnh hình ảnh xám.CV_LOAD_IMAGE_UNCHANGED
: hình ảnh load lên được giữ nguyên cấu trúc của nó.
Phương thức empty
if(image.empty()) { cout << "can't open or read image" << endl; }
Dùng kiểm tra hình ảnh có được đọc thành công hay không?
- Nếu trả về
true
: hình ảnh load lên thất bại. - Nếu trả về
false
: hình ảnh load lên thành công.
Hàm nameWindow
namedWindow("OpenCV", WINDOW_AUTOSIZE);
Hàm namedWindow
sẽ tạo 1 cửa sổ window.
"OpenCV"
: tiêu đề của cửa sổ.WINDOW_AUTOSIZE
: biến cờ chỉ định kích thước cửa sổ, thường mặc định làWINDOW_AUTOSIZE
.
Phương thức imshow
imshow("OpenCV", image);
Phương thức này hiển thị image đã đọc thông qua hàm imread
ở đầu.
Hàm waitKey
waitKey();
Hàm nhận input từ bàn phím, sử dụng hàm này để chương trình hiển thị hình ảnh đến khi người dùng nhấn phím bất kỳ trên bàn phím thì chương trình sẽ được đóng lại.
Kết quả
Thay đổi flags
trong hàm imread
thành CV_LOAD_IMAGE_GRAYSCALE
và xem kết quả: