【OpenCV】C++版本基础知识总结

文章目录

  • 前言
  • 一、Mat
  • 二、Scalar
  • 三、Point
  • 四、Rect


前言

C++ opencv总结

一、Mat

在OpenCV中,cv::Mat 是一个非常重要的类,用于表示图像或多维数组。
1.创建 Mat 对象:
通过构造函数或者赋值操作符可以创建 Mat 对象。

Mat image;  // 创建一个空的Mat对象
Mat grayImage(100, 100, CV_8UC1);  // 创建一个100x100的灰度图像
Mat colorImage(200, 200, CV_8UC3, Scalar(0, 0, 255));  // 创建一个200x200的彩色图像并初始化为红色

2.访问像素:
使用 at 方法可以访问图像的像素值。

int x = 100;
int y = 50;

// 获取该位置的像素值
cv::Vec3b pixel = image.at<cv::Vec3b>(y, x);

3.图像复制:
.使用 clone() 方法创建图像的深拷贝,或者使用赋值操作符。

Mat copyImage = originalImage.clone();  // 深拷贝
Mat anotherCopy = originalImage;  // 赋值操作,创建引用

4.图像赋值:
使用 setTo 方法可以将图像所有像素设置为指定值。

image.setTo(Scalar(255, 0, 0));  // 将图像所有像素设置为蓝色

5.通道分离和合并:
使用 split 方法可以将多通道图像分离成单通道图像,使用 merge 方法可以将单通道图像合并成多通道图像。

Mat channels[3];
split(colorImage, channels);  // 将彩色图像分离成三个通道
merge(channels, 3, colorImage);  // 将三个单通道图像合并成彩色图像

6.图像ROI(区域感兴趣):
通过定义矩形区域,可以获取图像的子区域。

Rect roi(10, 10, 50, 50);  // 定义ROI的矩形区域
Mat regionOfInterest = image(roi);  // 提取ROI

7.图像通道操作:
使用 cvtColor 可以进行颜色空间的转换,resize 可以改变图像的大小。

Mat grayImage;
cvtColor(colorImage, grayImage, COLOR_BGR2GRAY);  // 转换为灰度图像

Mat resizedImage;
resize(image, resizedImage, Size(200, 200));  // 调整图像大小

8.图像运算:
OpenCV支持各种图像运算,如加法、减法、乘法等。

Mat result = image1 + image2;  // 图像加法
Mat difference = abs(image1 - image2);  // 图像减法

二、Scalar

cv::Scalar 是 OpenCV 中用于表示多通道数据的数据类型。通常情况下,它用于表示颜色信息,尤其是在彩色图像中。cv::Scalar 可以包含1到4个数值,分别对应于灰度图像、单通道图像、三通道图像(如BGR颜色),或四通道图像(如BGRA颜色)的通道值。
1.创建 Scalar 对象:

// 创建灰度值为 128 的 Scalar 对象
Scalar grayValue(128);

// 创建三通道颜色为 (0, 255, 0) 的 Scalar 对象
Scalar greenColor(0, 255, 0);

// 创建四通道颜色为 (0, 255, 0, 128) 的 Scalar 对象
Scalar semiTransparentGreen(0, 255, 0, 128);

2.使用 Scalar 设置图像颜色:

Mat colorImage(100, 100, CV_8UC3, Scalar(255, 0, 0));  // 创建一个蓝色的图像

3.在图像上绘制颜色:

Mat image(200, 200, CV_8UC3, Scalar(255, 255, 255));  // 创建一个白色的图像

// 在图像上绘制绿色矩形
rectangle(image, Point(50, 50), Point(150, 150), Scalar(0, 255, 0), 2);

// 在图像上绘制红色圆形
circle(image, Point(100, 100), 30, Scalar(0, 0, 255), -1);

4.Scalar 的运算:

Scalar color1(10, 20, 30);
Scalar color2(40, 50, 60);

