C++opencv-像素操作_灰度

在Windows下,RGB存储的顺序为BGR

方法一

#include <opencv2/opencv.hpp> 

int main()
{

cv::Mat img = cv::imread("./tu/马.jpg", cv::IMREAD_UNCHANGED);

size_t rr=200, c=100;//rr 行号,c 列号
cv::Vec3b& bgr = img.at<cv::Vec3b>(rr, c); //返回指定行列的像素
/*
图像类型:
cv::Vec3b 三通道彩色(8位)
unsigned char 单通道灰度
unsigned short 16位灰度
float 32位浮点型
cv::Vec2f 双通道32位
*/

int b = int(bgr[0]);//提取B通道的数据
//bgr[0] 的数据类型是unsigned char

//bgr[0]=0; //修改B通道的数据
int g = int(bgr[1]); //提取G通道的数据
int r = int(bgr[2]); //提取R通道的数据

std::cout << typeid(bgr[0]).name() << b << "," << g << "," << r << std::endl;

}

方法二:指针法

#include <opencv2/opencv.hpp> 

int main()
{

cv::Mat img = cv::imread("./tu/马.jpg", cv::IMREAD_UNCHANGED);

size_t r=200, c=100;//rr 行号,c 列号

int x = img.step[0];//返回图像一行的字节数
//x=图像的宽*通道数

unsigned char* pRow = img.data + r * img.step[0];//计算图像指定行行首指针
//r 行号
//img.data 返回图像的首地址
unsigned char rr;
rr = pRow[3 * c + 2]; //返回r行c列像素的R通道的数据
x = int(rr);
//pRow[3 * c + 2]=0; //修改r行c列像素的R通道的数据
std::cout << x<< std::endl;

}