初学opencv c++学习笔记图像的相关操作及属性
Posted 努力码代码的菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初学opencv c++学习笔记图像的相关操作及属性相关的知识,希望对你有一定的参考价值。
内容涉及到图像读取的at()操作,图像的拆分和合并的参数解释和代码,以及一些常用的图像属性的内置函数。
提示:以下是本篇文章正文内容,下面案例可供参考
一、图像的读写操作at()函数
apI:at()
单通道图像:img.at<uchar>(i,j)
表示在第i行,第j列的像素值
多通道图像:img.at<Vec3b>(i,j)[c]
表示在某个通道中第i行,第j列的像素值
- <>中为图像元素的类型。uchar为无符号字符型,Vec3b等于vector<uchar,3>,表示一个uchar类型的数组,长度为3。
- (i,j)指像素点的位置。
- [c]表示通道。RGB图像,由于opencv中按照BGR顺序,所以[0],[1],[2]分别表示B,G,R通道。
二、图像通道的拆分与合并
apl:split()
1.通道拆分
官方定义:
void split(InputArray m, OutputArrayOfArrays mv);
参数解释:
(1) m : 输入的多通道图像,对该图像进行通道的拆分。
(2) mv : 存放图像拆分后的三个通道的灰度图像的容器。mv为图像数组,使用vector容器。
代码演示:
#include <opencv2/imgcodecs.hpp> //imread
#include <opencv2/highgui.hpp> //imshow waitKey
using namespace std;
using namespace cv;
int main()
vector<Mat> channels;//声明vector,作为分离后三个通道的图像的保存容器
Mat img = imread("C:/r/bear.jpg");//读取图片
split(img,channels);//使用split()函数,分离img的B.G.R三个通道
Mat B = channels.at(0);//下标读取 默认顺序B-G-R
Mat G = channels.at(1);
Mat R = channels.at(2);
imshow("原图", img);//显示原图
imshow("blue", B); //显示三通道图像
imshow("green", G);
imshow("red", R);
waitKey(0);
return 0;
分离后的三个通道的图像为灰度图像,表示强度
2.通道合并
apl:merge()
官方定义:
void merge(InputArrayOfArrays mv, OutputArray dst);
参数解释:
(1)mv : 同通道的拆分。为拆分后的多通道的图像数组。
(2)dst : 存放合并后的图像。
代码演示:
#include <opencv2/imgcodecs.hpp> //imread
#include <opencv2/highgui.hpp> //imshow waitKey
using namespace std;
using namespace cv;
int main()
vector<Mat> channels;//声明vector,作为分离后三个通道的图像的保存容器
Mat img = imread("C:/r/bear.jpg");//读取图片
split(img,channels);//使用split()函数,分离img的B.G.R三个通道
Mat dst;
merge( channels,dst);//合并三通道
imshow("outPutArray", dst);//展示合并后的熊大
waitKey(0);
return 0;
三、图像的属性
下面进行列举
1.列举解释
-
src.size() 返回图像尺寸
size中的参数先宽度(width)后高度(height)
src.size().width == src.cols (宽度==列)
src.size().heght == src.rows (高度==行)
-
src.depth() 返回深度
度量每一个像素每一个通道的精度,位数(bit)(0~6)
数值越大,精度越高
- src.channels() 返回通道数
- src.elemSize() 返回一个元素所占的字节数
一个元素单通道的字节数 * 通道数
- src.elemSize1() 返回一个元素单通道的所占字节数
src.elemSize1()==src.elemSize() / src.channels()
- src.total() 返回像素总数
- src.step 返回每一行的步长(字节数) 每一行所有元素的字节总量
src.step==宽度*通道数
- src.step1()
src.step1() == e1()src.step / src.elemSize1()
- src.step [0] 一行元素的字节数
- src.step [1] 一个元素的字节数
- src.step1 (0) 一行元素的通道数
- src.step1 (1) 一个元素的通道数
- src.isContinuous() 判断src是否在内存上连续
src.isContinuous()?"true":"false"
- src.isSubmatrix() 判断src是否为子矩阵
- src.type() 元素类型以及矩阵的通道个数
2.表格汇总
apl | 返回值 |
src.size() | 图像尺寸 |
src.depth() | 图像深度id |
src.channels() | 预想通道数 |
src.elemSize() | 一个元素所占字节数 |
src.elemSize1() | 一个元素单通道的所占字节数 |
src.total() | 像素总数 |
src.step | 每一行的步长(字节数) |
src.step1() | |
src.step [0] | 一行元素的字节数 |
src.step [1] | 一个元素的字节数 |
src.step1 (0) | 一行元素的通道数 |
src.step1 (1) | 一个元素的通道数 |
src.isContinuous() | 判断src是否在内存上连续 |
src.isSubmatrix() | 判断src是否为子矩阵 |
src.type() | 元素类型以及矩阵的通道个数 |
总结
以上就是今天的笔记,内容涉及到图像读取的at()操作,图像的拆分和合并的参数解释和代码,以及一些常用的图像属性的内置函数。
以上是关于初学opencv c++学习笔记图像的相关操作及属性的主要内容,如果未能解决你的问题,请参考以下文章