【OpenCV教程】对图像的各种常用操作

@TOC


1.图片读取

CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
enum ImreadModes {

       IMREAD_UNCHANGED            = -1, 
//!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation.

       IMREAD_GRAYSCALE            = 0,  
//!< If set, always convert image to the single channel grayscale image (codec internal conversion).

       IMREAD_COLOR                = 1,  
//!< If set, always convert image to the 3 channel BGR color image.

       IMREAD_ANYDEPTH             = 2,  
//!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.

       IMREAD_ANYCOLOR             = 4,  
//!< If set, the image is read in any possible color format.

       IMREAD_LOAD_GDAL            = 8,  
//!< If set, use the gdal driver for loading the image.

       IMREAD_REDUCED_GRAYSCALE_2  = 16, 
//!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.

       IMREAD_REDUCED_COLOR_2      = 17, 
//!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.

       IMREAD_REDUCED_GRAYSCALE_4  = 32, 
//!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.

       IMREAD_REDUCED_COLOR_4      = 33, 
//!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.

       IMREAD_REDUCED_GRAYSCALE_8  = 64, 
//!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.

       IMREAD_REDUCED_COLOR_8      = 65, 
//!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.

       IMREAD_IGNORE_ORIENTATION   = 128 
//!< If set, do not rotate the image according to EXIF's orientation flag.
     };

2.创建窗口

  • 参数如下

参数
含义

winname(window name)

窗体名

3.图片显示

  • 参数如下

参数
含义

winname(window name)

窗体名

mat

输入的欲显示的图片

  • 若窗体未创建,会自动进行创建

控制图片的展示时间,如设置delay=0,则表示一直展示,按SPACE停止展示

如设置delay不为0,则表示停留delay毫秒

4.图片保存

  • 参数如下

参数
含义

filename

保存的文件名

img(image)

要保存的图片

5.视频输入输出

