首先感谢@浅墨_毛星云,本篇博文是小武通过学习@浅墨_毛星云的博客以及书籍《opencv3.0编程入门》整理的笔记及疑问心得,小武水平有限,欢迎交流。
@浅墨_毛星云博文:https://blog.csdn.net/poem_qianmo/article/category/1923021
一、常用函数
1、点的表示:Point 类;
2、颜色的表示:Scalar类:
Scalar( a, b, c )
我们将定义一个基准色如: Blue = a, Green = b and Red = c
3、尺寸的表示:Size类;
4、矩形的表示:Rect类;
5、颜色空间转换:cvtColor()函数;
6、指定一个序列中的连续子序列:Range类,Range::all() 表示全部序列,Range(a,b);
7、批量进行元素查找,扫描和操作图像:LUT();
8、计时函数:getTickcount()和getTickFrequency;
9、分离色彩通道:split (); 合并色彩通道:merge()。
二、访问图像中像素的三种方法
1、指针(高效):返回图像任一行的首地址:ptr类(是一个模板类)。如:Image.ptr<uchar>(i),读取第i行首地址;
uchar* data=Image.ptr<uchar>(i)
data[j] 则为第i行第j列的元素;
2、迭代器(interator)(不会出现越界):
Mat_<Vec3b>::interator img_begain=Img.begin<Vec3b>();//获取开始位置
Mat_<Vec3b>::interator img_end=Img.end<Vec3b>();//获取终止位置
for(;Img.begin!=Img.end;++Img.begin)
{
//处理每个像素
(*Img.begin)[0]=(*Img.begin)[0]/div*div+div/2;蓝
(*Img.begin)[1]=(*Img.begin)[1]/div*div+div/2;绿
(*Img.begin)[2]=(*Img.begin)[2]/div*div+div/2;红
}
3、动态地址计算(耗时,直观简单):at
IMG.at<uchar>(i,j)=val,表示单通道,第i行第j列元素;IMG.at<Vec3b>(i,j)[channel]=val,表示多通道(channel:0表示蓝,1表示绿,2表示红),第i行第j列元素。
三、ROI(感兴趣区域)
如:Mat imageROI=Source_Img(Rect(left_up_x,left_up_y,Logo_img.cols,Logo_img.rows));
left_up_x,left_up_y表示矩形左上角开始元素的坐标。