计算机图形图像技术复习资料

 一、考试题型

1、简述题(10分×4题,共40分)

2、计算题(共10分)

3、编程题(共30分)

4、问答题(共20分)

二、复习提纲

1、简答题

(1)第1章的基本内容

(2)三维观察流水线中的基本概念与理解

(3)三维场景真实感绘制中的基本概念与理解

(4)图像增强中的基本概念与理解

(5)形态学操作,包括膨胀,腐蚀,开,闭等操作中的基本概念与理解

2、计算题

 Bézier样条的计算表达

3、编程题

(1)OpenCV基本函数的调用

(2)利用OpenGL编写核心代码,包括平移,旋转,缩放及坐标系之间的变换等所有其它的基本变换。

(3)利用OpenCV编写核心代码,内容包括图像增强,图像分析等

第1章 计算机图形学概述

一、计算机图像学定义

        计算机图形学是研究怎样利用计算机表示、生成、处理和显示图形的原理、算法、方法和技术的一门学科(计算机图形学=造型+绘制)。

二、图形的构成要素

  • 几何要素:刻画形状的点、线、面、体等。
  • 非几何要素:反映物体表面属性和材质的灰度、颜色等。

        例如,方程x+y=1确定的图形由满足这个方程并具有一定颜色信息的点构成。

三、图形的表示方法

        一般来说,在计算机中有下列两种表示图形的方法:

1、参数法

        用图形的形状参数和属性参数来表示图形。

  • 形状参数是指描述图形的方程或分析表达式的系数、线段的端点坐标或多边形的顶点坐标等。
  • 属性参数包括颜色和线型等。

        参数法描述的图形叫做参数图或简称为图形

2、点阵法

        通过列出图形中所有的点来表示图形。点阵法强调的是:

  • 图形由哪些点组成。
  • 每个点具有怎样的颜色。

        点阵法描述的图形叫做像素图图像

四、计算机图形学的研究内容

1、图形的输入

        如何开发和利用图形输入设备及相关软件把图形输入到计算机中,以便进行各种处理。

2、图形的处理

        包括对图形进行变换(如几何变换、投影变换)和运算(如图形的并、交、差运算)等处理。

3、图形的生成和输出

        如何将图形的特定表示形式转换成图形输出系统便于接受的表示形式,并将图形在显示器或打印机等输出设备上输出。

五、计算机图形学的部分应用领域

        (此部分可能出问答题,囿于篇幅,此处不详细展开,详细内容请移步教材P5-P7)

  • 计算机辅助设计与制造
  • 科学计算可视化
  • 虚拟现实
  • 计算机艺术
  • 计算机动画
  • 图形用户接口

第5章 三维图形变换

一、三维基本变换

1、平移

        用T(tx,ty,tz)表示。

  • glTranslatef(tx, ty, tz)
  • glTranslated(tx, ty, tz)

2、缩放

        用S(sx,sy,sz)表示。

  • glScalef(sx, sy, sz)
  • glScaled(sx, sy, sz)

3、旋转

        分别用Rx(θ)、Ry(θ)和Rz(θ)表示绕x轴、y轴和z轴的旋转。

  • glRotatef(th, x, y, z)
  • glRotated(th, x, y, z)

        表示绕旋转轴(0,0,0)—(x,y,z)旋转th角度。

  • (x,y,z)—(1,0,0)表示旋转轴为x轴
  • (x,y,z)—(0,1,0)表示旋转轴为y轴
  • (x,y,z)—(0,0,1)表示旋转轴为z轴

二、三维变换的复合

1、通用三维旋转

1)问题

        已知P0={x0,y0,z0},P1={x1,y1,z1},旋转轴为P0P1,旋转角为θ。求该旋转变换的变换矩阵。

2)程序片段
glTranslated(x0, y0, z0);       // (5) 使旋转轴回到原来的位置
glMultMatrixd((const double[]){ // (4) 使旋转轴回到原来的方向
    u1, u2, u3, 0,
    v1, v2, v3, 0,
    n1, n2, n3, 0,
    0, 0, 0, 1
});
glRotated(th, 0, 0, 1);         // (3) 绕坐标轴完成指定的旋转
glMultMatrixd((const double[]){ // (2) 使旋转轴与某坐标轴重合
    u1, v1, n1, 0,
    u2, v2, n2, 0,
    u3, v3, n3, 0,
    0, 0, 0, 1
});
glTranslated(-x0, -y0, -z0);    // (1) 使旋转轴通过坐标原点

2、通用反射轴反射

1)问题

        已知反射轴为P0P1,P0={x0,y0,z0},P1={x1,y1,z1}。求该反射变换的变换矩阵。

2)程序片段
glTranslated(x0, y0, z0);       // (5) 使反射轴回到原来的位置
glMultMatrixd((const double[]){ // (4) 使反射轴回到原来的方向
    u1, u2, u3, 0,
    v1, v2, v3, 0,
    n1, n2, n3, 0,
    0, 0, 0, 1
});
glScaled(-1, -1, 1);            // (3) 关于坐标轴完成指定的反射
glMultMatrixd((const double[]){ // (2) 使反射轴与某坐标轴重合
    u1, v1, n1, 0,
    u2, v2, n2, 0,
    u3, v3, n3, 0,
    0, 0, 0, 1
});
glTranslated(-x0, -y0, -z0);    // (1) 使反射轴通过坐标原点

