Search…

Đọc Ảnh và Hiển Thị Ảnh với OpenCV

15/12/20203 min read
Hướng dẫn code đọc ảnh, hiển thị hình ảnh và 1 số hiệu ứng ảnh đơn giản với OpenCV.

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 qua cin, 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 ảnh Mat 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ả

Sử dụng CV_LOAD_IMAGE_COLOR

Thay đổi flags trong hàm imread thành CV_LOAD_IMAGE_GRAYSCALE và xem kết quả:

Sử dụng CV_LOAD_IMAGE_GRAYSCALE
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024