上一篇教程:用CUDA为Tegra构建OpenCV
下一个教程:为OpenCV编写文档
- | - |
---|---|
Original author | Ana Huamán |
Compatibility | 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); // 在窗口中等待一个按键
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)
注意事项
OpenCV提供对Windows位图(bmp)、便携式图像格式(pbm, pgm, ppm)和Sun光栅(sr,
ras)等图像格式的支持。在插件的帮助下(如果你自己建立库,你需要指定使用它们,不过在我们提供的软件包中,默认是有插件的),你也可以加载图像格式,如JPEG(jpeg,
jpg, jpe),JPEG 2000(jp2 - 在CMake中被称为Jasper),TIFF文件(tiff,
tif)和便携式网络图形(png)。此外,OpenEXR也是一种可能性。
解释
C++
在OpenCV 3中,我们有多个模块。每个模块负责一个不同的领域或图像处理的方法。你已经可以从这些教程的用户指南本身的结构中看到这一点。在你使用任何一个模块之前,你首先需要包含头文件,每个模块的内容都在其中声明。
你几乎总是要使用:
通过使用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);
samples::findFile
imread
IMREAD_COLOR
之后,将执行检查,以确定图像是否被正确加载:
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,在下面的内容中,它被用来引用这个库:
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"))
之后,将执行检查,以确定图像是否被正确加载:
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)