OpenCV介绍:基本用法——图像入门 OpenCV v4.8.0

上一个教程使用 CUDA 为 Tegra 构建 OpenCV

下一个教程 : 为 OpenCV 编写文档

原作者Ana Huamán
兼容性OpenCV >= 3.4.4

警告
本教程可能包含过时信息。

目标

在本教程中,您将学习如何

源代码

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值