3、通用反射面反射

1)问题

        已知反射面的方程为ax+by+cz+d=0 ,且点(x0,y0,z0)在反射面上。求该反射变换的变换矩阵。

(2)程序片段
glTranslated(x0, y0, z0);       // (5) 使反射面回到原来的位置
glMultMatrixd((const double[]){ // (4) 使反射面回到原来的方向
    u1, u2, u3, 0,
    v1, v2, v3, 0,
    n1, n2, n3, 0,
    0, 0, 0, 1
});
glScaled(1, 1, -1);             // (3) 关于坐标平面完成指定的反射
glMultMatrixd((const double[]){ // (2) 使反射面与某坐标平面重合
    u1, v1, n1, 0,
    u2, v2, n2, 0,
    u3, v3, n3, 0,
    0, 0, 0, 1
});
glTranslated(-x0, -y0, -z0);    // (1) 使反射面通过坐标原点

三、三维观察流水线

        (此处老师提到“基础概念、理解”) 

第7章 三维场景的真实感绘制

一、可见面判别算法

1、分类

        可见面判别算法也可称为隐藏面消除算法,可以分为:

  • 物空间算法。将场景中各物体和各组成部分相互进行比较,以判别哪些面可见。例如后向面判别算法。
  • 像空间算法。在投影平面上逐点判断各像素对应的可见面。例如深度缓冲器算法。

2、常用算法

  • 后向面判别算法(物空间算法)
  • 深度缓冲器算法(也叫z-buffer算法,像空间算法,OpenGL和MATLAB使用了该算法)
  • 扫描线算法(像空间算法)
  • 深度排序算法(也叫画家算法,像空间算法,Matlab使用了该算法)

二、光照模型与面绘制算法

  • 光照模型(也称明暗模型)。用于物体表面某点处的光强度计算。
  • 面绘制算法(也称渲染算法)。通过光照模型中的光强度计算,确定场景中物体表面所有投影像素点的光强度。

第9章 样条方法(Bézier样条)

一、Bézier基函数

1、定义

        

2、特性

二、三次Bézier曲线

1、基函数

        

2、矩阵形式

        

3、例题

第10章 数字图像处理概述

        ※ 此章老师说结合课程PPT和另外发的补充PPT复习,没有给出明确考点,因此将一些基本知识点整合至此。

一、数字图像

1、含义

        数字图像处理的研究对象是数字图像。图像这个词包含的内容很广,凡是记录在纸上,拍摄在照片上,显示在屏幕上的所有具有视觉效果的画面都可以称为图像。

2、图像的灰度信息

        图像的灰度信息是指图像中各点处的颜色深浅程度信息(也就是明暗程度信息或亮度信息)。

  • 对于灰度图像来说,灰度就是黑白程度等级(也就是明暗程度等级或亮度);
  • 对于彩色图像来说,情况也一样,因为任何彩色图像都可以分解成红、绿、蓝三种灰度图像,因此彩色图像的灰度指的是这三种灰度图像的灰度。

3、分类

(1)从视觉特点,分为可见图像和不可见图像。

(2)根据图像记录方式的不同,图像可分为两大类。

  • 模拟图像。通过某种物理量(光、电)的强弱变化来记录图像上各点的灰度信息(如模拟相机和模拟电视等)。
  • 数字图像。用数值记录图像的灰度信息。数字图像比模拟图像更容易保存,不会因为保存时间过长而失真。

(3)数字图像的基本类型:

  • 黑白图像:指图像的每个像素只能是黑或者白,没有中间的过渡,故又称为二值图像。二值图像的像素值为0、1。
  • 灰度图像:指各像素信息由一个量化的灰度级来描述的图像,没有彩色信息。灰度取值范围为[0(黑)~255(白)]。
  • 索引图像:既包括存放图像数据的二维矩阵,还包括一个颜色索引矩阵(MAP),因此称为索引图像,又称为映射图像。
  • 彩色图像:指每个像素的信息由RGB三原色构成的图像,其中R、G、B是由不同的灰度级来描述的。

4、数字图像处理的特点

  • 处理精度高,再现性好
  • 处理方法的多样性
  • 图像数据量庞大
  • 处理费时
  • 图像处理技术综合性强

5、数字图像处理的研究内容

  • 图像数字化。研究如何把一幅连续的光学图像表示成一组数值,既不失真又便于计算机分析处理。
  • 图像增强。增强图像中的有用信息,削弱干扰和噪音,以便于观察、识别和进一步分析、处理。增强后的图像不一定和原图像一致。
  • 图像恢复。使褪色或模糊的图像复原。复原的图像要尽可能和原图像保持一致。
  • 图像编码。在满足指定保真度的前提下,简化图像的表示,压缩表示图像的数据,便于存储和传输。
  • 图像分析。对图像中的各种对象进行分割、分类、识别、描述、解释等。

※ 数字图像处理的目的

  • 提高图像的视感质量,以便于观察
  • 提取图像中所包含的某些特征或特殊信息, 以便于分析
  • 对图像数据进行变换、 编码和压缩, 以便于图像的存储和传输。

