OpenCV基本操作
OpenCV的大部分函数都是在cv的命名空间,所以在每个使用OpenCV函数的cpp文件头(不建议将命名空间的引入写在.h文件)部加上一句usingnamespacecv;但是,在实际应用的过程当中,我们发现,为了更加凸显出我们所以调用的函数来自于OpenCV,我们建议的写法是在函数、类、结构体等的前面显示地加入命名空间。例如:
cv::MatmatSrc;cv::RectrcROI;cv::PointptPosition;
1、图像的读写与显示1.1图像的载入
在OpenCV支持C++接口以后,图像的管理由Mat类进行实现。所以,在OpenCV中,所有的图像都可以用Mat对象来存。读取一副图像的函数由imread函数实现。imread函数原形为:
CV_EXPORTS_WMatimread(conststring&filename,intflags=1);
filename参数表示:图像的名称。OpenCV支持的图像类型如下:
Windows位图-*.bmp,*.dibJPEG文件-*.jpeg,*.jpg,*.jpeJPEG2000文件-*.jp2PNG图片-*.png
便携文件格式-*.pbm,*.pgm,*.ppmSunrasters光栅文件-*.sr,*.rasTIFF文件-*.tiff,*.tif
flagship参数表示:读取的参数,默认为1。枚举声明如下:
enum{
IMREAD_UNCHANGED=-1,IMREAD_GRAYSCALE=0,IMREAD_COLORIMREAD_ANYDEPTHIMREAD_ANYCOLOR};
IMREAD_UNCHANGED:表示不对图像进行任何处理,按照原始图像类型将图像载入。IMREAD_GRAYSCALE:表示总是将真彩图像转化为灰度图像进行载入。
IMREAD_ANYDEPTH:表示不改变原始图像的位宽。比如32位深度图像载入便是相应的深度
=1,=2,=4
图像。
IMREAD_ANYCOLOR:表示总是以真彩模式将图像载入。
实例:
1.2图像的显示
OpenCV矩阵的显示函数的调用有两种方式:一是提前建立显示窗口,然后再调用显示函数;二是直接调用显示函数。矩阵的显示按照显示比例可分为:1:1原图显示和自适应窗体大小显示。
创建窗口函数原形如下:
CV_EXPORTS_WvoidnamedWindow(conststring&winname,intflags=WINDOW_AUTOSIZE);
其中,winname表示窗体名字,nflags表示显示的比例,对应的枚举变量声明为:WINDOW_NORMAL:用户可以改变窗口大小,图像将自动填满窗体WINDOW_AUTOSIZE:用户不能改变窗体大小,1:1进行显示(默认值)WINDOW_OPENGL:支持OpenGL窗体图像显示函数原形如下:
CV_EXPORTS_Wvoidimshow(conststring&winname,InputArraymat);
其中,winname表示窗体名字,mat表示你将要显示的矩阵。imshow函数对图像数据的缩放功能取决于图像的深度:
如果图像是8位无符号类型(8-bitunsigned),就按照原始灰度值进行映射。如果图像是16位无符号类型(16-bitunsigned)或32位整型(32-bitinteger),像素值除以256。
如果图像是32位浮点型(32-bitfloating-point),像素值乘以255。
PS:当不预先建立窗体,直接调用显示函数,将以1:1的方式进行展示。
1.3图像的保存
OpenCV的图像保存函数原形声明如下:
CV_EXPORTS_Wboolimwrite(conststring&filename,InputArrayimg,
constvector¶ms=vector());其中:参数filename为所需保存图像的文件名。文件名需要带有图像格式后缀的,目前OpenCV该函数只支持JPEG,PNG,PPM,PGM,TIIF等。
参数img为图像数据。目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit
和16bit无符号(即CV_16U)。
参数params是用来设置对应图片格式的压缩参数,默认为空。
2、图像的基本属性
(1)图像宽和高对应Mat的成员变量为:cols和rows。(2)图像通道数由Mat的channels()方法返回,改方法无参数。
(3)图像的数据地址对应Mat的data成员变量。(4)图像的行字节数对应Matd的Step[0]成员变量。(5)图像内存是否连续对应Mat的isContinuous()方法。实例:
3、图像的数据访问(遍历)
1、指针访问
通过data成员变量获取图像数据内存地址,通过step[0]成员变量计算出数据的行首地址实现如下:
2、.at()模板函数访问
Mat类提供了可以根据行列坐标信息对矩阵进行访问的操作,该函数是一个模板函数,需要闯入数据类型进行实例化。实现如下:
matSrcColor.at(i,j)=0;其中,i表示行号,j表示列号。Vec3b表示数据类型,解释如下:
常见图像数据类型,与传人符号如下:
3、迭代器访问
4、建议
介于图像处理算法计算量大的缘故,小编建议选择指针访问图像数据,虽然麻烦,但是非常高效。
关注微信公众号:图像大师,更多干货。扫一扫: