OPENCV的AT函数
一.AT函数介绍
在 OpenCV 中,at()
是一个模板成员函数,用于访问和修改矩阵或图像中特定位置的元素。它提供了一种直接且类型安全的方式来操作单个像素值,但需要注意其性能和类型匹配问题
AT函数是OPENCV中重要的函数之一,它的作用是修改Mat的矩阵某个像素值,也就是我们要修改图像中的像素点就需要利用AT函数去获取并且修改,AT函数的修改一般需要循环cols和rows。然后对每个像素点进行修改。
下面这段代码的作用是调整图像中每个像素的颜色值,以此改变图像的整体色调
Mat mat = imread("frame1.jpg");//循环colsfor (int i = 0; i < mat.rows; i++){//循环rowsfor (int j = 0; j < mat.cols; j++){mat.at<Vec3b>(i,j)[0] = (int)mat.at<Vec3b>(i,j)[0] - 10; //R Channelmat.at<Vec3b>(i,j)[1] = (int)mat.at<Vec3b>(i,j)[1] - 50; //G Channelmat.at<Vec3b>(i,j)[2] = (int)mat.at<Vec3b>(i,j)[2] - 10; //B Channel}}imwrite("frame1_process.jpg", mat);
mat.at<Vec3b>(i,j)[0]
是蓝色(B)通道。
mat.at<Vec3b>(i,j)[1]
为绿色(G)通道。
mat.at<Vec3b>(i,j)[2]
是红色(R)通道。
此代码对每个通道进行了不同程度的减法操作:
蓝色通道数值减少 10。
绿色通道数值减少 50。
红色通道数值减少 10。
这样处理后,图像整体会呈现出偏红的色调,因为绿色通道被大幅削弱了。
Vec3b 解析
在 OpenCV 里,Vec3b
代表一个由 3 个字节(Byte)构成的向量,它对应着彩色图像中某个像素的三个通道。这里采用的是 BGR 通道顺序,并非 RGB:
Vec3b
是 OpenCV 中用于表示短向量的模板类,它的完整定义是 Vec<uchar, 3>
,也就是包含 3 个无符号字符(unsigned char)的向量。在图像处理方面,它有以下特点:
- 每个通道的数值范围是 0 - 255。
- 适合表示 8 位无符号的 BGR 图像。
- 可以通过索引
[0]
、[1]
、[2]
来访问对应的通道。
下面是完整代码案例
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取图像Mat image = imread("input.jpg");if (image.empty()) {cout << "无法读取图像!" << endl;return -1;}// 遍历每个像素并调整颜色for (int i = 0; i < image.rows; i++) {for (int j = 0; j < image.cols; j++) {// 这里的代码会降低绿色通道的值,让图像偏红image.at<Vec3b>(i,j)[0] = max(0, image.at<Vec3b>(i,j)[0] - 10); // Bimage.at<Vec3b>(i,j)[1] = max(0, image.at<Vec3b>(i,j)[1] - 50); // Gimage.at<Vec3b>(i,j)[2] = max(0, image.at<Vec3b>(i,j)[2] - 10); // R}}// 保存处理后的图像imwrite("output.jpg", image);cout << "图像处理完成!" << endl;return 0;
}
cvtColor函数
cvtColor是 OpenCV 中用于颜色空间转换的核心函数,可实现不同色彩模式(如 RGB、HSV、灰度图等)之间的相互转换。下面为你详细介绍其作用和使用方法:
void cvtColor(InputArray src, // 输入图像OutputArray dst, // 输出图像int code, // 颜色转换代码(如 COLOR_BGR2GRAY)int dstCn = 0); // 目标图像的通道数(0 表示自动推导)
转换代码 作用
COLOR_BGR2GRAY BGR → 灰度图
COLOR_BGR2RGB BGR → RGB(通道顺序调整)
COLOR_BGR2HSV BGR → HSV(色调、饱和度、亮度)
COLOR_BGR2YCrCb BGR → YCrCb(亮度 + 色度)
COLOR_GRAY2BGR 灰度图 → BGR
COLOR_RGBA2RGB RGBA → RGB(去除透明度通道)
如下是对单通道的mat图像转成灰度图,之后用at函数对其像素进行改变。