上一个教程 : 使用 CUDA 为 Tegra 构建 OpenCV
下一个教程 : 为 OpenCV 编写文档
原作者 | Ana Huamán |
---|---|
兼容性 | OpenCV >= 3.4.4 |
警告
本教程可能包含过时信息。
目标
在本教程中,您将学习如何
- 从文件中读取图像(使用 cv::imread)
- 在 OpenCV 窗口中显示图像(使用 cv::imshow)
- 将图像写入文件(使用 cv::imwrite)
源代码
C++
- 可下载代码: 点击此处
- 代码一览
#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;
}
Python
- 可下载代码:点击这里
- 代码一览:
import cv2 as cv
import sys
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
if img is None:
sys.exit("Could not read the image.")
cv.imshow("Display window", img)
k = cv.waitKey(0)
if k == ord("s"):
cv.imwrite("starry_night.png", img)
说明
C++
在 OpenCV 3 中,我们有多个模块。每个模块负责不同的图像处理领域或方法。从这些教程本身的用户指南结构中就可以看出这一点。在使用任何一个模块之前,首先需要包含头文件,在头文件中声明了每个模块的内容。
您几乎总是要使用
- core 部分,因为这里定义了库的基本构建模块
- imgcodecs 模块,提供读写功能
- highgui 模块,包含在窗口中显示图像的函数。
我们还包含了 iostream 模块,以方便控制台行输出和输入。
通过声明使用using namespace cv;
,可以访问库函数,而无需明确说明命名空间。
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
现在,让我们分析一下主代码。第一步,我们从 OpenCV 样本中读取图像 “starry_night.jpg”。为此,我们调用 cv::imread 函数,使用第一个参数指定的文件路径加载图像。第二个参数是可选参数,用于指定我们需要的图像格式。可以是
- IMREAD_COLOR 以 BGR 8 位格式加载图像。这里使用的是默认格式。
- IMREAD_UNCHANGED 按原样加载图像(包括存在的 Alpha 通道)
- IMREAD_GRAYSCALE 将图像加载为强度格式。
读入图像后,数据将存储在 cv::Mat 对象中。
std::string image_path = samples::findFile("starry_night.jpg");
Mat img = imread(image_path, IMREAD_COLOR);
注释
OpenCV 支持 Windows 位图 (bmp)、便携式图像格式 (pbm、ppm、ppm) 和 Sun 栅格 (sr、ras)
等图像格式。在插件的帮助下(如果您自行构建库,则需要指定是否使用插件,但在我们提供的软件包中,插件已默认存在),您还可以加载
JPEG(jpeg、jpg、jpe)、JPEG 2000(jp2–在 CMake 中的代号为 Jasper)、TIFF
文件(tiff、tif)和便携式网络图形(png)等图像格式。此外,还可以使用 OpenEXR。
之后,将检查是否正确加载了图像。
if(img.empty())
{
std::cout << "Could not read the image: " << image_path << std::endl;
return 1;
}
然后,调用 cv::imshow 函数显示图像。第一个参数是窗口的标题,第二个参数是将要显示的 cv::Mat 对象。
由于我们希望窗口一直显示到用户按下按键为止(否则程序会很快结束),因此我们使用了 cv::waitKey 函数,该函数的唯一参数是等待用户输入的时间(以毫秒为单位)。零表示永远等待。返回值是按下的键。
imshow("Display window", img);
int k = waitKey(0); // 等待窗口中的按键操作
最后,如果按下的键是 "s "键,图像将被写入文件。为此,将调用 cv::imwrite 函数,该函数的参数包括文件路径和 cv::Mat 对象。
if(k == 's')
{
imwrite("starry_night.png", img);
}
Python
第一步,导入 OpenCV python 库。正确的做法是另外为其赋名 cv,在下文中将使用 cv 来引用该库。
import cv2 as cv
import sys
现在,让我们分析一下主代码。第一步,我们从 OpenCV 示例中读取图像 “starry_night.jpg”。为此,我们调用 cv::imread 函数,使用第一个参数指定的文件路径加载图像。第二个参数是可选参数,用于指定我们需要的图像格式。可以是
- IMREAD_COLOR 以 BGR 8 位格式加载图像。这里使用的是默认格式。
- IMREAD_UNCHANGED 按原样加载图像(包括存在的 Alpha 通道)
- IMREAD_GRAYSCALE 将图像加载为强度格式。
读入图像后,数据将存储在 cv::Mat 对象中。
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
注意
OpenCV 支持 Windows 位图 (bmp)、便携式图像格式 (pbm、ppm、ppm) 和 Sun 栅格 (sr、ras)
等图像格式。在插件的帮助下(如果您自行构建库,则需要指定是否使用插件,但在我们提供的软件包中,插件已默认存在),您还可以加载
JPEG(jpeg、jpg、jpe)、JPEG 2000(jp2–在 CMake 中的代号为 Jasper)、TIFF
文件(tiff、tif)和便携式网络图形(png)等图像格式。此外,还可以使用 OpenEXR。
之后,将检查是否正确加载了图像。
if img is None:
sys.exit("Could not read the image.")
然后,调用 cv::imshow 函数显示图像。第一个参数是窗口的标题,第二个参数是将要显示的 cv::Mat 对象。
由于我们希望窗口一直显示到用户按下按键为止(否则程序会过快结束),因此我们使用了 cv::waitKey 函数,该函数的唯一参数是等待用户输入的时间(以毫秒为单位)。零表示永远等待。返回值是按下的键。
cv.imshow("Display window", img)
k = cv.waitKey(0)
最后,如果按下的键是 "s "键,图像将被写入文件。为此,将调用 cv::imwrite 函数,该函数以文件路径和 cv::Mat 对象为参数。
if k == ord("s"):
cv.imwrite("starry_night.png", img)