opencv基础函数使用

简介: opencv基础函数使用

前言

本篇文章带大家来学习一下opencv基础函数的使用。

一、Mat类

Mat类是OpenCV中最常用的数据结构之一,用于表示和操作图像和矩阵数据。它提供了一个多维数组,用于存储像素值、图像通道、图像尺寸和数据类型等信息。

下面是一些关于Mat类的重要概念和功能:

1.图像数据存储: Mat类用于存储图像数据,包括单通道和多通道图像。图像数据存储在内存中的连续或分块的数组中,可以通过索引访问和修改像素值。

2.数据类型和通道数: Mat类支持多种数据类型,如8位无符号整数(CV_8U)、32位浮点数(CV_32F)等。图像可以具有不同的通道数,如灰度图像具有一个通道,彩色图像通常具有三个通道(BGR顺序)。

3.图像尺寸和通道布局: Mat类存储图像的尺寸信息,包括行数、列数和通道数。可以通过成员函数如rows()和cols()获取图像的行数和列数。

4.数据访问: 可以使用不同的方法访问和修改Mat对象中的像素数据。例如,使用(row, col)索引访问像素值,使用.at(row, col)函数进行类型安全的像素访问。

5.图像操作: Mat类提供了一系列用于图像处理的函数,如剪裁、缩放、旋转、颜色转换等。这些函数可用于在图像上执行各种操作和算法。

6.内存管理: Mat类使用智能指针技术自动管理内存,当没有引用指向对象时,内存将自动释放。

如何创建和操作Mat对象:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
    // 创建一个空白图像
    Mat image(200, 300, CV_8UC3, Scalar(0, 0, 255));
    // 获取图像尺寸和通道数
    int rows = image.rows;
    int cols = image.cols;
    int channels = image.channels();
    // 修改像素值
    image.at<Vec3b>(100, 150) = Vec3b(255, 255, 255);
    // 访问像素值
    Vec3b pixel = image.at<Vec3b>(100, 150);
    uchar blue = pixel[0];
    uchar green = pixel[1];
    uchar red = pixel[2];
    // 显示图像
    imshow("Image", image);
    waitKey(0);
  return 0;
}

image.at<Vec3b>(100, 150)这个表达式的意思是访问图像 image 中坐标为 (100, 150) 的像素值,并以 Vec3b 类型返回该像素的颜色值。

运行效果:

二、Vec3b

Vec3b是OpenCV中的一个类,用于表示具有3个通道(B、G、R)的像素值。这个类专门用于表示彩色图像中的像素颜色。

在OpenCV中,图像的每个像素点通常由一个包含多个通道值的数据类型表示。对于彩色图像,每个像素通常由3个通道的值组成,分别代表蓝色(B)、绿色(G)和红色(R)通道。Vec3b类是一个长度为3的固定大小的数组,用于存储这三个通道的值。

每个通道的值是无符号的8位整数(uchar类型),取值范围为0到255。通过访问Vec3b对象的下标,可以获取或修改每个通道的值。例如,Vec3b对象的第一个元素代表蓝色通道的值,第二个元素代表绿色通道的值,第三个元素代表红色通道的值。

三、Scalar函数

Scalar函数是OpenCV中用于创建多通道像素值的函数之一。它可以用于创建包含不同通道值的像素,如灰度值、颜色值等。

Scalar函数的使用方式和参数取决于要创建的像素值类型。以下是Scalar函数的几种常见用法:

1.创建灰度像素值:

Scalar(gray_value)

这种用法使用一个参数来创建一个灰度像素值。gray_value是一个标量值,用于表示像素的灰度级别,通常为0到255之间的整数。

2.创建彩色像素值:

Scalar(blue_value, green_value, red_value)

这种用法使用三个参数来创建一个彩色像素值。blue_value、green_value和red_value分别表示像素的蓝色、绿色和红色通道的值。这些值通常为0到255之间的整数。

3.创建多通道像素值:

Scalar(value1, value2, value3, ...)

这种用法可用于创建多通道像素值,其中每个通道的值由参数列表中的值指定。参数的数量取决于要创建的像素类型的通道数。

示例代码:

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
    // 创建灰度像素值
    Scalar gray_pixel(128);
    // 创建彩色像素值
    Scalar color_pixel(0, 255, 0);
    // 创建多通道像素值
    Scalar multichannel_pixel(10, 20, 30, 40);
    return 0;
}

四、imread函数

imread函数是OpenCV中用于读取图像文件的函数。它可以加载多种图像格式(如JPEG、PNG、BMP等),将图像数据加载到内存中,并返回一个表示图像的 Mat 对象。

imread函数的基本语法如下:

Mat imread(const String& filename, int flags = IMREAD_COLOR);

参数说明:

filename:一个字符串参数,表示要读取的图像文件的路径和文件名。