6、数字图像处理与相关学科的关系

  • 计算机图形学着重讨论怎样将数据模型变成数字图像。
  • 图像处理着重研究图像的压缩存储和去除噪音等问题,以突出图像中感兴趣的部分或特征。
  • 模式识别重点讨论如何从图像中提取数据和模型。
  • 计算几何着重研究数据模型的建立、存储和管理

7、部分应用领域

  • 航空和航天领域
  • 生物和医学领域
  • 军事和公安领域
  • 工业和工程领域
  • 通信领域
  • 电子商务与文化艺术领域

二、图像数据

1、图像在计算机上的存在形式

 数字图像在计算机上是以位图形式存在的。位图是一个矩形点阵,每一个点都称为一个像素。像素是数字图像中的基本单位。一幅W×H大小的图像,是由W×H个明暗不等的像素组成的。

  • 在数字图像中,各像素的明暗程度由一个称为灰度值的数值标识(白:255,黑:0),描述一个像素需要用8位二进制数据。
  • 在灰度图像中,每个图像中的像素都分别由1字节记录。
  • 在彩色图像中,每个像素需用3字节(用红、绿、蓝三个灰度图像混合出所有颜色)数据记录。

2、BMP文件格式

 基于调色板的BMP文件由文件头、信息头、调色板和图像的像素数据四个部分组成,而真彩色的BMP文件则由文件头、信息头和图像的BGR像素数据组成。

  • 文件头是一个BITMAPFILEHEADER数据结构,共14字节。
  • 信息头是一个BITMAPINFOHEADER数据结构,包含与设备无关的点阵位图的尺寸和颜色格式等信息,共40字节。
  • 调色板也叫颜色表,是一个可变长的列表,列表的长度由信息头中的biBitCount值决定(2^biBitCount)。调色板中的每一项是一个RGBQUAD对象,共4字节。
  • BMP图像像素数据的存储顺序是由下往上,从左往右。像素数据的每一行都必须是4字节对齐的,即每一行像素数据的长度(单位为字节)都必须是4的倍数,如果不是4的倍数则必须补足。真彩色图像没有调色板,像素数据直接使用BGR颜色值。

第13章 图像变换

        ※ 这章老师说不明确考,也没有明确考点,因此根据基本概念和平时作业补充资料,仅供参考。

一、主要内容

        图像变换是对图像的像素位置或像素值进行的某种变换,主要内容通常包括对像素位置的变换、对单一像素的变换和对像素块的变换等方面。

  • 对像素位置的变换。逐一计算每个像素的新位置,用于改变像素的位置、图像的大小和形状等,通常使用图像的仿射变换和透视变换实现。
  • 对单一像素值的变换。每个新像素值都通过对应的单一源像素值获得,通常使用图像的线性变换实现。
  • 对像素块的变换。每个新像素值都通过对应的源像素块获得,通常使用图像的空域滤波和频域滤波等变换实现。

二、空间转换的常见种类

        图像的空间转换主要包括空域与空域的转换和空域与频域的转换等两类。

  • 空域与空域的转换常见的是颜色空间转换,使用线性变换实现。
  • 空域与频域的转换通常使用离散傅立叶变换或离散余弦变换等方法实现。

三、二维离散傅立叶变换

四、例题

1、计算对下列实数矩阵进行傅立叶正变换后的变换结果(不缩放结果)。

2、计算对下列实数矩阵进行傅立叶逆变换后的变换结果(缩放结果,i为虚数单位)。

※ 此题给出个人答案,仅供参考,如有错误请联系指正(确信)

第14章 图像增强

一、图像增强的两类基本技术

        图像增强是图像处理的基础,它是对图像施加的某种数学变换,其目的通常是为了除去图像中的噪音,强调或抽取图像的轮廓特征等

        图像中的噪音是指在图像生成、保存和传递过程中由外部干扰在图像中加入的冗余信息。例如,电视画面上常见的雪花点就是一种典型的噪音。

        图像增强有两类不同的基本技术:

  • 直接对像素的灰度值进行演算的灰度空间变换
  • 对图像的频谱域(可以通过傅立叶变换等变换得到)进行变换的频谱变换技术

二、图像平滑处理方法

1、概念

        平滑处理是一种简单且使用频率很高的图像处理方法,是除去图像中点状噪音的一个有效方法。

        所谓平滑化,是指使图像上任何一个像素与其相邻像素的灰度值的大小不会出现陡变的一种处理方法。

        这种处理会使得图像变模糊,所以图像的平滑化也称为图像的模糊化。

2、分类

1)归一化块滤波器

        归一化块滤波器的特点是模板系数之和为1。模板系数全相同的归一化块滤波器称为均值模糊器或简单模糊器,是最简单的滤波器。

2)高斯滤波器

        高斯滤波器是一种通过指定参数计算模板系数的归一化块滤波器,是最有用的滤波器(尽管不是最快的)。

