图像的读取与显示
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)
- 它需要两个参数
-
第一个参数是图像名称,需要的是文件的绝对路径名
-
第二个参数是一个可选标志,可指定如何表示图像。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)
- 它也有两个参数
- 第一个参数是将要显示在窗口上的窗口名称
- 第二个是要显示的图像
要一次显示多个图像,需要为每个图像指定一个新的窗口名称
-
函数
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)
- 第一个参数是图像绝对路径名,它必须包含文件扩展名(例如 .png、.jpg 等)。OpenCV 使用这个文件扩展名来指定文件的格式
- 第二个参数是要保存的图像
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;
}