上一篇教程: 使用 CUDA 为 Tegra 构建 OpenCV
下一篇教程: 为 OpenCV 编写文档
| |
原始作者 | Ana Huamán |
兼容性 | OpenCV >= 3.4.4 |
- 警告
- 本教程可能包含过时信息。
目标
在本教程中,您将学习如何
源代码
C++
- 可下载代码: 点击 这里
- 代码概览
#include <iostream>
{
std::string image_path = samples::findFile("starry_night.jpg");
Mat img = imread(image_path, IMREAD_COLOR);
{
std::cout << "无法读取图像:" << image_path << std::endl;
return 1;
}
imshow("显示窗口", img);
int k = waitKey(0);
if(k == 's')
{
imwrite("starry_night.png", img);
}
return 0;
}
bool empty() const
如果数组没有元素,则返回 true。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的文件关联的文件存储的“黑盒”表示。
定义 core.hpp:102
Python
- 可下载代码: 点击 这里
- 代码概览
import cv2 as cv
import sys
if img is None
sys.exit("无法读取图像。")
if k == ord("s")
cv::String findFile(const cv::String &relative_path, bool required=true, bool silentMode=false)
尝试查找请求的数据文件。
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
CV_EXPORTS_W bool imwrite(const String &filename, InputArray img, const std::vector< int > ¶ms=std::vector< int >())
将图像保存到指定文件。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件加载图像。
解释
C++
在 OpenCV 3 中,我们有多个模块。每个模块负责图像处理的不同领域或方法。您可能已经在这些教程的用户指南的结构中观察到这一点。在使用任何模块之前,您需要先包含声明每个模块内容的头文件。
您几乎总是会使用
我们还包含 iostream 以方便控制台行输出和输入。
通过声明 using namespace cv;
,在以下代码中,可以访问库函数而无需显式声明命名空间。
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 对象中。
C++
std::string image_path = samples::findFile("starry_night.jpg");
Mat img = imread(image_path, IMREAD_COLOR);
Python
- 注意
- OpenCV 支持 Windows 位图 (bmp)、便携式图像格式 (pbm、pgm、ppm) 和 Sun 光栅 (sr、ras)。借助插件(如果自己构建库,则需要指定使用它们,不过,我们在发布的软件包中默认包含插件),您还可以加载诸如 JPEG (jpeg、jpg、jpe)、JPEG 2000 (jp2 - 在 CMake 中称为 Jasper)、TIFF 文件 (tiff、tif) 和便携式网络图形 (png) 等图像格式。此外,OpenEXR 也是一种选择。
之后,会执行一个检查,以确保图像已正确加载。
C++
{
std::cout << "无法读取图像:" << image_path << std::endl;
return 1;
}
Python
if img is None
sys.exit("无法读取图像。")
然后,使用 cv::imshow 函数显示图像。第一个参数是窗口标题,第二个参数是要显示的 cv::Mat 对象。
因为我们希望窗口一直显示,直到用户按下某个键(否则程序会过早结束),所以我们使用 cv::waitKey 函数,它的唯一参数是等待用户输入的时间长度(以毫秒为单位)。零表示永远等待。返回值是按下的键。
C++
imshow("显示窗口", img);
int k = waitKey(0);
Python
最后,如果按下的键是“s”键,则将图像写入文件。为此,会调用 cv::imwrite 函数,它接受文件路径和 cv::Mat 对象作为参数。
C++
if(k == 's')
{
imwrite("starry_night.png", img);
}
Python