3)中值滤波

        中值滤波是一种非线性处理技术,可用来抑制图像中的噪音,而且保持轮廓的清晰。中值滤波使用当前像素近旁nx×ny个像素的灰度值的中值(不是平均值)作为当前像素的新灰度值,即

        例如,Med{2,0,5,9,0,0,18,1,29}=2 。{2,0,5,9,0,0,18,1,29}排序后变成{0,0,0,1,2,5,9,18,29},容易看出,中值是第5号元素2。

        ※ 中值滤波具有不损失有效信息的优点。

三、OpenCV中的平滑处理

        ※ 大概是有考编程的部分了。

1、均值模糊

【函数原型】void blur(InputArray src, OutputArray dst, Size ksize);

【参数】

  • src:输入图像。
  • dst:输出图像,大小和类型与源图像一致,必要时重建。
  • ksize:内核大小,必须是正奇数。

2、中值模糊

【函数原型】void median(BlurInputArray src, OutputArray dst, int ksize);

【参数】

  • src:输入图像。
  • dst:输出图像,大小和类型与源图像一致,必要时重建。
  • ksize:内核大小,必须是正奇数。

3、高斯模糊

【函数原型】void GaussianBlur(InputArray src,OutputArray dst,Size ksize, double sigmaX, double sigmaY=0);

【参数】

  • src:输入图像。
  • dst:输出图像,大小和类型与源图像一致,必要时重建。
  • ksize:内核大小,必须是正奇数。
  • sigmaX和sigmaY:高斯内核中变量x和y的标准差σ1和σ2 。

【说明】如果sigmaY=0,则使用sigmaY=sigmaX。如果标准差都是0,则使用公式σ=0.3(0.5n-1)+0.8由内核尺寸计算标准差。

4、代码演示

        对一幅含有噪音的灰度图像进行简单模糊、中值模糊和高斯模糊:

#include<opencv2/opencv.hpp>
using namespace cv;
int main() {
    Mat X = imread("lena-n.jpg", 0);    // 含噪声的灰度图像
    if(X.empty())
        return -1;
    imshow("源图像", X);
    Mat Y;                              // 结果图像
    blur(X, Y, {5, 5});                 // 简单模糊
    imshow("简单模糊", Y);
    medianBlur(X, Y, 5);                // 中值模糊
    imshow("中值模糊", Y);
    GaussianBlur(X, Y, {5, 5}, 0, 0);   // 高斯模糊, 标准差都是0
    imshow("高斯模糊", Y);
    waitKey();
}

四、图像锐化处理方法

        图像锐化处理的主要目的是突出图像中的细节或者增强被模糊化了的细节,一般情况下图像的锐化被用于景物边界的检测与提取,把景物的结构轮廓清晰地表现出来。使用锐化方法处理后的图像,轮廓线条将明显得到增强。轮廓线以外的部分将变得较暗,而轮廓线部分将变得比较明亮。

五、方向模板

        有时需要在图像中抽出某一特定方向的轮廓线,这时可以使用方向模板来达到这一目的。根据所需的方向,可从下列8种模板中选取合适的模板。

六、形态学操作

1、定义

        形态学操作也是一种非线性处理技术。简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将结构元素作用于输入图像来产生输出图像。结构元素就是矩形、椭圆等形状的模板,可以通过分别将形状部分的模板系数指定为1,其余部分的模板系数指定为0实现。

        形态学操作运用广泛,如下列情形均可从形态学操作获益:

  • 消除噪音。
  • 分割独立的图像元素,以及连接相邻的元素。
  • 寻找图像中明显的极大值区域或极小值区域。

2、常用操作

        ※ 主要把老师点的重点整理如下,此外还有3种高级形态学操作(形态学梯度、顶帽、黑帽)可以根据情况看教材了解。

(1)腐蚀
  • 腐蚀提取内核覆盖区域中的最小像素值。
  • 进行腐蚀操作时,将内核滑过图像,用内核覆盖区域中的最小像素值代替锚点位置的像素。
  • 显然,这一最小化操作会导致图像的亮区“缩小”。
(2)膨胀
  • 膨胀提取内核覆盖区域中的最大像素值。
  • 进行膨胀操作时,将内核滑过图像,用内核覆盖区域中的最大像素值代替锚点位置的像素。
  • 显然,这一最大化操作会导致图像的亮区“扩展”。
3)开运算

        先腐蚀再膨胀,用于在图像中消除小的物体,在纤细点处分离物体,在将较大物体的边界平滑化的同时不明显改变物体的体积。

4)闭运算

        先膨胀再腐蚀,能够排除小型黑洞,消除小块噪音区域,连接邻近区域。

七、图像的频谱变换

        ※ 老师提到这里考编程,故根据对应考点简要整理。

1、低通频域滤波

        对低通滤波器来说,H(u,v)应该对高频成分有衰减作用而又不影响低频分量。通常使用低通滤波器实现图像平滑:

1)理想低通滤波器

        理想低通滤波器过滤了高频成分,高频成分的滤除使图像变模糊,但过滤后的图像往往含有“抖动”或“振铃”现象。所谓“振铃”,就是指输出图像的灰度剧烈变化处产生的震荡,就好像钟被敲击后产生的空气震荡。

2)巴特沃斯(ButterWorth)低通滤波器

        与理想低通滤波器相比,经ButterWorth低通滤波器处理的图像模糊程度会大大减少,并且过滤后的图像没有“抖动”或“振铃”现象。

3)指数低通滤波器

        指数低通滤波器的平滑效果与ButterWorth低通滤波器大致相同。

2、高通频域滤波

        高通频域滤波是加强高频成分的方法,它使高频成分相对突出,低频成分相对抑制,从而实现图像锐化。

1)理想高通滤波器

        理想高通滤波器只保留了高频成分。

(2)巴特沃斯(ButterWorth)高通滤波器

        与理想高通滤波器相比,经ButterWorth高通滤波器处理的图像会更平滑。

(3)指数高通滤波器

        指数高通滤波器的锐化效果与ButterWorth高通滤波器大致相同。

3、应用举例

(1)使用ButterWorth低通滤波对一幅含噪音的灰度图像进行平滑操作

#include "cvv.hpp"
using namespace cv;
int main() {
    Mat X = imread("lena-n.jpg", 0);   // 含噪声的灰度图像
    if(X.empty())
        return -1;
    imshow("源图像", X);
    filter_dft(X, X, 25, BUTTER_L);    // ButterWorth低通滤波
    normalize(X, X, 255, 0, NORM_INF); // 增大亮度以便于观察
    imshow("结果图像", X);
    waitKey();
}

(2)使用ButterWorth高通滤波对一幅灰度图像进行锐化操作

#include "cvv.hpp"
using namespace cv;
int main() {
    Mat X = imread("lena.jpg", 0);     // 灰度图像
    if(X.empty())
        return -1;
    imshow("源图像", X);
    filter_dft(X, X, 60, BUTTER_H);    // ButterWorth高通滤波
    normalize(X, X, 255, 0, NORM_INF);    // 增大亮度以便于观察
    imshow("高通滤波", X);
    waitKey();
}

第15章 图像解析

一、灰度直方图

        在对图像进行处理前,对图像整体(当然也可以是局部)的灰度分布情况作一些分析了解,通常是很有好处的。对图像的灰度分布进行分析的重要手段就是建立灰度直方图。

        灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。也就是说,灰度直方图是对图像的所有像素的灰度分布按灰度值的大小显示灰度值出现频度的统计图。

二、直方图的表示

        通常,灰度直方图的横轴用来表示灰度值,纵轴用来表示频度。频度是具有某一灰度值(或属于某一子区域的灰度值)的像素在图像中出现的次数。

1、灰度值的频度

        假设有一幅4×4的8灰度级图像,图像数据及其灰度直方图分别如左图和右图所示:

        根据图像数据,灰度值为0, 1, 2, 3, 4, 5, 6, 7的像素的频度分别是1, 2, 6, 2, 3, 1, 0, 1,因此在灰度刻度的0~7处分别作一条以该灰度值对应的频度值为长度的直线即可完成该图像的灰度直方图。

2、灰度值子区间的频度

        假设有一个矩阵包含一张图像的灰度值(如左图所示):

        灰度值的范围包含256个值,可以将这个范围均匀分割成若干子区域,如8个均匀子区域,即[0,256)=[0,32)∪[32,64)∪...∪[224,256)。

        将灰度值范围均匀分割成若干子区域以后,统计灰度值属于每一个子区域的像素数目。

        采用这一方法来统计上面的数字矩阵,可以得到如右图所示的直方图(x轴表示子区域,y轴表示属于各个子区域的像素个数)。

3、参考程序

// 计算一个单通道图像的直方图(源图像, 直方图, 大小, 范围)
void MyCalcHist(Mat image, Mat &hist, int size, vector<float> range) {
    float a = range[0], b = range[1];      // 下界, 上界
    if(b < a) 
        swap(a, b);
    Mat1f H(1, size, 0.0);                 // 直方图初始值为0
    for(auto v : Mat1f(image)) {
        int i = (v - a) * size / (b - a);   // 当前像素所在子区域
       ++H(i);                         // 相应子区域的像素数目增加1
    }
    hist = H;                          // 记录结果
}

补充——OpenGL与OpenCV编程基础

一、前言

        此部分为老师提到的编程题可能涉及的基础部分知识,定位为教材第2、3、11、12章,具体掌握情况以大致可以完成课程实验为标准即可,故在此进行大致整理,所涉及的知识点不一定覆盖所有实际所需内容,因此具体复习参考教材和课程实验,以及涉及编程题考点的示例代码即可。

二、OpenGL基本语法

1、函数名前缀

  • 基本函数使用gl作为函数名的前缀,如glClearColor()
  • 实用函数使用glu作为函数名的前缀,如gluOrtho2D()
  • 实用工具包函数使用glut作为函数名的前缀,如glutInit()

2、常量名前缀

  • 基本常量的名字以GL开头,如GL_LINE_LOOP
  • 实用常量的名字以GLU开头,如GLU_FILL
  • 实用工具包常量的名字以GLUT_开头,GLUT_RGB

3、函数名后缀

        一组功能相同或相近的函数的函数名使用不同的后缀以支持不同的数据类型和格式,如glEvalCoord2f()、glEvalCoord2d()和glEvalCoord2dv()等,其中2表示有2个参数,f、d分别表示参数的类型是float和double,v表示参数以向量形式出现。

