Mat对象的使用
代码
先上代码。
我自学的方式是先看代码,然后在代码中遇到不懂的再逐个查询资料,深入学习,直到学懂。大家按照符合自己的方式学习就好了,适合自己的才是最好的。共勉。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//读写图像
Mat src, gray_src;
src = imread("E:/minions.jpg");
if (src.empty())
{
cout << "error" << endl;
return -1;
}
namedWindow("原图", WINDOW_AUTOSIZE);
imshow("原图", src);
cvtColor(src, gray_src, COLOR_BGR2GRAY); ///将原图片转换位灰度图
namedWindow("灰度图", WINDOW_AUTOSIZE);
imshow("灰度图", gray_src);
//单通道反差图像
int width = gray_src.cols; ///分别获取gray_src 的宽度和高度
int height = gray_src.rows;
for(int row=0;row<height;row++)
for (int col = 0; col < width; col++)
{
///读取一个灰度图的像素点的像素值
///使用 img.at<uchar>(row,col)或img.at<uchar>(Point(col,row))
int gray = gray_src.at<uchar>(row, col);
gray_src.at<uchar>(row, col) = 255 - gray;//实现像素的取反
}
namedWindow("单通道反差图像", WINDOW_AUTOSIZE);
imshow("单通道反差图像", gray_src);
//三通道反差图像
Mat dst;
bitwise_not(src, dst);//实现反转数组中的每个元素的功能,与之类似还有bitwise_and、bitwise_or
namedWindow("三通道反差图像", WINDOW_AUTOSIZE);
imshow("三通道反差图像", dst);
//把CV_8UC1 转化到CV_32F1
//src.convertTo(dst,CV_32F); //dst 为CV_32F1型
waitKey(0);
return 0;
}
代码解释
之前已经解释过具体功能的代码就不进行解释了,如果想了解的话可以看下我之前的文章,毕竟咱们是在不断学习的过程中,要牢记旧知识,不断学习新知识。
//实现反转数组中的每个元素的功能,与之类似还有bitwise_and、bitwise_or
bitwise_not(src, dst);
bitwise_not(src, dst, mask)是对图像的每个像素实现二进制的“或操作”—全1则1,否则为0。其中的mask参数是可选的(mask参数是可选操作掩码,8位单通道数组,用于指定要更改的输出数组的元素):如果没有传递mask参数,则对src进行按位取反,即 dst = ~src;如果传递mask参数,则先按位取反,再按照mask进行取反。
各种处理后的结果图片对比:
可以看出进行单通道取反和三通道取反的效果。
这篇opencv的学习笔记就这样结束了。
我是一个初学者,如果有相关的问题大家可以评论提出一起讨论,或指出我的错误之处,大家一起学习,一起进步,谢谢啦。