CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.3.3. Các hàm thao tác với giao diện
OpenCV có thể được sử dụng trong các thư viện giao diện (User Interface framework) như Qt, WinForms, Cocoa,... hoặc không cần giao diện, nhưng đôi khi khi cần hiển thị nhanh kết quả, OpenCV cài đặt module highgui để phục vụ điều đó:
• Tạo và điều khiển cửa sổ để hiển thị hình ảnh
• Thêm thanh theo dõi (trackbar) vào cửa sổ, hay xử lý sự kiện từ chuột và bàn phím
• Đọc và ghi hình ảnh
• Đọc video từ camera hoặc file và ghi video namedWindow
Tạo một cửa sổ để hiển thị như hình ảnh, biểu đồ tần số.
void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE)
Trong đó,
• winname – Tên của cửa sổ, được sử dụng như là định danh để nhận biết cho cửa sổ.
• flags – Cờ chỉ định loại cửa sổ:
◦ WINDOW_NORMAL: người dùng có thể thay đổi được kích thước cửa sổ
◦ WINDOW_AUTOSIZE: người dùng không thể thay đổi được kích thước cửa sổ, nội dung hiển thị sẽ được vừa khớp (fit) với cửa sổ
◦ WINDOW_OPENGL: nếu được được chỉ định, sẽ tạo cửa sổ với OpenGL hỗ trợ
Tạo một cửa sổ để hiển thị hình ảnh và đặt thanh trackbar, nếu tên cửa sổ tạo mới trùng với
tên đã có sẳn thì hàm sẽ không làm gì hết.
destroyWindow
Đóng một cửa sổ chỉ định.
void destroyWindow(const string& winname)
Trong đó,
• winname – Tên cửa sổ cần đóng được tạo bởi namedWindow imread
Đọc hình ảnh từ tập tin.
Mat imread(const string& filename, int flags=1)
Trong đó,
• filename – Tên tập tin cần đọc.
• flags – Cờ chỉ định kiểu màu của hình ảnh được đọc
◦ IMREAD_GRAYSCALE: (giá trị = 0) đọc ảnh và chuyển ảnh sang ảnh màu xám
◦ IMREAD_COLOR: (giá trị = 1) đọc và chuyển ảnh sang ảnh 3 kênh màu (thứ tự được mã hoá là BGR, tương úng với Blue Green Red)
◦ IMREAD_UNCHANGED: (giá trị = -1) trả về hình ảnh được đọc bao gồm cả kênh alpha (qui định độ trong suốt của hình ảnh – nếu có)
Hàm đọc tập tin hình ảnh (dựa trên phần thông tin header, không dựa vào định dạng) được chỉ định và trả về kiểu Mat, nếu không thể đọc được hình ảnh (có thể do tập tin không tồn tại, không có quyền truy cập,...) hàm sẽ trả về ma trận rổng (Mat::data == NULL).
imshow
Hiển thị một hình ảnh trên một cửa sổ chỉ định.
void imshow(const string& winname, InputArray mat);
Trong đó,
• winname – Tên cửa sổ để hiển thị
• mat – Hình ảnh được hiển thị
Nếu cửa sổ được tạo với cờ WINDOW_AUTOSIZE, hình ảnh được hiển thị với kích thước gốc.
Ngược lại, hình ảnh sẽ được co giản để khớp với kích thước cửa sổ.
waitKey
Đợi cho đến khi nhấn phím bất kỳ.
int waitKey(int delay = 0)
Trong đó,
• delay – Thời gian chờ để nhấn phím theo đơn vị mili giây, nếu = 0 sẽ chờ mãi mãi cho đến khi nhấn phím bất kỳ
Trả về mã của phím được nhấn hoặc -1 nếu không có phím nào được nhấn. Chú ý: hàm chỉ hoạt động nếu có ít nhất một cửa sổ được tạo và hoạt động.
Ví dụ 2.4: Chương trình đọc một tập tin ảnh và hiển thị lên của sổ và nhấn một phím bất kỳ để thoát chương trình.
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
#define WINDOW_NAME "Image show"
Mat img;
int main (int argc, char const* argv[]) { if (argc != 2) {
cout << "You must pass an image\n";
return -1;
}
img = imread(argv[1], IMREAD_COLOR);
if (img.empty()) {
cout << "No data on image" << endl;
return -1;
}
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
imshow(WINDOW_NAME, img);
cout << "Press any key to quit" << endl;
waitKey(0);
return 0;
}
imwrite
Ghi hình ảnh ra tập tin.
bool imwrite(const string& filename, InputArray img, const vector<int>& params)
Trong đó,
• filename – Tên của tập tin lưu.
• img – Hình ảnh được lưu.
• params – (tuỳ chọn) Các tuỳ chọn lưu ảnh, được lưu theo cặp id – value, ví dụ: id1
tương ứng có giá trị value1, id2 tương ứng có giá trị value2. Các cờ hỗ trợ:
◦ IMWRITE_JPEG_QUALITY: chất lượng lưu cho định dạng JPEG, từ 0 – 100 (mặc định
95).
◦ IMWRITE_PNG_COMPRESSION: độ nén cho định dạng PNG, từ 0 – 9 (mặc định 3)
◦ IMWRITE_PXM_BINARY: lưu nhị phân cho PPM/PGM/PBM, 0 hoặc 1 (mặc định 1) Ví dụ 2.5: Đọc một tập tin ảnh màu và chuyển sang ảnh màu xám, sau đó ảnh màu xám đó thành tập tin ảnh.
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define WINDOW_NAME "Grayscale Image"
Mat colorImg, grayImg;
int main(int argc, char const* argv[]) { colorImg = imread(argv[1], IMREAD_COLOR);
cvtColor(colorImg, grayImg, COLOR_BGR2GRAY);
imwrite("grayscale.jpg", grayImg);
cout << "Convert has completed!" << endl;
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
imshow(WINDOW_NAME, grayImg);
waitKey(0);
return 0;
}
VideoCapture::VideoCapture
Lớp VideoCapture dùng để đọc video từ tập tin hoặc sử dụng camera của máy.
Các phương thức khởi tạo:
VideoCapture::VideoCapture()
VideoCapture::VideoCapture(const string& filename) VideoCapture::VideoCapture(int device)
Trong đó,
• filename – Tên tập tin đọc từ hệ thống
• device – Id camera của máy, nếu máy chỉ có một camera thì truyền đối số 0 VideoCapture::open
Mở một tập tin video hoặc kết nối sử dụng camera của máy.
bool VideoCapture::open(const string& filename)
bool VideoCapture::open(int device);
Các tham số giống như phương thức khởi tạo.
VideoCapture::isOpened
Kiểm tra đối tượng VideoCapture có được khởi tạo hay chưa, trả về true nếu đã khởi tạo.
bool VideoCapture::isOpened()
VideoCapture::get
Trả về thuộc tính của VideoCapture.
double VideoCapture::get(int propId)
Trong đó,
• propId – Thuộc tính cần trả về, có rất nhiều thuộc tính, dưới đây là các thuộc tính thường sử dụng:
◦ CV_CAP_PROP_POS_MSEC: Vị trí hiện tại của tập tin video (mili giây)
◦ CV_CAP_PROP_POS_FRAMES: Chỉ số của khung hình (frame) kế tiếp; chỉ số được tính bắt đầu từ 0
◦ CV_CAP_PROP_FRAME_WIDTH: Chiều rộng của video hoặc camera
◦ CV_CAP_PROP_FRAME_HEIGHT: Chiều cao của video hoặc camera
◦ CV_CAP_PROP_FPS: Số khung hình/giây của video
◦ CV_CAP_PROP_FOURCC: 4 ký tự mã hoá codec của video
◦ CV_CAP_PROP_FRAME_COUNT: Tổng số khung hình của video VideoCapture::set
Thiết đặt thuộc tính của VideoCapture.
bool VideoCapture::set(int propId, double value)
Trong đó,
• propId – Thuộc tính cần thiết đặt, giống propId của VideoCapture::get()
• value – Giá trị của thuộc tính VideoCapture::read
Đọc khung hình tiếp theo.
VideoCapture& VideoCapture::operator>>(Mat& image) bool VideoCapture::read(Mat& image)
Nếu hết khung hình để tải hoặc camera bị ngắt kết nối, phương thức sẽ trả về false hoặc khung hình được trỏ tới NULL.
Ví dụ 2.6: Hiển thị video đọc từ tập tin hoặc sử dụng camera của máy.
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
#define WINDOW_NAME "Video Capture"
Mat frame;
int main(int argc, char const* argv[]) { VideoCapture cap(0);
// VideoCapture cap("video.mp4");
if (!cap.isOpened()) {
cout << "Can not open you camera" << endl;
return -1;
}
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
while (char(waitKey(30)) != 'q') { if (!cap.read(frame)) {
break;
}
imshow(WINDOW_NAME, frame);
}
return 0;
}
VideoWriter::VideoWriter
Lớp VideoWriter dùng để ghi video từ camera vào tập tin.
Các phương thức khởi tạo:
VideoWriter::VideoWriter()
VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor = true)
Trong đó,
• filename – Tên tập tin để lưu video
• fourcc – 4 ký tự mã hoá codec, OpenCV hỗ trợ macro CV_FOURCC để tạo 4 ký tự mã hoá codec. Ví dụ: CV_FOURCC('M', 'P', 'E', 'G')
• fps – Số khung hình/giây được tạo cho video đích
• frameSize – Kích thước của khung hình
• isColor – Nếu giá trị là true, video được ghi sẽ có màu, ngược lại có màu xám VideoWriter::open
Khởi tạo hoặc khởi tạo lại VideoWriter.
bool VideoWriter::open(const string& filename, int fourcc, double fps, Size frameSize, bool isColor = true)
Các tham số giống như phương thức khởi tạo.
VideoWriter::isOpened
Kiểm tra đối tượng VideoWriter có được khởi tạo hay chưa, trả về true nếu được khởi tạo.
bool VideoWriter::isOpened()
VideoWriter::write
Ghi khung hình vào tập tin.
VideoWriter& VideoWriter::operator<<(const Mat& image) void VideoWriter::write(const Mat& image)
Trong đó,
• image – Khung hình được ghi, phải có cùng kích thước với đối tượng VideoWriter
Ví dụ 2.7: Sử dụng camera của máy để thu lại video và ghi ra tập tin.
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
#define WINDOW_NAME "Video Capture"
int main(int argc, char const* argv[]) { VideoCapture cap(0);
if (!cap.isOpened()) {
cout << "Can not open you camera" << endl; return -1;
}
Size size(640, 480);
VideoWriter wrt("output.mpg", CV_FOURCC('M', 'P', 'E', 'G'), 30, size);
if (!wrt.isOpened()) {
cout << "Can not open VideoWriter" << endl; return -1;
}
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
while (char(waitKey(1)) != 'q') { Mat frame;
if (!cap.read(frame)) { break;
}
wrt << frame;
imshow(WINDOW_NAME, frame);
}
return 0;
}