4、特殊类型名

        OpenGL定义了一些特殊的类型名,如GLint和GLfloat。其实就是32位C语言中的float和int等类型。在

5、C源程序大致框架

// Frame.c
#include <GL/freeglut.h>
void init() { 
    /* 全局初始化。主要用于设置一些全局的状态,如颜色模式、
    窗口的初始位置和大小等。使用默认值时不需要定义该函数。
    */
}
void init2() { 
    /* 当前窗口初始化。主要用于设置一些与当前窗口关联的状态或开关,
    如光照处理、光源特性、深度检测和裁剪等。
    使用默认值时不需要定义该函数。
    */
}
void Reshape(int w, int h) { 
    /* 设置投影方式和观察体。主要使用glViewport()、glOrtho()、glFrustum()、
    gluPerspective()和gluOrtho2D()等。
    使用默认值时不需要定义该函数。
    */
}
void Paint() { 
    /* 使用OpenGL库函数构造对象的数学描述,包括点线面的位置、
    几何变换和光照处理等,是OpenGL的主要部分。
    */
}
int main(int argc, char *argv[]) { 
    glutInit(&argc, argv); // 初始化GLUT, 记录main()的参数
    init(); // 全局初始化, 使用默认值时不是必需的
    glutCreateWindow("窗口标题"); // 创建程序窗口,指定窗口标题
    init2(); // 当前窗口初始化, 使用默认值时不是必需的
    // 注册回调函数
    glutDisplayFunc(Paint); // 指定场景绘制函数,必需
    glutReshapeFunc(Reshape); // 指定窗口变化回调函数,缺省则使用默认值
    glutMainLoop(); // 开始循环执行OpenGL命令
}

三、基本图元定义

1、绘图准备与结束

(1)指定背景颜色
  • 【函数原型】void glClearColor(float red, float green, float blue, float alpha);
  • 【功能】指定当前背景颜色。
  • 【参数】red,green,blue,alpha为RGBA颜色值。
  • 【说明】默认为黑色,即参数值全为0。
(2)清除缓冲区
  • 【函数原型】void glClear(GLbitfield mask);
  • 【功能】清除指定的缓冲区(设置为预先指定的值)。
  • 【参数】标识要清除的缓冲区,使用按位或运算组合。
  • 【说明】共有4个标识,最常用的标志是
    • GL_COLOR_BUFFER_BIT(颜色缓冲区,设置为背景颜色)
    • GL_DEPTH_BUFFER_BIT(深度缓冲区,设置为最远深度)
(3)结束绘图并返回

 ① glFlush()

  • 【函数原型】void glFlush(void);
  • 【功能】强制OpenGL命令序列在有限的时间内完成执行。

 ② glFinish()

  • 【函数原型】void glFinish(void);
  • 【功能】强制完成已发出的全部OpenGL命令的执行,即等到全部命令执行完毕以后才返回。
  • 【说明】应尽量避免使用glFinish,以免影响性能。

2、图元定义

【函数原型】void glBegin(GLenum mode);

【功能】表示一个基本图元定义的开始。

【参数】mode可选下列符号常量。

  • GL_POINTS:每一个顶点作为一个独立的点。
  • GL_LINES:每一对顶点作为一条独立的线段。
  • GL_LINE_STRIP:顶点依次相连成一组线段。
  • GL_LINE_LOOP:顶点依次相连成一组线段,并连接末顶点与首顶点。
  • GL_TRIANGLES:每三个顶点作为一个独立的三角形。
  • GL_TRIANGLE_STRIP:三角形带,顶点n、n+1和n+2定义第n个三角形。
  • GL_TRIANGLE_FAN:三角形扇形,顶点1、n+1和n+2定义第n个三角形。
  • GL_QUADS:每四个顶点作为一个独立四边形。
  • GL_QUAD_STRIP:四边形带,顶点2n-1、2n、2n+2和2n+1定义第n个四边形。可能形成有交叉的四边形,不好把握。
  • GL_POLYGON:所有顶点作为一个简单多边形。最好不要定义凹多边形,多边形在处理时会分解成三角形扇形,凹多边形可能得不到预期效果。

【函数原型】void glEnd(void);

【功能】表示一个基本图元定义的结束。

※ 预定义的几何形体详见教材。

3、举例说明