flags:一个可选的整数参数,用于指定读取图像的方式。默认值为 IMREAD_COLOR,表示以彩色方式读取图像。

flags参数可以取以下的值之一:

IMREAD_UNCHANGED:读取图像的原始数据,包括 alpha 通道(如果存在)。

IMREAD_GRAYSCALE:以灰度方式读取图像。

IMREAD_COLOR:以彩色方式读取图像,默认值。如果图像是彩色的,该选项将保持图像的原始 BGR 通道顺序。

IMREAD_ANYDEPTH:以原始图像深度读取图像,而不转换为 8 位深度。

IMREAD_ANYCOLOR:以任意颜色方式读取图像,不管它是否是索引图像。

五、imshow函数

imshow函数是OpenCV中用于显示图像的函数。它可以将图像数据从内存中的 Mat 对象显示在一个窗口中,并提供一些可选功能,如调整窗口大小、设置窗口标题等。

imshow函数的基本语法如下:

void imshow(const String& winname, InputArray mat);

参数说明:

winname:一个字符串参数,表示窗口的名称,用于标识不同的窗口。

mat:一个输入数组参数,表示要显示的图像数据,通常是一个 Mat 对象。

以下是一个示例代码,展示了如何使用imshow函数显示图像:

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
    Mat image = imread("image.jpg", IMREAD_COLOR);
    if (image.empty())
    {
        // 图像读取失败
        return -1;
    }
    namedWindow("Image", WINDOW_NORMAL); // 创建一个窗口,并设置为可调整大小
    imshow("Image", image); // 在窗口中显示图像
    waitKey(0); // 等待用户按下键盘任意键
    return 0;
}

六、imwrite函数

imwrite函数是OpenCV中用于将图像数据保存到图像文件的函数。它可以将图像数据从内存中的 Mat 对象写入到磁盘中的图像文件,并支持多种图像格式(如JPEG、PNG、BMP等)。

imwrite函数的基本语法如下:

bool imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());

参数说明:

filename:一个字符串参数,表示要保存的图像文件的路径和文件名。

img:一个输入数组参数,表示要保存的图像数据,通常是一个 Mat 对象。

params:一个可选的整数向量参数,用于指定特定的文件保存选项。

下面是一个示例代码,演示了如何使用imwrite函数将图像数据保存为图像文件:

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
    Mat image = imread("image.jpg", IMREAD_COLOR);
    if (image.empty())
    {
        // 图像读取失败
        return -1;
    }
    bool success = imwrite("new_image.jpg", image);
    if (success)
    {
        printf("图像保存成功\n");
    }
    else
    {
        printf("图像保存失败\n");
    }
    return 0;
}

在上述示例代码中,我们首先使用imread函数将名为 “image.jpg” 的图像文件加载为 Mat 对象。然后,我们使用imwrite函数将该图像保存为 “new_image.jpg” 的图像文件。imwrite函数返回一个布尔值,表示保存操作是否成功。我们可以根据返回值输出相应的结果。

注意:在使用imwrite函数保存图像时,需要确保指定的文件名和路径是有效的,并且具有适当的文件扩展名以匹配所需的图像格式。否则,保存操作可能无法成功。

总结一下,imwrite函数是OpenCV中用于将图像数据保存到图像文件的函数。通过传入图像数据和文件路径作为参数,可以将图像数据写入磁盘中的图像文件,并指定保存选项(可选)。函数将返回一个布尔值,表示保存操作是否成功。

总结

本篇文章主要讲解了一些opencv常用的函数,大家可以去使用这些函数来完成图片的显示和颜色的读取等功能。


相关文章
|
6月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
77 0
|
计算机视觉
OpenCV-图像翻转函数cv::filp
OpenCV-图像翻转函数cv::filp
119 0
|
6月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
104 0
|
计算机视觉 C++
OpenCV-计时函数cv::getTickCount&cv::getTickFrequency
OpenCV-计时函数cv::getTickCount&cv::getTickFrequency
173 0
|
1月前
|
算法 计算机视觉
Opencv学习笔记(六):cv2.resize函数的介绍
这篇文章介绍了OpenCV库中cv2.resize函数的使用方法,包括其参数、插值方式选择以及实际代码示例。
260 1
Opencv学习笔记(六):cv2.resize函数的介绍
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
341 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
计算机视觉
OpenCV滑动条(createTrackbar()函数)如何在多个维度进行同步调整?
这篇文章介绍了如何在OpenCV中使用`createTrackbar()`函数创建多个滑动条以同步调整图像的多个维度(如亮度和对比度),通过将不同滑动条的回调函数合并为一个,确保它们在同一图像基础上进行调整。
|
4月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
6月前
|
监控 算法 Serverless
OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析
OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析
143 0
|
6月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
80 0