目标
本实例的目的是使初学者通过本文档的学习,可以掌握
- 从文件读取图片(cv::imread)
- 使用OpenCV 窗口显示图片(cv::imshow)
- 将图片另存为新的文件(cv::imwrite)
源码
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
int main()
{
std::string image_path = samples::findFile("starry_night.jpg");
Mat img = imread(image_path, IMREAD_COLOR);
if(img.empty())
{
std::cout << "Could not read the image: " << image_path << std::endl;
return 1;
}
imshow("Display window", img);
int k = waitKey(0); // Wait for a keystroke in the window
if(k == 's')
{
imwrite("starry_night.png", img);
}
return 0;
}
源码解读
OpenCV 3 中有许多模块.每个模块负责完成不同的功能或者不同的图像处理方法.在此教程的用户指南部分您应该已经了解到了这点.在你使用任何模块之前,首先需要包含各个独立模块所对应的头文件.你几乎必不可少的要使用到如下模块:
- core:定义了OpenCV库的基本框架
- imgcodecs模块:提供读写功能
- highgui模块:提供在窗口显示图像的接口
另外我们也需要包含iostream以方便控制台的输入输出控制.
通过声明cv名称空间,以便后续访问库函数的时候可以无需显式声明名称空间.
using namespace cv;
- 读取starry_night.jpg图片 .为了达到这个目的,调用cv::imread(),并将图片路径传递给此函数的第一个参数,第二个参数是可选的,指定了想要的图片格式.图片格式的可能值是:
IMREAD_COLOR:加载BGR 8位格式图片,这也是默认值
IMREAD_UNCHANGED:原样加载图像(包括可能存在的alpha通道)
IMREAD_GRAYSCALE:以灰度(黑白)的形式加载图像读取之后将读取后的数据存储到cv::Mat对象img中.
- 判断图像是否被正确加载.即判断img是否为空
- 调用cv::imshow()显示图像.第一个参数是窗口标题,第二个参数是要显示的cv::Mat对象
- 因为我们希望窗口一直显示,直到用户按下一个键(否则程序会很快结束).所以我们使用cv::waitKey()函数,它唯一的参数是等待用户输入等待的时间(以ms为单位)
- 按下s键,图像被协议文件.cv::imwrite()函数第一个参数是存储的文件名,第二个参数是cv::Mat对应的对象.