1--前言
之前的笔记总结了 OpenCV 中 Mat对象的三种遍历方式,今天复习的时候觉得需要加强一种遍历方式的使用即可,最终敲定使用 at 接口进行遍历的编程习惯;
2--遍历代码
#include "opencv2/opencv.hpp"
int main(int argc, char *argv[]){
cv::Mat image = cv::imread("../docker.png");
cv::imshow("window1", image);
// 遍历RGB图
for(int row = 0; row < image.rows; row++){
for(int col = 0; col < image.cols; col++){
image.at<cv::Vec3b>(row, col)[0] = 255 - image.at<cv::Vec3b>(row, col)[0]; // B
image.at<cv::Vec3b>(row, col)[1] = 255 - image.at<cv::Vec3b>(row, col)[1]; // G
image.at<cv::Vec3b>(row, col)[2] = 255 - image.at<cv::Vec3b>(row, col)[2]; // R
}
}
cv::imshow("window2", image);
// 灰度化
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
cv::imshow("window3", gray);
// 遍历灰度图
for(int row = 0; row < image.rows; row++){
for(int col = 0; col < image.cols; col++){
gray.at<uchar>(row, col) = 255 - gray.at<uchar>(row, col);
}
}
cv::imshow("window4", gray);
cv::waitKey(0);
return 0;
}
需要说明的是:遍历 RGB 彩色图时,模板使用 cv::Vec3b,而遍历灰度图时,模板采用 uchar 类型即可;
测试图片的运行结果如下: