一、Mat类

Mat类是C++实现的OpenCV库的核心,表示一个N维度单通或多通道阵列,可以用来存储实数或复数值向量和数组,灰度或彩色图像,向量场,张量及直方图(当然高纬度的直方图存储在稀疏Mat类更合适),OpenCV是一个图像处理库。它包含大量的图像处理功能。为了解决计算上的挑战,大多数时候你最终会使用库的多个功能。因此,将图像传递给函数是一种常见的做法。我们不应该忘记,我们正在讨论图像处理算法,这些算法往往计算量很大。我们想要做的最后一件事是通过制作不必要的大型图像副本来进一步降低程序的速度。

为了解决这个问题,OpenCV使用了一个引用计数系统。这个想法是,每个Mat对象都有自己的头部,但是矩阵可以通过让它们的矩阵指针指向相同的地址而在它们的两个实例之间共享。而且,复制操作符只会复制标题和指向大矩阵的指针,而不是数据本身。

1.1创建一个Mat对象

从上可以看出Mat基本上是一个包含两个数据部分的类:矩阵头(包含矩阵大小,用于存储的方法,存储矩阵的地址等信息)以及包含像素值(取决于选择用于存储的方法的任何维度)。矩阵头部大小是恒定的,但是矩阵本身的大小可能随着图像而变化,并且通常比数量级大。

创建一个Mat类型对象可以没有大小和数据类型,然后通过成员函数create()来分配指定,例如创建一个二维数组,可以使用create(int rows, int cols, types)备注:仅限于二维数组,第三个参数类型既指定了元素的类型又说明了通道数,这些类型都定义在矩阵头中,格式为:CV_{8U,16S,16U,32S,32F,64F}C{1,2,3},然后通过setTo()函数设定每个通道上的具体数值;

通常定义创建一个Mat类型的对象可以通过构造函数在创建矩阵时即分配内存,其中一个构造函数的参数与create()函数参数相同;

1 //演示示例:创建一个Mat对象数组

2 #include

3 #include

4 #include

5

6 using namespacestd;7 using namespacecv;8

