图像的读取与显示

API

  • 此处,使用#include指令包含 opencv.hpp 头文件,实际上,它包含所有的 OpenCV 头文件。通过包含单个该文件,不再需要包含其他文件
  • 所有的 OpenCV 类和函数都在cv命名空间中,因此,在源代码中需使用cv::前缀或using namespace cv编译语句
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

读取

  • 使用函数imread()从文件加载图像,语法如下:
imread(filename, flags)
  • 它需要两个参数
  1. 第一个参数是图像名称,需要的是文件的绝对路径名

  2. 第二个参数是一个可选标志,可指定如何表示图像。OpenCV 为这个标志提供了几个选项,最常见的包括:

    • IMREAD_UNCHANGED或者 -1
    • IMREAD_GRAYSCALE或者 0
    • IMREAD_COLOR或者 1

    flags 的默认值为 1,它将把图像读取为彩色图像。 当想以特定格式读取图像时,只需指定适当的标志

注意,OpenCV 以 BGR 格式读取彩色图像,而大多数其他计算机视觉库使用 RGB 通道格式顺序。 因此,在将 OpenCV 与其他工具包一起使用时,不要忘记在从一个库切换到另一个库时交换蓝色和红色通道

Mat img_color = imread("/home/kslas/OpenCV/test.jpg", 1);
Mat img_grayscale = imread("/home/kslas/OpenCV/test.jpg", 0);
Mat img_unchanged = imread("/home/kslas/OpenCV/test.jpg", -1);

显示

  • 使用函数imshow(),语法如下:
imshow(window_name, image)
  • 它也有两个参数
  1. 第一个参数是将要显示在窗口上的窗口名称
  2. 第二个是要显示的图像

要一次显示多个图像,需要为每个图像指定一个新的窗口名称

  • 函数imshow()被设计为与函数waitKey()和函数destroyAllWindows()/destroyWindow()协同使用

  • 函数waitKey()是一个键盘绑定函数

    • 它需要一个参数,即显示窗口的时间(以毫秒为单位)
    • 如果用户在此时间段内按下任何键,程序将继续
    • 如果传递的是 0,它会一直等待键盘按下
    • 也可以设置检测特定的击键,例如,按下键 a 等
  • 函数destroyAllWindows()销毁我们创建的所有窗口。如果要销毁特定窗口,应该使用函数destroyWindow()并给出确切的窗口名称

namedWindow("color image", WINDOW_AUTOSIZE);
namedWindow("grayscale image", WINDOW_AUTOSIZE);
namedWindow("unchanged image", WINDOW_AUTOSIZE);

imshow("color image", img_color);
imshow("grayscale image", img_grayscale);
imshow("unchanged image", img_unchanged);

waitKey(0);

destroyAllWindows();

保存

  • 使用函数imwrite()将图像写入/保存到文件目录中,语法如下:
imwrite(filename, image)
  1. 第一个参数是图像绝对路径名,它必须包含文件扩展名(例如 .png、.jpg 等)。OpenCV 使用这个文件扩展名来指定文件的格式
  2. 第二个参数是要保存的图像
imwrite("grayscale.jpg", img_grayscale);

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(test1)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(test1 main.cpp)

target_link_libraries(test1 ${OpenCV_LIBS})

完整代码

// Include Libraries
#include <opencv2/opencv.hpp>
#include <iostream>

// Namespace nullifies the use of cv::function()
using namespace std;
using namespace cv;

int main()
{
    // Read an image
    Mat img_color = imread("/home/kslas/OpenCV/test.jpg", 1);
    Mat img_grayscale = imread("/home/kslas/OpenCV/test.jpg", 0);
    Mat img_unchanged = imread("/home/kslas/OpenCV/test.jpg", -1);

    // Create a window.
    namedWindow("color image", WINDOW_AUTOSIZE);
    namedWindow("grayscale image", WINDOW_AUTOSIZE);
    namedWindow("unchanged image", WINDOW_AUTOSIZE);

    // Show the image inside it
    imshow("color image", img_color);
    imshow("grayscale image", img_grayscale);
    imshow("unchanged image", img_unchanged);

    // Wait for a keystore
    waitKey(0);

    // Destroys all the windows created
    destroyAllWindows();

    // Write the image in the same directory
    imwrite("grayscale.jpg", img_grayscale);

    return 0;
}
posted @ 2022-01-17 19:38  TNTksals  阅读(113)  评论(0编辑  收藏  举报