OpenCV3——数据结构与基本绘图

来源:互联网 发布:淘宝拍下返现送小礼物 编辑:程序博客网 时间:2024/06/04 17:56

图片是以数组的方式存在设备中的,数组中的值代表某个像素点的像素值,它的格式和范围受 颜色空间 和 数据类型 的影响。

Mat类

基础图像容器,它其实就是一个可以保存图片(一些数组矩阵)或者数组的容器,在opencv开发中我们经常需要使用它存储显示并传递一些数据。

特点:1.不必为它手动开辟空间、2.不必在不需要的时候立即释放空间、3.mat由两部分组成,矩阵头(矩阵尺寸,存储方法,存储地址等信息)和一个指针(指向存储所有像素值的矩阵)。

mat对象的复制

因为图片对象的 矩阵 会根据类型的不同占据大量的存储空间,这不利于mat对象在opencv中的传输,所以mat对象的复制有两种,一、是只复制mat对象的信息,不复制存储像素值的矩阵,通过引用计数机制来共享一个矩阵,如:Mat B(A)、C = A,(ABC)共享一个矩阵。二、全部都复制,如:Mat F = A.clone()、 A.copyTo(C),(ABC)是独立的矩阵。

mat对象的创建和输出: opencv中三通道的颜色顺序为 BGR

  1. 数组形式的创建: Mat M(2,2, CV_8UC3, Scalar(0,0,255)); 创建 2行2列3通道8位无符号int类型每个像素点的初始值为0,0,255 的数组,CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]、U(unsigned integer)表示的是无符号整数,S(signed integer)是有符号整数, F(float)是浮点数。
  2. 读取图片形式的创建: Mat img=imread(“1.jpg”); imshow(“【载入的图片】”,img); 读取1.jpg图片以数组的形式保存在mat中,然后又以图片的形式通过窗口展示出来。
  3. 格式化输出: cout << “r (Python风格) = ” << format(r,”python”) << “;” << endl << endl;

常用的数据结构

  • Point :用于表示二维坐标系下的点,如:Point p = Point(2,3)、Point2f p =Point2f(42.4, 24.4)、Point3i p = Point3i(2,3,4)。
  • Scalar :具有四个元素的模板类 在opencv中广泛用于传递和读取图像中的像素值,如:Scalar(B,G,R); //定义RGB颜色值 B代表蓝色,G为绿色,R为红色、有时还有个A 表示透明度。
  • Size:主要用来表示一幅图像或一个矩形的大小,有两个成员变量分别是 width height,如:Size_(_Tp _width, _Tp _height)。

常用的类和基本函数

Rect

表示矩形 模板类为 Rect_,有4个成员变量分别是 x y width height,别名定义:typedef Rect_ Rect,常用构造函数和方法如下:

这里写图片描述
这里写图片描述

cvtColor

颜色空间转换
cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )

这里写图片描述

Draw-line

画线,void line(Mat& img,Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)
这里写图片描述

lineType
描述画出这个线所使用的算法,4连通和8连通线使用 Bresenham 直线算法
8 - 8-connected line. 4 连通
4 - 4-connected line. 9 连通
CV_AA - antialiased line 抗锯齿,即线看起来会比较平滑

Draw-rectangle:

画矩形,void rectangle(Mat& img, Point pt1,Point pt2,constScalar& color, int thickness=1, int lineType=8, int shift=0)
这里写图片描述

Draw-circle:

画圆,void circle(Mat& img, Point center,int radius, const Scalar& color,int thickness=1,int lineType=8, int shift=0)

这里写图片描述

Draw-ellipse:

画椭圆,void ellipse(Mat& img, Point center, Size axes,double angle, double startAngle, double endAngle, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
这里写图片描述

Draw-fillPoly polylines:

填充的多边形void fillPoly(Mat& img, const Point** pts,const int* npts, int ncontours,const Scalar& color, int lineType=8, int shift=0, Point offset=Point() )

这里写图片描述

下面这个函数表示非填充多边形,isClosed代表是否闭合
void polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )

图像的颜色空间

所谓的颜色空间是指,针对一个给定的颜色,我们如何组合颜色元素以对其编码。即把颜色分成几个基元素,通过组合基元素可以产生所有的颜色。

RGB

是最常用的一种颜色空间,因为它的原理和我们人眼的内部构成颜色的方式相同,通过基色 R(红色),G(绿色),B(蓝色),有时候还会有表示颜色透明度的(A)。

HSV

一个圆锥组成,下顶点为黑色,上顶圆的中心点为白色。
H:色调,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°。
S:饱和度,饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。
V:明度,明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白),(明度)是被认为是”光的量“,可以是任何颜色。

HLS

表示的两个圆锥组合而成,下顶点为黑色,上顶点为白色。
H:色调,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°
S:饱和度,和上面的不一样,因为是按照明度/亮度的缩放比来设置饱和度,所以两个的值不一样。
L:亮度,Lightness(亮度)是作为”白的量“来理解的。

YCrCb即YUV

主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):
Y = 0.299R + 0.587G + 0.114B   U = -0.147R - 0.289G + 0.436B   V = 0.615R - 0.515G - 0.100B R = Y + 1.14V   G = Y - 0.39U - 0.58V   B = Y + 2.03U  在DirectShow中,常见的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32等;常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。

在人脸检测中也常常用到YCrCb空间,因为一般的图像都是基于RGB空间的,在RGB空间里人脸的肤色受亮度影响相当大,所以肤色点很难从非肤色点中分离出来,也就是说在此空间经过处理后,肤色点是离散的点,中间嵌有很多非肤色,这为肤色区域标定(人脸标定、眼睛等)带来了难题。如果把RGB转为YCrCb空间的话,可以忽略Y(亮度)的影响,因为该空间受亮度影响很小,肤色会产生很好的类聚。这样就把三维的空间将为二维的CrCb,肤色点会形成一定得形状,如:人脸的话会看到一个人脸的区域,手臂的话会看到一条手臂的形态,对处理模式识别很有好处,根据经验某点的CrCb值满足:133≤Cr≤173,77≤Cb≤127 那么该点被认为是肤色点,其他的就为非肤色点。根据经验某点的CrCb值满足:133≤Cr≤173,77≤Cb≤127 那么该点被认为是肤色点,其他的就为非肤色点。

CIELab

同RGB颜色空间相比,Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。

说明:此文章为学习笔记,内容来源OpenCV3编程入门、CDCKT公司内部分享、网络等等。

0 0
原创粉丝点击