9 intmain()10 {11 Mat array_test;12 array_test.create( 3, 2, CV_32FC3 ); //create array header

13 array_test.setTo(Scalar(1.0f,2.0f,3.0f)); //set array data

14

15 cout << "array_test =" << endl << array_test <

17 Mat array_test_con( 3, 2, CV_32FC3, Scalar(1.0f,2.0f,3.0f) );18 cout << "array_test_con =" << endl << array_test_con <

1.2 Mat类对象的数据和Mat类矩阵头

如上叙述,为了解决图像处理繁杂计算问题,OpenCV使用了一个引用计数系统。这个想法是,针对图像的数据,每个Mat对象都有自己的头部相对应,通过让它们的矩阵指针指向相同的地址而在它们的两个实例对象之间共享。而且,复制操作符只会复制标题和指向大矩阵的指针,而不是数据本身。

1 //演示示例:矩阵头Array Header和矩阵数据Array data关系

2 #include

3 #include

4 #include

5 using namespacestd;6 using namespacecv;7

8 intmain()9 {10 Mat A( 2, 2, CV_8UC3, Scalar(10, 20, 30));11

12 cout << "A =" << endl << A <

14 cout <

16 Mat B(A);17 cout << "B =" << endl << B <

19 cout <

21 Mat C =A;22 cout << "C =" << endl << C <

24 cout << endl << "After Mat algebra..." <

26 Mat A1( 2, 2, CV_8UC3, Scalar(1, 2, 3));27

28 A = A +A1;29

30 cout << "A =" << endl << A <

34 return 0;35 }

上述所有对象最后指向相同的单一数据矩阵。然而,它们的标头是不同的,并且使用它们中的任何一个进行修改也会影响所有其他标签。实际上,不同的对象只是为相同的底层数据提供不同的访问方法。不过,它们的矩阵头部分是真正相互独立的。这样,可以创建一个仅包含矩阵数据的一部分的矩阵对象。例如,要在图像中创建感兴趣的区域(ROI),您只需创建一个带有新边界的新矩阵头:

1 #include

2 #include

3 #include

4

5 using namespacestd;6 using namespacecv;7

8 intmain()9 {10 Mat A( 4, 4, CV_8UC3, Scalar(10, 20, 30));11 cout << "A =" << endl << A <

13 cout <

15 Mat B(A);16 cout << "B =" << endl << B <

18 cout <

20 Mat C =A;21

22 cout << "C =" << endl << C <

24 cout << endl << "After Mat algebra..." <

26 Mat A1( 4, 4, CV_8UC3, Scalar(1, 2, 3));27

28 A = A +A1;29

30 cout << "A =" << endl << A <

34 Mat D(A, Rect(0,0,2,2));35 cout << "D =" << endl << D <

37 D.setTo(Scalar(1, 2, 3));38 cout << "A =" << endl << A <

40 //创建一个带有新边界的新矩阵头

41 Mat E = A(Range::all(), Range(2,3));42 cout << "E =" << endl << E <

44 E.setTo(Scalar(7, 8, 9));45 cout << "A =" << endl << A <

47 return 0;48 }

当想复制矩阵本身,所以OpenCV提供了cv :: Mat :: clone()和cv :: Mat :: copyTo()函数。

1 #include

2 #include

3 #include

4

5 using namespacestd;6 using namespacecv;7

8 intmain()9 {10 Mat A( 4, 4, CV_8UC3, Scalar(10, 20, 30));11 cout << "A =" << endl << A <

13 cout <

15 Mat B(A);16 cout << "B =" << endl << B <

18 cout <

20 Mat C =A;21 cout << "C =" << endl << C <

23 cout << endl << "After Mat algebra..." <

25 Mat A1( 4, 4, CV_8UC3, Scalar(1, 2, 3));26

27 A = A +A1;28

29 cout << "A =" << endl << A <

33 Mat D(A, Rect(0,0,2,2)); //拷贝构造函数中Rect仅适用于二维矩阵

34 cout << "D =" << endl << D <

36 D.setTo(Scalar(1, 2, 3));37 cout << "A =" << endl << A <

39 Mat E = A(Range::all(), Range(2,3)); //拷贝构造函数中Range 仅适用于二维矩阵

40 cout << "E =" << endl << E <

44 Mat F =A.clone();45 cout << "F =" << endl << F <

47 Mat G;48 A.copyTo(G);49 cout << "G =" << endl << G <

51 A.setTo(Scalar(10, 20, 30));52 cout << "A =" << endl << A <

二、SpareMat类

针对稀疏矩阵,OpenCV定义了独立的数据结构SpareMat类。稀疏矩阵仅存储非零元素,避免了资源上的浪费,即将节省很多空间尤其针对元素存在许多零元素的数据, 使用稀疏矩阵的常用案例是直方图,对于直方图,大多数数据是零,存储这些零元素又是没有必要的。

三、数组常用操作

3.1两数组元素加权相加运算 AddWeighted()

1 voidaddWeighted(2 InputArray src1, //第一个输入矩阵

3 double alpha, //第一个输入矩阵的权重

4 InputArray src2, //第二个输入的矩阵

5 double beta, //第二个输入矩阵的权重

6 double gamma, //权重相加的偏移量

7 OutputArray dst, //输出的结果

8 int dtype = -1) //输出结果的类型

即加权的表达式如下:

Dst = α·src1 + β·src2 + γ

该函数可以用来实现alhpa融合(线性融合),即将公式中的γ设置为0,则alpha融合的公式演变为:

Dst = α·src1 + β·src2 = α·src1 + (1-α)·src2

函数中需要两个源图像src1和src2,这两个源图像可以是任意类型的像素(灰度,彩色),但只要他们属于同一类型一致即可,所输出的图像也是与源图像的像素类型一致;

注意:源图像可以是不同尺寸,但融合的操作区域(即感兴趣区域ROI)必须尺寸统一,否则OpenCV会产生错误;

1 //alpha融合演示示例

2 #include

3 #include

4

5 using namespacestd;6 using namespacecv;7

8 intmain()9 {10 //读取图像imread()显示图像imshow()函数待后续

11 Mat src1 = imread("D:\\workspace-qt\\OpenCV\\LinuxLogo.jpg");12 if(src1.empty()) {cout << "Can't Load the image..." << endl; return -1;}13 Mat src2 = imread("D:\\workspace-qt\\OpenCV\\WindowsLogo.jpg");14 if(src2.empty()) {cout << "Can't Load the image..." << endl; return -1;}15 Mat dst;16 addWeighted(src1,0.5,src2,0.5,0.0,dst,-1);17 imshow("Alpha",dst);18 waitKey(0);19 return 0;20 }

备注:在加权融合图像的便宜参数γ方面,函数提供了更大的灵活性,一般而言,使α和β不小于0且相加不大于1,那么γ的设定取决于加权后图像像素所要调整到的平均值或最大值。

3.2 色彩空间转换 cvColor()

1 void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 )

输入图像数组可以是8位数组,16位无符号类型数组,或者32位浮点类型,而输出图像数组与输入数组保持着相同的尺寸大小和深度,转换操作由参数code来实现,dstCn表示输出图像的通道数,默认设为0意味着输出数组自动由源图像src和转换规则code作用后自动获取;

1 enumColorConversionCodes {2 COLOR_BGR2BGRA = 0, //!< add alpha channel to RGB or BGR image

3 COLOR_RGB2RGBA =COLOR_BGR2BGRA,4

5 COLOR_BGRA2BGR = 1, //!< remove alpha channel from RGB or BGR image

6 COLOR_RGBA2RGB =COLOR_BGRA2BGR,7

8 COLOR_BGR2RGBA = 2, //!< convert between RGB and BGR color spaces (with or without alpha channel)

9 COLOR_RGB2BGRA =COLOR_BGR2RGBA,10

11 COLOR_RGBA2BGR = 3,12 COLOR_BGRA2RGB =COLOR_RGBA2BGR,13

14 COLOR_BGR2RGB = 4,15 COLOR_RGB2BGR =COLOR_BGR2RGB,16

17 COLOR_BGRA2RGBA = 5,18 COLOR_RGBA2BGRA =COLOR_BGRA2RGBA,19

20 COLOR_BGR2GRAY = 6, //!< convert between RGB/BGR and grayscale, @ref color_convert_rgb_gray "color conversions"

21 COLOR_RGB2GRAY = 7,22 COLOR_GRAY2BGR = 8,23 COLOR_GRAY2RGB =COLOR_GRAY2BGR,24 COLOR_GRAY2BGRA = 9,25 COLOR_GRAY2RGBA =COLOR_GRAY2BGRA,26 COLOR_BGRA2GRAY = 10,27 COLOR_RGBA2GRAY = 11,28

29 COLOR_BGR2BGR565 = 12, //!< convert between RGB/BGR and BGR565 (16-bit images)

30 COLOR_RGB2BGR565 = 13,31 COLOR_BGR5652BGR = 14,32 COLOR_BGR5652RGB = 15,33 COLOR_BGRA2BGR565 = 16,34 COLOR_RGBA2BGR565 = 17,35 COLOR_BGR5652BGRA = 18,36 COLOR_BGR5652RGBA = 19,37

38 COLOR_GRAY2BGR565 = 20, //!< convert between grayscale to BGR565 (16-bit images)

39 COLOR_BGR5652GRAY = 21,40

41 COLOR_BGR2BGR555 = 22, //!< convert between RGB/BGR and BGR555 (16-bit images)

42 COLOR_RGB2BGR555 = 23,43 COLOR_BGR5552BGR = 24,44 COLOR_BGR5552RGB = 25,45 COLOR_BGRA2BGR555 = 26,46 COLOR_RGBA2BGR555 = 27,47 COLOR_BGR5552BGRA = 28,48 COLOR_BGR5552RGBA = 29,49

50 COLOR_GRAY2BGR555 = 30, //!< convert between grayscale and BGR555 (16-bit images)

51 COLOR_BGR5552GRAY = 31,52

53 COLOR_BGR2XYZ = 32, //!< convert RGB/BGR to CIE XYZ, @ref color_convert_rgb_xyz "color conversions"

54 COLOR_RGB2XYZ = 33,55 COLOR_XYZ2BGR = 34,56 COLOR_XYZ2RGB = 35,57

58 COLOR_BGR2YCrCb = 36, //!< convert RGB/BGR to luma-chroma (aka YCC), @ref color_convert_rgb_ycrcb "color conversions"

59 COLOR_RGB2YCrCb = 37,60 COLOR_YCrCb2BGR = 38,61 COLOR_YCrCb2RGB = 39,62

63 COLOR_BGR2HSV = 40, //!< convert RGB/BGR to HSV (hue saturation value), @ref color_convert_rgb_hsv "color conversions"

64 COLOR_RGB2HSV = 41,65

66 COLOR_BGR2Lab = 44, //!< convert RGB/BGR to CIE Lab, @ref color_convert_rgb_lab "color conversions"

67 COLOR_RGB2Lab = 45,68

69 COLOR_BGR2Luv = 50, //!< convert RGB/BGR to CIE Luv, @ref color_convert_rgb_luv "color conversions"

70 COLOR_RGB2Luv = 51,71 COLOR_BGR2HLS = 52, //!< convert RGB/BGR to HLS (hue lightness saturation), @ref color_convert_rgb_hls "color conversions"

72 COLOR_RGB2HLS = 53,73

74 COLOR_HSV2BGR = 54, //!< backward conversions to RGB/BGR

75 COLOR_HSV2RGB = 55,76

77 COLOR_Lab2BGR = 56,78 COLOR_Lab2RGB = 57,79 COLOR_Luv2BGR = 58,80 COLOR_Luv2RGB = 59,81 COLOR_HLS2BGR = 60,82 COLOR_HLS2RGB = 61,83

84 COLOR_BGR2HSV_FULL = 66, //!<

85 COLOR_RGB2HSV_FULL = 67,86 COLOR_BGR2HLS_FULL = 68,87 COLOR_RGB2HLS_FULL = 69,88

89 COLOR_HSV2BGR_FULL = 70,90 COLOR_HSV2RGB_FULL = 71,91 COLOR_HLS2BGR_FULL = 72,92 COLOR_HLS2RGB_FULL = 73,93

94 COLOR_LBGR2Lab = 74,95 COLOR_LRGB2Lab = 75,96 COLOR_LBGR2Luv = 76,97 COLOR_LRGB2Luv = 77,98

99 COLOR_Lab2LBGR = 78,100 COLOR_Lab2LRGB = 79,101 COLOR_Luv2LBGR = 80,102 COLOR_Luv2LRGB = 81,103

104 COLOR_BGR2YUV = 82, //!< convert between RGB/BGR and YUV

105 COLOR_RGB2YUV = 83,106 COLOR_YUV2BGR = 84,107 COLOR_YUV2RGB = 85,108

109 //! YUV 4:2:0 family to RGB

110 COLOR_YUV2RGB_NV12 = 90,111 COLOR_YUV2BGR_NV12 = 91,112 COLOR_YUV2RGB_NV21 = 92,113 COLOR_YUV2BGR_NV21 = 93,114 COLOR_YUV420sp2RGB =COLOR_YUV2RGB_NV21,115 COLOR_YUV420sp2BGR =COLOR_YUV2BGR_NV21,116

117 COLOR_YUV2RGBA_NV12 = 94,118 COLOR_YUV2BGRA_NV12 = 95,119 COLOR_YUV2RGBA_NV21 = 96,120 COLOR_YUV2BGRA_NV21 = 97,121 COLOR_YUV420sp2RGBA =COLOR_YUV2RGBA_NV21,122 COLOR_YUV420sp2BGRA =COLOR_YUV2BGRA_NV21,123

124 COLOR_YUV2RGB_YV12 = 98,125 COLOR_YUV2BGR_YV12 = 99,126 COLOR_YUV2RGB_IYUV = 100,127 COLOR_YUV2BGR_IYUV = 101,128 COLOR_YUV2RGB_I420 =COLOR_YUV2RGB_IYUV,129 COLOR_YUV2BGR_I420 =COLOR_YUV2BGR_IYUV,130 COLOR_YUV420p2RGB =COLOR_YUV2RGB_YV12,131 COLOR_YUV420p2BGR =COLOR_YUV2BGR_YV12,132

133 COLOR_YUV2RGBA_YV12 = 102,134 COLOR_YUV2BGRA_YV12 = 103,135 COLOR_YUV2RGBA_IYUV = 104,136 COLOR_YUV2BGRA_IYUV = 105,137 COLOR_YUV2RGBA_I420 =COLOR_YUV2RGBA_IYUV,138 COLOR_YUV2BGRA_I420 =COLOR_YUV2BGRA_IYUV,139 COLOR_YUV420p2RGBA =COLOR_YUV2RGBA_YV12,140 COLOR_YUV420p2BGRA =COLOR_YUV2BGRA_YV12,141

142 COLOR_YUV2GRAY_420 = 106,143 COLOR_YUV2GRAY_NV21 =COLOR_YUV2GRAY_420,144 COLOR_YUV2GRAY_NV12 =COLOR_YUV2GRAY_420,145 COLOR_YUV2GRAY_YV12 =COLOR_YUV2GRAY_420,146 COLOR_YUV2GRAY_IYUV =COLOR_YUV2GRAY_420,147 COLOR_YUV2GRAY_I420 =COLOR_YUV2GRAY_420,148 COLOR_YUV420sp2GRAY =COLOR_YUV2GRAY_420,149 COLOR_YUV420p2GRAY =COLOR_YUV2GRAY_420,150

151 //! YUV 4:2:2 family to RGB

152 COLOR_YUV2RGB_UYVY = 107,153 COLOR_YUV2BGR_UYVY = 108,154 //COLOR_YUV2RGB_VYUY = 109,155 //COLOR_YUV2BGR_VYUY = 110,

156 COLOR_YUV2RGB_Y422 =COLOR_YUV2RGB_UYVY,157 COLOR_YUV2BGR_Y422 =COLOR_YUV2BGR_UYVY,158 COLOR_YUV2RGB_UYNV =COLOR_YUV2RGB_UYVY,159 COLOR_YUV2BGR_UYNV =COLOR_YUV2BGR_UYVY,160

161 COLOR_YUV2RGBA_UYVY = 111,162 COLOR_YUV2BGRA_UYVY = 112,163 //COLOR_YUV2RGBA_VYUY = 113,164 //COLOR_YUV2BGRA_VYUY = 114,

165 COLOR_YUV2RGBA_Y422 =COLOR_YUV2RGBA_UYVY,166 COLOR_YUV2BGRA_Y422 =COLOR_YUV2BGRA_UYVY,167 COLOR_YUV2RGBA_UYNV =COLOR_YUV2RGBA_UYVY,168 COLOR_YUV2BGRA_UYNV =COLOR_YUV2BGRA_UYVY,169

170 COLOR_YUV2RGB_YUY2 = 115,171 COLOR_YUV2BGR_YUY2 = 116,172 COLOR_YUV2RGB_YVYU = 117,173 COLOR_YUV2BGR_YVYU = 118,174 COLOR_YUV2RGB_YUYV =COLOR_YUV2RGB_YUY2,175 COLOR_YUV2BGR_YUYV =COLOR_YUV2BGR_YUY2,176 COLOR_YUV2RGB_YUNV =COLOR_YUV2RGB_YUY2,177 COLOR_YUV2BGR_YUNV =COLOR_YUV2BGR_YUY2,178

179 COLOR_YUV2RGBA_YUY2 = 119,180 COLOR_YUV2BGRA_YUY2 = 120,181 COLOR_YUV2RGBA_YVYU = 121,182 COLOR_YUV2BGRA_YVYU = 122,183 COLOR_YUV2RGBA_YUYV =COLOR_YUV2RGBA_YUY2,184 COLOR_YUV2BGRA_YUYV =COLOR_YUV2BGRA_YUY2,185 COLOR_YUV2RGBA_YUNV =COLOR_YUV2RGBA_YUY2,186 COLOR_YUV2BGRA_YUNV =COLOR_YUV2BGRA_YUY2,187

188 COLOR_YUV2GRAY_UYVY = 123,189 COLOR_YUV2GRAY_YUY2 = 124,190 //CV_YUV2GRAY_VYUY = CV_YUV2GRAY_UYVY,

191 COLOR_YUV2GRAY_Y422 =COLOR_YUV2GRAY_UYVY,192 COLOR_YUV2GRAY_UYNV =COLOR_YUV2GRAY_UYVY,193 COLOR_YUV2GRAY_YVYU =COLOR_YUV2GRAY_YUY2,194 COLOR_YUV2GRAY_YUYV =COLOR_YUV2GRAY_YUY2,195 COLOR_YUV2GRAY_YUNV =COLOR_YUV2GRAY_YUY2,196

197 //! alpha premultiplication

198 COLOR_RGBA2mRGBA = 125,199 COLOR_mRGBA2RGBA = 126,200

201 //! RGB to YUV 4:2:0 family

202 COLOR_RGB2YUV_I420 = 127,203 COLOR_BGR2YUV_I420 = 128,204 COLOR_RGB2YUV_IYUV =COLOR_RGB2YUV_I420,205 COLOR_BGR2YUV_IYUV =COLOR_BGR2YUV_I420,206

207 COLOR_RGBA2YUV_I420 = 129,208 COLOR_BGRA2YUV_I420 = 130,209 COLOR_RGBA2YUV_IYUV =COLOR_RGBA2YUV_I420,210 COLOR_BGRA2YUV_IYUV =COLOR_BGRA2YUV_I420,211 COLOR_RGB2YUV_YV12 = 131,212 COLOR_BGR2YUV_YV12 = 132,213 COLOR_RGBA2YUV_YV12 = 133,214 COLOR_BGRA2YUV_YV12 = 134,215

216 //! Demosaicing

217 COLOR_BayerBG2BGR = 46,218 COLOR_BayerGB2BGR = 47,219 COLOR_BayerRG2BGR = 48,220 COLOR_BayerGR2BGR = 49,221

222 COLOR_BayerBG2RGB =COLOR_BayerRG2BGR,223 COLOR_BayerGB2RGB =COLOR_BayerGR2BGR,224 COLOR_BayerRG2RGB =COLOR_BayerBG2BGR,225 COLOR_BayerGR2RGB =COLOR_BayerGB2BGR,226

227 COLOR_BayerBG2GRAY = 86,228 COLOR_BayerGB2GRAY = 87,229 COLOR_BayerRG2GRAY = 88,230 COLOR_BayerGR2GRAY = 89,231

232 //! Demosaicing using Variable Number of Gradients

233 COLOR_BayerBG2BGR_VNG = 62,234 COLOR_BayerGB2BGR_VNG = 63,235 COLOR_BayerRG2BGR_VNG = 64,236 COLOR_BayerGR2BGR_VNG = 65,237

238 COLOR_BayerBG2RGB_VNG =COLOR_BayerRG2BGR_VNG,239 COLOR_BayerGB2RGB_VNG =COLOR_BayerGR2BGR_VNG,240 COLOR_BayerRG2RGB_VNG =COLOR_BayerBG2BGR_VNG,241 COLOR_BayerGR2RGB_VNG =COLOR_BayerGB2BGR_VNG,242

243 //! Edge-Aware Demosaicing

244 COLOR_BayerBG2BGR_EA = 135,245 COLOR_BayerGB2BGR_EA = 136,246 COLOR_BayerRG2BGR_EA = 137,247 COLOR_BayerGR2BGR_EA = 138,248

249 COLOR_BayerBG2RGB_EA =COLOR_BayerRG2BGR_EA,250 COLOR_BayerGB2RGB_EA =COLOR_BayerGR2BGR_EA,251 COLOR_BayerRG2RGB_EA =COLOR_BayerBG2BGR_EA,252 COLOR_BayerGR2RGB_EA =COLOR_BayerGB2BGR_EA,253

254 //! Demosaicing with alpha channel

255 COLOR_BayerBG2BGRA = 139,256 COLOR_BayerGB2BGRA = 140,257 COLOR_BayerRG2BGRA = 141,258 COLOR_BayerGR2BGRA = 142,259

260 COLOR_BayerBG2RGBA =COLOR_BayerRG2BGRA,261 COLOR_BayerGB2RGBA =COLOR_BayerGR2BGRA,262 COLOR_BayerRG2RGBA =COLOR_BayerBG2BGRA,263 COLOR_BayerGR2RGBA =COLOR_BayerGB2BGRA,264

265 COLOR_COLORCVT_MAX = 143

266 };

转换参数Code选取列表

备注:色彩空间转换都用到如下约定:

1 8位图像的范围:0~255

2 16位图像的范围:0~65536

3 浮点数的范围:0.0~1.0

4 黑白图像转换位彩色图像时,最终图形与黑白图像的通道数相同5 彩色图像转换为灰度图像时,灰度值计算使用加权公式:6 Y= 0.299R+0.587G+0.114B

针对HSV色彩模式或者HLS色彩模式来说色调范围通常Rang(0,360);

当HSV色彩模式以8位图像形式输出时,色调应处以2,才能不出现问题;

1 //RGB转Gray演示示例

2 #include

3 #include

4 #include

5

6 using namespacestd;7 using namespacecv;8

9 intmain()10 {11 Mat src2 = imread("D:\\workspace-qt\\OpenCV\\WindowsLogo.jpg");12 if(src2.empty()) {cout << "Can't Load the image..." << endl; return -1;}13

14 Mat dst_gray;15 cvtColor(src2,dst_gray,CV_BGR2GRAY);16 imshow("Alpha",dst_gray);17 waitKey(0);18 return 0;19 }

3.3 图像翻转flip()

void flip(InputArray src, OutputArray dst, int flipCode)

将图像绕X轴或者Y周或绕X轴Y轴上同时旋转,取决于参数flipCode的设置

1 图像绕X轴旋转:flipCode = 0;2 图像绕Y轴旋转:flipCode = 1;3 图像绕X轴和Y轴同时旋转:flipCode = -1;

常用于图像坐标原点在左上角和左下角的变换时使用,尤其是进行视频处理所进行的图像格式变化;

1 #include

2 #include

3 #include

4

5 using namespacestd;6 using namespacecv;7

8 intmain()9 {10 Mat src = imread("D:\\workspace-qt\\OpenCV\\WindowsLogo.jpg");11 if(src.empty()) {cout << "Can't Load the image..." << endl; return -1;}12

13 imshow("src",src);14 Mat dst_x, dst_y, dst_x_y;15 flip(src,dst_x,0);16 flip(src,dst_y,1);17 flip(src,dst_x_y,-1);18 imshow("flipCode = 0",dst_x);19 imshow("flipCode = 1",dst_y);20 imshow("flipCode = -1",dst_x_y);21 waitKey(0);22 return 0;23 }

python的opencv的图像对象存储的颜色通道_OpenCV大型阵列类型Mat类相关推荐

  1. 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克

    使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...

  2. 使用Python,OpenCV计算图像直方图(cv2.calcHist)

    使用Python,OpenCV计算图像直方图(cv2.calcHist 1. 效果图 2. 原理 2.1 什么是图像直方图? 2.2 计算直方图 2.3 可视化蒙版区域 3. 源码 参考 这篇博客将介 ...

  3. 使用Python和OpenCV构建图像金字塔

    使用Python和OpenCV的图像金字塔 1. 效果图 2. 什么是图像金字塔? 3. 依赖 4. 源码 参考 这篇博客将介绍如何使用两种方法构造图像金字塔. 使用Python和OpenCV构建金字 ...

  4. 使用Python,OpenCV寻找图像中的轮廓

    使用Python和OpenCV查找图像中的形状 1. 效果图 2. 步骤 3. 源码 参考 这篇博客将讨论使用Python和OpenCV查找图像中的形状,具体是 cv2.inRange在图像中查找形状 ...

  5. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

  6. 热视觉2:使用Python和OpenCV从图像中测量温度

    热视觉2:使用Python和OpenCV从图像中测量温度 这篇博客将介绍学习热/中远红外视觉的基础知识,gray8 和 gray16 图像(即最常见的热成像格式)之间的差异,学习如何使用Python和 ...

  7. Python,OpenCV骨架化图像并显示(skeletonize)

    Python,OpenCV骨架化图像并显示(skeletonize) 1. 效果图 2. 源码 参考: 1. 效果图 自己画一张图,原图 VS 骨架效果图如下: opencv logo原图 VS 骨架 ...

  8. 使用Python,OpenCV制作图像Mask——截取ROIs及构建透明的叠加层

    使用Python,OpenCV制作图像Mask--截取ROIs及构建透明的叠加层 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用OpenCV制作Mask图像掩码.使用位运算和图像掩码允许我们只 ...

  9. 使用Python和OpenCV检测图像中的条形码

    使用Python和OpenCV检测图像中的条形码 1. 效果图 2. 算法的步骤 3. 源码 参考 这篇博客将介绍使用计算机视觉和图像处理技术进行条形码检测的必要步骤,并演示使用Python编程语言和 ...

最新文章

  1. 测试MindMotion MM32F3277 MicroPython -2021-11-20新增PWM版本
  2. 通俗易懂的讲解区块链
  3. WinFormsUI(转xiaisidinen)
  4. 各类数据类型的用法java_Java各种数据类型详细介绍及其区别
  5. (转)Sql中的constraint
  6. mvc 404错误 php,ASP.NET MVC实现404跳转的代码实例
  7. 导致oracle 控制文件坏,异常断电导致ORACLE控制文件等受到破坏的处理
  8. opencv中的矩阵拼接
  9. redis中hash类型介绍
  10. 零基础学启发式算法(1)-贪心算法(Greedy Algorithm)
  11. 什么是高精准IP地址定位——IP问问
  12. dns服务器 响应超时,DNS 客户端解析超时 - Windows Server | Microsoft Docs
  13. 仿泡团影视网源码 苹果cmsV8版本 电脑端+影视模块
  14. linux命令发请求,Linux命令发送Http的get或post请求(curl和wget两种方法)
  15. Zynq笔记(一) —PL端(FPGA部分)的设计流程
  16. 2022企业邮箱移动oa办公系统使用攻略
  17. 第11课:生活中的组合模式——自己组装电脑
  18. DevExpress控件汉化类 z
  19. 白月黑羽selenium自动化测试课后习题
  20. 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题

热门文章

  1. appserv的安装和使用方法。
  2. 备份采用磁盘与虚拟磁带库优缺点分析
  3. 腾讯大股东否认中信组团收购消息;马斯克要求Twitter工程师默写代码;苹果或被强制开放侧载|极客头条...
  4. jQuery动画效果大全
  5. introduce to local variable总是有declare final
  6. C语言,1 3 5 7 9…… 9999,《C语言数据结构》第1至9章自测题答案大全一创新.doc...
  7. 【ROS真车篇】激光雷达SLAM建图+自主导航+RGB深度相机
  8. 5G专网,路在何方?
  9. template蓝色波浪线
  10. 如何解除计算机对游戏的限制,Win7如何限制电脑玩游戏