Scalar sum = color1 + color2;  // 对应通道相加
Scalar product = color1 * 2;  // 所有通道乘以2

在处理图像时,cv::Scalar 提供了一种方便的方式来表示和操作颜色信息。它可以与其他 OpenCV 数据类型进行运算,并用于在图像上设置颜色值。

三、Point

cv::Point 是 OpenCV 中用于表示二维点的类。它主要用于在图像处理和计算机视觉应用中存储和操作二维坐标。
以下是关于 cv::Point 的一些基本信息:

1.定义:
cv::Point 是一个模板类,可以表示不同类型的二维坐标点。通常,它用于表示整数坐标点 (cv::Point_) 或浮点坐标点 (cv::Point_ 或 cv::Point_)。
2.构造函数:

cv::Point pt;          // 默认构造函数,创建一个坐标为 (0, 0) 的点
cv::Point pt(10, 20);  // 创建一个坐标为 (10, 20) 的点

3.成员变量:

int x = pt.x;  // 获取点的 x 坐标
int y = pt.y;  // 获取点的 y 坐标

4.基本操作:

cv::Point pt1(10, 20);
cv::Point pt2(5, 10);

cv::Point ptSum = pt1 + pt2;  // 点的加法
cv::Point ptDiff = pt1 - pt2; // 点的减法
cv::Point ptScaled = pt1 * 2; // 点的标量乘法

5.使用场景:
cv::Point 常用于表示图像中的像素坐标,处理图像中的兴趣区域(ROI),绘制图形和标记等。在许多 OpenCV 函数中,cv::Point 被广泛用于指定图像上的位置信息。

示例:

cv::Point pt1(100, 150);
cv::circle(image, pt1, 5, cv::Scalar(0, 255, 0), -1);  // 在图像上绘制一个半径为5的绿色实心圆

在上述示例中,cv::circle 函数使用了 cv::Point 来指定圆心的位置。
总体而言,cv::Point 是 OpenCV 中用于处理二维坐标的便捷工具,使得在图像处理中能够更容易地表示和操作点的位置信息。

四、Rect

cv::Rect 是 OpenCV 中用于表示矩形区域的类。它经常用于图像处理和计算机视觉中,用于指定感兴趣区域(Region of Interest,ROI)或在图像上执行操作的矩形。
以下是关于 cv::Rect 的一些基本信息:

1.定义:
cv::Rect 是一个模板类,用于表示二维矩形区域。它有多个构造函数,允许你通过不同的方式定义矩形。

cv::Rect rect;                   // 默认构造函数,创建一个无效的矩形
cv::Rect rect(x, y, width, height); // 创建一个矩形,左上角坐标为 (x, y),宽度为 width,高度为 height

2.成员变量:

int x = rect.x;        // 获取矩形左上角的 x 坐标
int y = rect.y;        // 获取矩形左上角的 y 坐标
int width = rect.width; // 获取矩形的宽度
int height = rect.height;// 获取矩形的高度

3.基本操作:

cv::Rect rect1(10, 20, 30, 40);
cv::Rect rect2(5, 10, 20, 30);

cv::Rect rectSum = rect1 + rect2;  // 矩形的加法
cv::Rect rectIntersection = rect1 &rect2; // 矩形的交集

4.使用场景:
cv::Rect 常用于指定图像中的感兴趣区域,裁剪图像,以及在图像上标记或绘制矩形。它在图像处理函数中作为参数使用,用于指定需要处理的区域。

示例:

cv::Mat image = cv::imread("example.jpg");
cv::Rect roi(100, 150, 200, 100);  // 定义感兴趣区域
cv::Mat croppedImage = image(roi); // 提取感兴趣区域的图像

在上述示例中,cv::Rect 用于定义感兴趣区域,并通过该区域提取了原始图像的子图像。
总体而言,cv::Rect 是 OpenCV 中用于表示矩形区域的重要类,为处理图像中的区域提供了便捷的工具。


未完待续。。。

你可能感兴趣的:(opencv,c++,人工智能)