Opencv核心功能---图像操作

图像的读取与输出

从文件加载图像:

如果您读取jpg文件,默认情况下会创建一个3通道图像。 如果您需要灰度图像,请使用:

将图像写入文件中

访问像素的亮度值

为了获得像素亮度值,您必须知道图像的类型和通道的数量。 以下是单通道灰度图像(类型8UC1)和像素坐标x和y的示例:

intensity.val [0]包含0到255之间的值。请注意x和y的顺序。 由于在OpenCV中图像由与矩阵相同的结构表示,因此我们对两种情况使用相同的约定 - 基于0的行索引(或y坐标),而基于0的列索引(或x坐标)。 或者您可以使用以下表示法:

现在让我们考虑一个具有BGR颜色排序的3通道图像(imread返回的默认格式):

您可以对浮点图像使用相同的方法:

可以使用相同的方法来改变像素强度:

OpenCV中有一些功能,特别是来自calib3d模块的功能,例如projectPoints,它采用Mat形式的2D或3D点阵列。 矩阵应该只包含一列,每行对应一个点,矩阵类型应相应为32FC2或32FC3。 这样的矩阵可以很容易地从std :: vector构造:

可以使用相同的方法Mat :: at访问此矩阵中的点:

内存管理与引用计数

Mat是一种保持矩阵/图像特征(行和列数,数据类型等)和指向数据的指针的结构。 因此,没有什么能阻止我们将Mat的几个实例对应于相同的数据。 Mat保留一个引用计数,告知在销毁Mat的特定实例时是否必须释放数据。 以下是在不复制数据的情况下创建两个矩阵的示例:

结果我们得到一个32FC1矩阵,有3列而不是32FC3矩阵,有1列。 pointsMat使用来自点的数据,并且在销毁时不会释放内存。 但是,在这个特定的实例中,开发人员必须确保点的生命周期长于pointsMat。 如果我们需要复制数据,可以使用例如cv :: Mat :: copyTo或cv :: Mat :: clone来完成:

与C API相反,其中必须由开发者创建输出图像,可以向每个函数提供空输出Mat。 每个实现都调用Mat :: create作为目标矩阵。 如果矩阵为空,则此方法为矩阵分配数据。 如果它不是空的并且具有正确的大小和类型,则该方法不执行任何操作。 但是,如果大小或类型与输入参数不同,则会释放(并丢失)数据并分配新数据。 例如:

原始操作

在矩阵上定义了许多方便的运算符。 例如,以下是我们如何从现有的灰度图像`img`制作黑色图像:

选择感兴趣的区域:

从Mat到C API数据结构的转换:

请注意,此处没有数据复制。

从彩色到灰度的转换:

将图像类型从8UC1更改为32FC1:

可视化图像

在开发过程中查看算法的中间结果非常有用。 OpenCV提供了一种可视化图像的便捷方式。 可以使用以下方式显示8U图像:

对waitKey()的调用启动一个消息传递周期,等待“图像”窗口中的键击。 需要将32F图像转换为8U类型。 

猜你喜欢

转载自blog.csdn.net/LYKymy/article/details/83119651