友情提示,本篇文章仅适用于图像处理的业余选手,以及对OpenCV、Emgu CV无任何概念的读者,相关的背景知识仅用于图像分析和视觉处理的入门使用,如果您已经是专家或高手,勿喷。
有可能我解释的概念是错的,希望大家提出来相互提高。
这一篇主要针对最基础的概念理解,可能随时会更新... ...
1、什么是图像
在计算机中存储和显示的图像,都是数字化的。计算机处理数字化图像的最小单元是像素,百度百科中对像素的描述如下:
简单的说,像素包含位置信息和颜色信息。以一副640 * 360 大小的图片来说,就是图像长度方向有640个像素,高度方向有360个像素。位置信息就是这个像素点在图片中的哪个位置,因为每个位置实际显示的颜色,基本上是不相同的。而颜色信息就是这个像素点实际的颜色值。在Emgu CV中,最主要的颜色(或者说是图像的颜色空间),就是彩色图、灰度图。
下面以这副640*360的高山湖泊图像为例进行解释。
1.1、彩色图像
Emgu CV中,最常用的是利用BGR颜色空间显示彩色图片。彩色图片是由三个通道组成,BGR颜色空间代表红色(R),绿色(G)和蓝色(B)三个通道,每个通道的值范围是[0,255],0是最小,255是最大。举例的高山湖泊图片结构如下所示:
左上角第一个像素点是天空蓝色,其三个通道的数值分别是P(0,0,蓝通道)=205,P(0,0,绿通道)=193,P(0,0,红通道)=159。而下图中绿圈内的点,坐标是(246,287),就是从左上角第一个像素点开始,第246列287行的位置,其值是P(246,287,蓝通道)=21,P(246,287,绿通道)=134,P(246,287,红通道)=255
补充说明:
- 纯蓝色图片,每个点的值都是P(蓝通道)=255,P(绿通道)=0,P(红通道)=0
- 纯绿色图片,每个点的值都是P(蓝通道)=0,P(绿通道)=255,P(红通道)=0
- 纯红色图片,每个点的值都是P(蓝通道)=0,P(绿通道)=0,P(红通道)=255
- 纯白色图片,每个点的值都是P(蓝通道)=255,P(绿通道)=255,P(红通道)=255
- 纯黑色图片,每个点的值都是P(蓝通道)=0,P(绿通道)=0,P(红通道)=0
1.2、灰度图
灰度图就是把BGR彩色图像的三个通道,合并成一个通道。合并后效果如下:
左上角第一个像素点P(0,0)=184,第246列287行的位置,值是P(246,287)=157。
2、Emgu CV像素坐标系
图像的水平方向为宽度,垂直方向为高度。表示位置的的时候用[长,宽]、或者[列,行]、或者[X,Y]。左上角第一个像素点是零点,可以记作P[0,0]。
3、Emgu CV的Mat类
Mat类是Emgu CV中用于存储图像数据的类型。刚才说的彩色图像、灰度图,都可以看成是一个640*360的矩阵,简单的理解:
Mat类把上面的彩色高山湖泊图像,以BGR颜色空间形式转换成了一个640列,360行的三个矩阵组,把灰度图转换成了一个640列,360行的矩阵。
Mat类的使用是Emgu CV最基础的和最常用的功能,一个mat对象包含了图像的尺寸、采用的颜色空间、数值存储类型等。Mat类的创建如下:
Mat mat=new Mat(); // 一个空Mat
Mat img = new Mat(new Size(360, 640), Emgu.CV.CvEnum.DepthType.Cv8U, 3); // 创建一个图片宽度是640,高度是360,8位的3通道图像
Mat img = new Mat(new Size(360, 640), Emgu.CV.CvEnum.DepthType.Cv8U, 1); // 创建一个图片宽度是640,高度是360,8位的单通道图像
注意:创建Mat时,格式是 Mat(rows, cols, DepthType type, channels),行(高度)在前,列(宽度)在后,这个和我们日常习惯是相反的,因为OpenCV就是这么写的。
4、Emgu CV的VideoCapture类
为了读取并显示视频,Emgu CV提供了VideoCapture类的相关方法,这些方法包括视频的初始化、检验视频初始化是否成功、读取视频基础信息、从视频中读取帧、关闭视频的方法等。这里先介绍初始化的三种类型:
// 1、打开本地视频
VideoCapture videoCapture1 = new VideoCapture("本地视频文件地址");
// 2、计算机上的摄像头
VideoCapture videoCapture2 = new VideoCapture(0); // 计算机上的第0个摄像头
VideoCapture videoCapture3 = new VideoCapture(3); // 计算机上的第3个摄像头
// 3、打开网络视频
VideoCapture videoCapture4 = new VideoCapture("网络视频地址");
原创不易,请勿抄袭。共同进步,相互学习。