前言
本篇文章带大家来学习一下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常用的函数,大家可以去使用这些函数来完成图片的显示和颜色的读取等功能。