#include <gl/freeglut.h>
void Viewport(int x, int y, int w, int h) {
    glViewport(x, y, w, h); // 定义视口
    glLoadIdentity(); // 消除其他视口的影响, 函数介绍见后续章节
}
void Paint(){ 
    int w = glutGet(GLUT_WINDOW_WIDTH) / 2; // 计算视区宽度
    int h = glutGet(GLUT_WINDOW_HEIGHT) / 2; // 计算视区高度
    glClearColor(1, 1, 1, 1); // 白色背景
    glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存
    Viewport(0, 0, w, h); // 左下方视口
    glColor3f(1, 0.8, 0.6); // 设置当前颜色, 茶色
    glRectf(-0.8, -0.8, 0.8, 0.8); // 定义正方形
    Viewport(w, 0, w, h); // 右下方视口
    glColor3f(0, 1, 0); // 设置当前颜色, 绿色
    glutSolidTeapot(0.6); // 定义犹他茶壶
    Viewport(0, h, w, h); // 左上方视口
    glColor3f(0, 0, 1); // 设置当前颜色, 蓝色
    glRotatef(45, 1, 1, 0); // 调整立方体方向, 函数介绍见后续章节
    glutWireCube(1); // 线框立方体, 边长为1
    Viewport(w, h, w, h); // 右上方视口
    glColor3f(1, 0, 1); // 设置当前颜色, 紫色
    glRotatef(-90, 1, 0, 0); // 调整两极方向, 函数介绍见后续章节
    glutWireSphere(0.8, 24, 12); // 线框球体, 半径, 经线数, 纬线数
    glFlush(); // 强制OpenGL命令序列在有限的时间内完成执行
}
int main(int argc, char *argv[]) { 
    glutInit(&argc, argv); // 初始化GLUT, 记录main()的参数
    glutCreateWindow("四个预定义几何形体"); // 指定窗口标题
    glutDisplayFunc(Paint); // 指定场景绘制函数
    glutMainLoop(); // 开始执行
}

四、OpenCV GUI命令

1、创建窗口

  • 【函数原型】void namedWindow(const string &name);
  • 【功能】创建一个可以放置图像和滑块的窗口,可以通过名字引用该窗口。
  • 【参数】name是窗口名字,用来区分不同的窗口,并显示为窗口标题。
  • 【说明】如果已经存在这个名字的窗口,该函数不做任何事情。

2、显示图像

  • 【函数原型】void imshow(const string &name, InputArray image);
  • 【功能】在指定窗口中显示图像。
  • 【参数】
    • name:窗口的名字。
    • image:待显示的图像。
  • 【说明】
    • 可显示彩色或灰度的字节图像和浮点数图像。
    • 彩色图像数据按BGR顺序存储。

3、响应键盘事件

  • 【函数原型】int waitKey(int delay=0);
  • 【功能】等待按键事件。
  • 【参数】delay表示延迟的毫秒数。
  • 【说明】
    • 该函数无限等待按键事件(delay<=0)或者延迟delay毫秒。
    • 该函数是HighGUI中获取和操作键盘事件的函数,在一般的事件处理中需要循环调用。
    • 返回值为按键值,如果超过指定时间则返回-1。

4、选取矩形子集

        使用()运算。

  • 【函数原型】Mat operator(const Rect &roi const);
  • 【功能】返回输入矩阵的矩形子集的矩阵头。
  • 【参数】roi是感兴趣的矩形区域。
  • 【说明】该函数返回输入矩阵中指定矩形区域对应子集的矩阵头,从而可以将输入矩阵的一个矩形子集当作一个独立矩阵处理。

※ 代码示例

