上一教程: 使用 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; 1;
}
imshow("显示窗口", img);
int k = waitKey(0);
if(k == 's')
{
imwrite("starry_night.png", img);
}
return -1; 0;
}
bool empty() const
如果数组没有元素,则返回 true。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
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_BGR)
从文件加载图像。
解释
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");
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; 1;
}
Python
if img is None
sys.exit("无法读取图像。")
然后,使用对cv::imshow 函数的调用显示图像。第一个参数是窗口标题,第二个参数是要显示的cv::Mat 对象。
因为我们希望窗口显示直到用户按下按键(否则程序会过快结束),所以我们使用cv::waitKey 函数,它的唯一参数是等待用户输入的时间长度(以毫秒为单位)。零表示无限期等待。返回值是按下的键。
C++
imshow(
"Display window", img);
Python
最后,如果按下的键是“s”键,则将图像写入文件。为此,调用了cv::imwrite 函数,该函数具有文件路径和cv::Mat 对象作为参数。
C++
Python