5.1 filename

  • 影片档案名称(例如video.avi)

  • 图片序列(例如img_%02d.jpg,将读取像这样的样本img_00.jpg, img_01.jpg, img_02.jpg, …)

  • 视频流的网址(例如protocol://host:port/script_name?script_params|auth)。请注意,每个视频流或IP摄像机源均具有其自己的URL方案。请参考源流的文档以了解正确的URL。

5.2 index

  • 要打开的视频捕获设备的ID。要使用默认后端打开默认摄像头,只需传递0。

  • 当apiPreference为CAP_ANY时,使用camera_id + domain_offset(CAP_ *)向后兼容有效。

5.3 fourcc

  • 用于编码视频文件的编码器,通过VideoWriter::fourcc函数获得

  • 参数如下

代码
含义

VideoWriter::fourcc('P','I','M','1')

MPEG-1编码,输出文件拓展名avi

VideoWriter::fourcc('X','V','I','D')

MPEG-4编码,输出文件拓展名avi

VideoWriter::fourcc('M','P','4','V')

旧MPEG-4编码,输出文件拓展名avi

VideoWriter::fourcc('I','4','2','0')

YUV编码,输出文件拓展名avi

VideoWriter::fourcc('X','2','6','4')

MPEG-4编码,输出文件拓展名mp4

VideoWriter::fourcc('T','H','E','O')

ogg vorbis编码,输出文件拓展名ogv

VideoWriter::fourcc('F',L','V','1')

flash video编码,输出文件拓展名flv

5.4 apiPreference(not important)

首选使用的Capture API后端。如果有多个可用的读取器实现,则可以用于实施特定的读取器实现。

设置读取的摄像头编号,默认CAP_ANY=0,自动检测摄像头。多个摄像头时,使用索引0,1,2,…进行编号调用摄像头。 apiPreference = -1时单独出现窗口,选取相应编号摄像头。

5.5 演示

6.通道分离与合并

6.1 分离

API(一)

  • 参数如下

参数
含义

src(source)

输入图像

mvbegin(mat vector begin)

分离后的Mat数组的地址

API(二)

  • 参数如下

参数
含义

m(mat)

输入图像

mv(mat vector)

分离后的的Mat数组,可以使用STL容器vector。

6.2 合并

API(一)

  • 参数如下

参数
含义

mv(mat vector)

欲合并的图像数组的地址

count

欲合并的图像的个数

dst(destination)

输出图片

API(二)

  • 参数如下

参数
含义

mv(mat vector)

欲合并的图像数组,可以使用STL容器vector。

dst(destination)

输出图片

7.图片色彩模式转换

7.1 API

  • 参数如下

参数
含义

src(source)

源图像

dst(destination)

输出图片

code

转换码

7.2 转换类型和转换码

  • RGB和BGR(opencv默认的彩色图像的颜色空间是BGR)颜色空间的转换

cv::COLOR_BGR2RGB

cv::COLOR_RGB2BGR

cv::COLOR_RGBA2BGRA

cv::COLOR_BGRA2RGBA

  • 向RGB和BGR图像中增添alpha通道

cv::COLOR_RGB2RGBA

cv::COLOR_BGR2BGRA

  • 从RGB和BGR图像中去除alpha通道

cv::COLOR_RGBA2RGB

cv::COLOR_BGRA2BGR

  • 从RBG和BGR颜色空间转换到灰度空间

cv::COLOR_RGB2GRAY

cv::COLOR_BGR2GRAY

cv::COLOR_RGBA2GRAY

cv::COLOR_BGRA2GRAY

  • 从灰度空间转换到RGB和BGR颜色空间

cv::COLOR_GRAY2RGB

cv::COLOR_GRAY2BGR

cv::COLOR_GRAY2RGBA

cv::COLOR_GRAY2BGRA

  • RGB和BGR颜色空间与BGR565颜色空间之间的转换

cv::COLOR_RGB2BGR565

cv::COLOR_BGR2BGR565

cv::COLOR_BGR5652RGB

cv::COLOR_BGR5652BGR

cv::COLOR_RGBA2BGR565

cv::COLOR_BGRA2BGR565

cv::COLOR_BGR5652RGBA

cv::COLOR_BGR5652BGRA

  • 灰度空间与BGR565之间的转换

cv::COLOR_GRAY2BGR555

cv::COLOR_BGR5552GRAY

  • RGB和BGR颜色空间与CIE XYZ之间的转换

cv::COLOR_RGB2XYZ

cv::COLOR_BGR2XYZ

cv::COLOR_XYZ2RGB

cv::COLOR_XYZ2BGR

  • RGB和BGR颜色空间与uma色度(YCrCb空间)之间的转换

cv::COLOR_RGB2YCrCb

cv::COLOR_BGR2YCrCb

cv::COLOR_YCrCb2RGB

cv::COLOR_YCrCb2BGR

  • RGB和BGR颜色空间与HSV颜色空间之间的相互转换

cv::COLOR_RGB2HSV

cv::COLOR_BGR2HSV

cv::COLOR_HSV2RGB

cv::COLOR_HSV2BGR

  • RGB和BGR颜色空间与HLS颜色空间之间的相互转换

cv::COLOR_RGB2HLS

cv::COLOR_BGR2HLS

cv::COLOR_HLS2RGB

cv::COLOR_HLS2BGR

  • RGB和BGR颜色空间与CIE Lab颜色空间之间的相互转换

cv::COLOR_RGB2Lab

cv::COLOR_BGR2Lab

cv::COLOR_Lab2RGB

cv::COLOR_Lab2BGR

  • RGB和BGR颜色空间与CIE Luv颜色空间之间的相互转换

cv::COLOR_RGB2Luv

cv::COLOR_BGR2Luv

cv::COLOR_Luv2RGB

cv::COLOR_Luv2BGR

  • Bayer格式(raw data)向RGB或BGR颜色空间的转换

cv::COLOR_BayerBG2RGB

cv::COLOR_BayerGB2RGB

cv::COLOR_BayerRG2RGB

cv::COLOR_BayerGR2RGB

cv::COLOR_BayerBG2BGR

cv::COLOR_BayerGB2BGR

cv::COLOR_BayerRG2BGR

cv::COLOR_BayerGR2BGR

8.改变图片的对比度和亮度

8.1 概述

a:控制对比度增益

b:控制亮度增益

8.2 手动(使用saturate_cast函数确保输出值不溢出范围)

8.3 API

  • 参数如下

参数
含义

m(mat)

输出图片

rtype(result type)

输出图片的深度,-1表示与原图一致

alpha

对应系数

beta

对应常数

  • 不能进行原地运算

8.4 效果

可以看到效果是一样的

9.图片混合

  • 参数如下

参数
含义

src(source1)

输入图片1

alpha

src1的权重

src2(source2)

输入图片2

beta

src2的权重

gamma

额外的增量

dst(destination)

输出图片

dtype(destination type)

输出图片的数据类型,-1表示与输入图片一致

10.图片尺寸调整

  • 参数如下

参数
含义

src(source)

输入图片

dsize(destination size)

输出图片的尺寸

fx

x方向(width方向)的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算

fy

y方向(height方向)的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算

interpolation

插值算法的选择

10.1 插值算法(not important)

10.2 注意事项

使用注意事项:

  • dsize和fx/fy不能同时为0

  1. 指定dsize的值,让fx和fy空置直接使用默认值。

  2. 让dsize为0,指定好fx和fy的值,比如fx=fy=0.5,那么就相当于把原图两个方向缩小一倍。

11.图像金字塔(常用于神经网络的池化层,对图像进行成倍的放大或缩小)

  • 参数如下

参数
含义

src(source)

输入图片

dst(destination)

输出图片

dstsize(destination size)

输出图片的尺寸,默认自动调整

borderType

边界填充方式,默认为黑边。如果没有设置dstsize,则不会出现黑边,因为已经进行了自动调整

12.二值化(对灰度图)

  • 参数如下

参数
含义

src(source)

输入图片

dst(destination)

输出图片

thresh(threshold)

阈值

maxval(max value)

最大值

type

阈值类型

12.1 阈值类型

阈值二值化(Threshold Binary)

  首先指定像素的灰度值的阈值,遍历图像中像素值,如果像素的灰度值大于这个阈值,则将这个像素设置为最大像素值(8位灰度值最大为255);若像素的灰度值小于阈值,则将该像素点像素值赋值为0。公式以及示意图如下:

阈值反二值化(Threshold Binary Inverted)

  首先也要指定一个阈值,不同的是在对图像进行阈值化操作时与阈值二值化相反,当像素的灰度值超过这个阈值的时候为该像素点赋值为0;当该像素的灰度值低于该阈值时赋值为最大值。公式及示意图如下:

截断(Truncate)

  给定像素值阈值,在图像中像素的灰度值大于该阈值的像素点被设置为该阈值,而小于该阈值的像素值保持不变。公式以及示意图如下:

阈值取零(Threshold To Zero)

  与截断阈值化相反,像素点的灰度值如果大于该阈值则像素值不变,如果像素点的灰度值小于该阈值,则该像素值设置为0.公式以及示意图如下:

阈值反取零(Threshold To Zero Inverted)

  像素值大于阈值的像素赋值为0,而小于该阈值的像素值则保持不变,公式以及示意图如下:

13.图片裁剪

13.1 方式一

以下为实例

13.2 方式二

以下为实例

13.3 Rect类构造

14.基本变换

14.1 翻转

  • 参数如下

参数
含义

src(source)

输入图片

dst(destination)

输出图片

flipCode

翻转类型,参见下表

  • flipCode 可选值如下

flipCode 可选值
含义

flipcode==0

上下翻转

flipcod>0

左右翻转

flipcode<0

上下加左右翻转,等价于旋转180°

效果

14.2 90°旋转

  • 参数如下

参数
含义

src(source)

输入图片

dst(destination)

输出图片

rotateCode

旋转类型

效果

15.仿射变换

15.1 API

  • 参数如下

参数
含义

src(source)

输入图片

dst(destination)

输出图片

M

变换矩阵

dsize(destination size)

输出图片的尺寸,若不对输出图片的尺寸进行调整,那么很可能会出现黑边

flags

插值算法

borderMode

边界外推法

borderValue

填充边界的值

15.2 平移

  • 只需将变换矩阵M设置成如下形式:

delta_x:x方向上的偏移量

delta_y:y方向上的偏移量

M_values:必须是浮点类型的数组对象

M:必须是CV_32F,不能用逗号式分隔创建

效果

15.3 任意角度旋转

获得变换矩阵M

  • 参数如下

参数
含义

center

旋转中心点的坐标

angle

逆时针偏角

scale

生成图与原图之比

效果

15.4 仿射(不破坏几何关系)

获得变换矩阵M

  • 参数如下

参数
含义

src[](source[])

输入图片的坐标点集,含三个坐标点

dst[](destination[])

三个坐标点变换的目标位置

  • 三个点要一一对应

16.透射变换(破坏几何关系)

16.1 API

进行变换

  • 参数如下

参数
含义

src(source)

输入图片

dst(destination)

输出图片

M

变换矩阵

dsize(destination size)

输出图片的尺寸,若不对输出图片的尺寸进行调整,那么很可能会出现黑边

flags

插值算法

borderMode

边界外推法

borderValue

填充边界的值

已知变换后图片,逆推变换矩阵M

  • 参数如下

参数
含义

src(source)

输入图片

dst(destination)

输出图片

获得变换矩阵M

  • 参数如下

参数
含义

src[](source[])

输入图片的坐标点集,含四个坐标点

dst[](destination[])

三个坐标点变换的目标位置

  • 四个点要一一对应

16.2 效果

在这里插入图片描述

最后更新于

这有帮助吗?