opencv学习(2)之图像像素操作 像素运算 滚动 键盘
打开一个图像,然后可以通过下标去获取像素,也可以通过指针去获取。下面分别介绍。
·
0.前言
打开一个图像,然后可以通过下标去获取像素,也可以通过指针去获取。下面分别介绍。
1.下标操作
//第一种
int dims = src.channels(); //获取通道
for(int row = 0; row < src.rows; row++){
for (int col = 0; col < src.cols; col++) {
if (dims == 1) {//灰度图
int pv = src.at<uchar>(row, col);//获取像素
}
if (dims == 3) {//彩图
Vec3b pv = src.at<Vec3b>(row, col);//获取一个点像素(三个通道)
src.at<Vec3b>(row, col)[0] == pv[0];//像素的第一个通道,两种表示
src.at<Vec3b>(row, col)[1] == pv[1];//像素的第一个通道,两种表示
src.at<Vec3b>(row, col)[2] == pv[2];//像素的第一个通道,两种表示
}
}
}
2.指针操作
//第二种----指针
for (int row = 0; row < src.rows; row++) {
//一行的指针
uchar* current_row = src.ptr<uchar>(row);
for (int col = 0; col < src.cols; col++) {
if (dims == 1) {//灰度图
int pv = *current_row;//获取像素
*current_row++ = 255 - pv;//操作像素 ++优先级高于*
}
if (dims == 3) {//彩图
*current_row++ = 255 - *current_row;//操作像素
*current_row++ = 255 - *current_row;//操作像素
*current_row++ = 255 - *current_row;//操作像素
}
}
}
3.像素运算
//src是三通道的彩图
Mat dst;
//意思就是Scalar(50, 50, 50)创建一个与src一样大小,每一个通道都是50的矩阵,进行运算
dst = src + Scalar(50, 50, 50); //变亮
dst = src - Scalar(50, 50, 50); //变暗
dst = src / Scalar(2, 2, 2); //变暗 数字(大于1)越大,越暗
//dst = src * Scalar(2, 2, 2); //变暗 数字(大于1)越大,越亮,但是有问题,会超出范围,建议使用下面这个
multiply(src, Scalar(2, 2, 2), dst); //src*Scalar(2, 2, 2)存储在dst里面
对于乘法容易超出范围,可以自己实现multiply函数,本质就是对每一个像素进行操作。
4滚动
滚动的函数是:createTrackbar("滚动条的名字","窗口的名字",滚动条初始值的变量引用,最大值,回调函数,回调函数的参数);
5.键盘响应
//键盘
//等待10ms,返回按下键的数值 如果需要一直检测,我们需要加一个循环,这个函数就是会阻塞10ms
int a = waitKey(10);
//根据 a的值进行逻辑处理
更多推荐
所有评论(0)