OPENCV的AT函数

发布于:2025-06-08 ⋅ 阅读:(15) ⋅ 点赞:(0)

一.AT函数介绍

在 OpenCV 中,at() 是一个模板成员函数,用于访问和修改矩阵或图像中特定位置的元素。它提供了一种直接且类型安全的方式来操作单个像素值,但需要注意其性能和类型匹配问题

AT函数是OPENCV中重要的函数之一,它的作用是修改Mat的矩阵某个像素值,也就是我们要修改图像中的像素点就需要利用AT函数去获取并且修改,AT函数的修改一般需要循环cols和rows。然后对每个像素点进行修改。

二.代码的使用

下面这段代码的作用是调整图像中每个像素的颜色值,以此改变图像的整体色调

Mat mat = imread("frame1.jpg");

    //循环cols
    for (int i = 0; i < mat.rows; i++)
    {
        //循环rows
        for (int j = 0; j < mat.cols; j++)
        {
            mat.at<Vec3b>(i,j)[0] = (int)mat.at<Vec3b>(i,j)[0] - 10; //R Channel
            mat.at<Vec3b>(i,j)[1] = (int)mat.at<Vec3b>(i,j)[1] - 50; //G Channel
            mat.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。

这样处理后,图像整体会呈现出偏红的色调,因为绿色通道被大幅削弱了。

1.Vec3b 解析

在 OpenCV 里,Vec3b 代表一个由 3 个字节(Byte)构成的向量,它对应着彩色图像中某个像素的三个通道。这里采用的是 BGR 通道顺序,并非 RGB:

Vec3b 是 OpenCV 中用于表示短向量的模板类,它的完整定义是 Vec<uchar, 3>,也就是包含 3 个无符号字符(unsigned char)的向量。在图像处理方面,它有以下特点:

  1. 每个通道的数值范围是 0 - 255。
  2. 适合表示 8 位无符号的 BGR 图像。
  3. 可以通过索引 [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); // B
            image.at<Vec3b>(i,j)[1] = max(0, image.at<Vec3b>(i,j)[1] - 50); // G
            image.at<Vec3b>(i,j)[2] = max(0, image.at<Vec3b>(i,j)[2] - 10); // R
        }
    }

    // 保存处理后的图像
    imwrite("output.jpg", image);
    cout << "图像处理完成!" << endl;

    return 0;
}

 2.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函数对其像素进行改变。


网站公告

今日签到

点亮在社区的每一天
去签到