在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; }