// 在源图像中选取一个矩形子集,并将该矩形子集乘以0.75,然后显示图像
#include<opencv2/opencv.hpp>
using namespace cv;
int main() {
    Mat im = imread("lena.jpg");           // 载入彩色图像
    if(im.empty()) 
        return -1;                         // 载入失败
    Mat roi = im({ 125, 125, 100, 50 });   // 选取矩形子集
    roi *= 0.75;                       // 降低选取区域亮度
    imshow("SubMat", im);                  // 显示图像
    waitKey();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/272744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

平面灯阵中寻找最大正方形边界 - 华为机试真题题解

分值: 300分 题解: Java / Python / C++ 题目描述 现在有一个二维数组来模拟一个平面灯阵,平面灯阵中每个位置灯处于点亮或熄灭,分别对应数组每个元素取值只能为1或0,现在需要找一个正方形边界,其每条边上的灯都是点亮(对应数组中元素的值为1)的,且该正方形面积最大。 …

【hcie-cloud】【12】华为云Stack故障处理【故障处理通用处理原则、常见华为云Stack故障处理(计算域故障场景)】【上】

文章目录 前言故障处理通用处理原则故障处理流程故障信息收集及故障范围、类型识别ManageOne运维面收集告警信息AutoOps工具故障场景信息收集AutoOps工具自动化采集HCS信息 (1)AutoOps工具自动化采集HCS信息 (2)故障初期定位方向故障恢复例行维护讨论: 哪一环比较重要&#xff…

Android studio 花式按键

一、activity_main.xml代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.a…

Xmake v2.8.6 发布,新的打包插件:XPack

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量&#xff0c;没有任何依赖&#xff0c;因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建&#xff0c;相比 makefile/CMakeLists.txt&#xff0c;配置语法更加简洁直观&#xff0c;对新手非常友好&#x…

企业级实战项目:基于 pycaret 自动化预测公司是否破产

本文系数据挖掘实战系列文章&#xff0c;我跟大家分享一个数据挖掘实战&#xff0c;与以往的数据实战不同的是&#xff0c;用自动机器学习方法完成模型构建与调优部分工作&#xff0c;深入理解由此带来的便利与效果。 1. Introduction 本文是一篇数据挖掘实战案例&#xff0c;…

深信服技术认证“SCCA-C”划重点:云计算基础

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08…

华锐视点为广汽集团打造VR汽车在线展厅,打破地域限制,尽享购车乐趣

随着科技的飞速发展&#xff0c;我们正在进入一个全新的时代——元宇宙时代。元宇宙是一个虚拟的世界&#xff0c;它不仅能够模拟现实世界&#xff0c;还能够创造出现实世界无法实现的事物。而汽车行业作为人类生活的重要组成部分&#xff0c;也在积极探索与元宇宙的融合&#…

如何使用ArcGIS Pro将Excel表转换为SHP文件

有的时候我们得到的数据是一张张的Excel表格&#xff0c;如果想要在ArcGIS Pro中进行分析或者制图则需要先转换为SHP格式&#xff0c;这里为大家介绍一下转换方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的POI数据&#xff0c;除了P…

Jenkins 自动设置镜像版本号

使用Jenkins环境变量当作镜像版本号 这样version变量就是版本号,在镜像构建的过程中可以使用 docker build 之后&#xff0c;如果有自己的镜像库&#xff0c;肯定要docker push 一下 至于部署的步骤&#xff0c;一般需要stop并删除原有的容器.我这里用的是docker-compose。同样…

OKCC语音机器人的人机耦合来啦

目前市场上语音机器人的外呼形式基本就分为三种&#xff0c;一种纯AI外呼&#xff0c;第二种也是目前主流的AI外呼转人工。那么第三种也可能是未来的一种趋势&#xff0c;人机耦合&#xff0c;或者也叫人机协同。 那么什么是人机耦合呢&#xff1f; 人机耦合是为真人坐席创造相…

线性代数基础【3】向量

第一节 向量的概念与运算 一、基本概念 ①向量 ②向量的模(长度) ③向量的单位化 ④向量的三则运算 ⑤向量的内积 二、向量运算的性质 (一)向量三则运算的性质 α β β αα (β γ) (α β) γk (α β) kα kβ(k l) α kα lα (二)向量内积运…

什么是GeoTrust?

在当今数字化时代&#xff0c;网络安全是至关重要的。GeoTrust&#xff0c;作为全球领先的SSL证书提供商&#xff0c;致力于为用户提供卓越的数字安全解决方案。 产品与服务&#xff1a; 域名验证证书&#xff1a; 提供快速简便的验证&#xff0c;是保护网站和用户数据的基础。…

华清远见嵌入式学习——ARM——作业4

作业要求&#xff1a; 代码运行效果图&#xff1a; 代码&#xff1a; do_irq.c: #include "key_it.h" extern void printf(const char *fmt, ...); unsigned int i 0;//延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j);} }void do_i…

【linux】Linux重定向

在Linux操作系统中&#xff0c;命令行界面是一个强大的工具&#xff0c;它允许用户与系统进行高效的交互。重定向是命令行中一个非常重要的概念&#xff0c;它可以改变命令输入和输出的默认路径。通过重定向&#xff0c;用户可以将数据从一个程序传递到另一个程序&#xff0c;或…

LENOVO联想笔记本小新Pro 14 IRH8 2023款(83AL)电脑原装出厂Win11系统恢复预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1M1iSFahokiIHF3CppNpL4w?pwdzr8y 提取码&#xff1a;zr8y 联想原厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等自带的预装软件程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件…

SpringBoot3 整合Kafka

官网&#xff1a;https://kafka.apache.org/documentation/ 消息队列-场景 1. 异步 2. 解耦 3. 削峰 4. 缓冲 消息队列-Kafka 1. 消息模式 消息发布订阅模式&#xff0c;MessageQueue中的消息不删除&#xff0c;会记录消费者的偏移量 2. Kafka工作原理 同一个消费者组里的消…

开发辅助一(网关gateway+ThreadLocal封装用户信息+远程调用+读取配置文件+统一异常处理)

网关gateway模块 ①、配置文件&#xff0c;添加各个服务模块的路由路径 gateway:routes:-id: server-cart #微服务名称uri: lb://service-cart #负责均衡predicates:- Path/api/order/cart/**ThreadLocal ①、定义一个工具类 public class AuthContextUtil{private static…

Zookeeper应用场景有哪些?

ZooKeeper是⼀个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;我们可以使⽤它来进⾏分布式数据的发布与订阅。另⼀⽅⾯&#xff0c;通过对ZooKeeper中丰富的数据节点类型进⾏交叉使⽤&#xff0c;配合Watcher事件通知机制&#xff0c;可以⾮常⽅便地构建⼀系列分…

记一次Mac端mysql重置密码

在执行mysql命令的时候&#xff0c;报如下的错误&#xff0c;表示不支持mysql命令&#xff1a; zsh: command not found: mysql 1. 先查看mysql服务是否存在 在系统偏好设置中查看&#xff1a; 2. 发现mysql服务已经在运行&#xff0c;可能因为/usr/local/bin目录下缺失mysq…

How to Clean Text for Machine Learning with Python

NLP 在本教程中&#xff0c;您将了解如何清理和准备文本&#xff0c;以便使用机器学习进行建模。 完成本教程后&#xff0c;您将了解&#xff1a; 如何通过开发自己的非常简单的文本清理工具开始。 如何更上一层楼并使用 NLTK 库中更复杂的方法。 在使用现代文本表示方法&am…
最新文章