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常用的函数,大家可以去使用这些函数来完成图片的显示和颜色的读取等功能。


相关文章
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
52 0
|
9月前
|
计算机视觉
OpenCV-图像翻转函数cv::filp
OpenCV-图像翻转函数cv::filp
|
2月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
61 0
|
9月前
|
计算机视觉 C++
OpenCV-计时函数cv::getTickCount&cv::getTickFrequency
OpenCV-计时函数cv::getTickCount&cv::getTickFrequency
|
2月前
|
监控 算法 Serverless
OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析
OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析
75 0
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
57 0
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.4、基础标识绘制(绘制线line函数、rectangle函数绘制四边形、circle函数绘制圆形、putText函数绘制文字、putText绘制中文文字)
OpenCV这么简单为啥不学——1.4、基础标识绘制(绘制线line函数、rectangle函数绘制四边形、circle函数绘制圆形、putText函数绘制文字、putText绘制中文文字)
38 0
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——2、逐帧播放视频(VideoCapture函数、waitKey函数、0xFF == ord(‘1‘))
OpenCV这么简单为啥不学——2、逐帧播放视频(VideoCapture函数、waitKey函数、0xFF == ord(‘1‘))
40 0
|
2月前
|
监控 API 图形学
OpenCV这么简单为啥不学——1、基础环境与imread函数
OpenCV这么简单为啥不学——1、基础环境与imread函数
38 0
|
2月前
|
计算机视觉 Python
OpenCV中阈值处理函数和二值化、反二值化的讲解及实战(附Python源码)
OpenCV中阈值处理函数和二值化、反二值化的讲解及实战(附Python源码)
160 0