«

HNUST-计算机图形/图像期末复习-1.9 21:40更新

ZealSinger 发布于 阅读:18579 期末复习


最后加入了“猜题大王模块”,有想法在评论区可以一起猜题,已开启评论区

参考内容

教材

2023 hnust 湖南科技大学 大四上 计算机图形图像技术 课程 期末考试 复习资料_湖南科技大学计算机图形学-CSDN博客

理论基础题解析.pdf

openGL习题.pdf

openCV习题.pdf

60道复习题

历年样卷

考试题型(源自CSDN)

对比学校PDF,整体结构式一样的,但是分值分配不一样,计算题比例会更多一点,很明显这样子难度更大

image-20260109154619427

第一章:计算机图形学概述

相关定义

计算机图像学定义

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


 

图形的构成要素

图形由 几何要素 和 非集合要素 两种要素构成

  1. 几何要素:刻画形状的点,线,面,体等

  2. 非几何要素:反映物体表面属性和材质的灰度,颜色等

例如: 方程x+y=1确定的图形由满足这个方程并且具有一定颜色信息的点构成 (几何要素:满足x+y=1的点 非几何要素:具有一定的颜色信息)


 

图形的表示方法

一般有 参数法 和 点阵法 两种表示图形的方法

  1. 参数法:用图形的形状参数 和 属性参数 来表示图形,用参数法描述的图形叫做参数图或者图形

    • 形状参数:是指描述图形的方程;分析表达式的系数;线段的端点坐标;多边形的顶点坐标等

    • 属性参数:包括颜色和线性

  2. 点阵法通过列出图形中所有的点来表示图形,用点阵法描述的图形叫做像素图或者图像。点阵法强调的是“图形由哪些点组成,每个点具有怎样的颜色”


 

计算机图形学的研究内容

  1. 图形的输入:开发和利用图形输入设备以及相关软件把图形输入到计算机中,以便于进行各种处理

  2. 图形的处理:对图形进行变换(例如几何变换,投影变换 )和运算(例如图形的交,并,差运算)等处理

  3. 图形的生成和输出:将图形的特定表示形式转换为图形输出系统便于接受的表示形式,并将图形在显示器或者打印机等输出设备上输出

计算机图形学与相关学科的关系

主要探讨计算机图形学,图形处理,计算机几何,计算机视觉和模式识别这几个学科之间的关系,一张图

image-20251125154644888

计算机图形学的应用领域

第二章:基本图元的显示

万万没想到这个地方就会有计算题,帧缓冲器的相关内容

帧缓冲器的定义

图形的定义保存在称之为刷新缓冲器/帧缓冲器的存储器中。该存储器保存屏幕上所有位置的强度值,每次考试刷新时,从刷新缓冲区中取出强度值并在屏幕上画出。

对应计算题P18习题5

分辨率1024x768,代表一共能存放多少个像素
32位系统,代表一个像素需要用32位表示
那么总共就需要
1024*768*32=25165824 位
因为题目问的是多少MB,所以要进行单位转换
25165824/8/(1024*1024) = 3MB

 

DDA画线算法

对于两点确认的一条直线,我们假设其满足y=kx+b,假设两个端点现在分别是(x1,y1)和(x2,y2)

我们选择一个主方向(变化较大的一方),主方向增加一个单位,假设我们选择x方向为主方向,那么y方向我们称之为从方向

则下一步点的位置(x1+ 1,y1+1)则需要满足 y1+1=k(x1 + 1)+ b,那么得到了 y1+1 = y1+k

也就是说,主方向每增加一个单位,从方向对应的增加k

直接看题(教材P13):使用DDA算法绘制端点为(20, 10)和(28, 16)的线段

x1=20,x2=28,x2-x1=8
y1=10.y2=16,y2-y1=6
x的差值更大,x变化更大,所以x为主方向
求得k=6/8=0.75
x1=20,y=10
x2=20+1=21,y2=10+k=10.75=11
// 注意 坐标数据是四舍五入之后的 但是计算过程中使用的是真实结果值
x3=21+1=22,y3=10.75+k=11.5=12
x4=23,y4=11.5+k=12.25=12

(按需看代码,不确定会不会考)

image-20260109161322290

 

第三章:OpenGL

OpenGL基础(编程题理论基础)

本部分是关于OpenGL的相关内容介绍,涉及到了很多标准库函数,可以有个大致的概念和印象,本部分笔记内容也没有全部将书上的内容都写入,因为不太清楚考的多有哪些,在后续的习题中可以返回来再看看,做题后才能知道哪些是重点考的函数,然后再统一记忆。

OpenGL(Open Graphics Library)的核心目标是渲染图形,即根据几何数据(点、线、面)和非几何数据(颜色、材质、纹理),在屏幕上绘制出 2D 或 3D 图像。它是一个底层的图形 API,提供了操作图形硬件的接口。专注于图形渲染,将几何数据转换为屏幕上的像素

了解定义是为了能和OpenCV的作用进行区分,方便理解而已,应该不存在考点的说法

基础语法

学习常规基础语法之前,先来聊聊OpenGL整个库的组成部分,个人认为是有助于了解命名规范和记忆函数作用

基于三大组成部分的命名规范

三大组成部分决定了函数的前缀,也决定了函数放在哪里,同时对于函数的作用也有一定的提示性。例如你看到glxxxx函数就立马能反应属于核心函数且与图形硬件交互有关


 

同时,基于三大组成部分,每个组成部分内肯定会定义一些常量,这些常量的命名也是和所属部分相关


 

OpenGL的函数后缀的设计也是有一定规范的,你可以看到很多函数名都是类似的3f3fv2d这种数字+字母的形式为函数名的后缀


当然,也存在一部分特殊的命名,例如GLint, GLfloat, GLdouble, GLubyte 等,确保跨平台兼容性。

程序基本框架(重要)

所有OpenGL相关的程序题的基础架构,哪怕这个题目不会写,也可以先把这个整体架构写上去,类似于高考公式分

如下代码,是运行一个最基本的OpenGL所需要的代码(教材P5),其运行后的效果是

一个 200×200 的窗口,标题是「First OpenGL!」:

#include<GL/freeglut.h>

void Paint() // 对象的描述
{
   glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区 GL_COLOR_BUFFER_BIT即代表颜色缓冲区
   glRectf(-0.8,-0.6,0.8,0.6); // 定义矩形 (-0.8,-0.6)~(0.8,0.6) 语法糖 封装了待会儿下面要说的 glBegin(GL_QUADS)操作
   glFlush(); // 强制 OpenGL 命令序列在有限的时间内完成执行 也代表绘图的结束
}

int main(int argc,char *argv[])
{
   // 初始化 GLUT,记录 main()的参数,理解不了的直接死记硬背,入参就是main函数的入参,只不过第一个argc参数需要取地址
   glutInit(&argc,argv);
   
   // 设置程序窗口的显示模式(GLUT_SINGLE表示设置为单缓存,GLUT_RGBA表示设置为RGBA颜色模式,除此之外还有GLUT_INDEX索引颜色模型,CLUT_DOUBLE双线是缓冲区,GLUT_DEPTH深度缓存),glutInitDisplayMode的默认模式是GLUT_SINGLE | GLUT_RGBA即RGBA颜色方式的单缓冲区,也就是说即使你不设置,默认也是GLUT_SINGLE | GLUT_RGBA
   // 需要注意的是 RGBA的颜色参数其实有四个(red,green,blue,alpha)前三个即代表红绿蓝的占比,最后一个alpha代表透明度,默认为1,代表完全不透明,四个参数的取值都是[0,1]
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
   
   glutInitWindowSize(200,200); // 初始化窗口位置。指定程序窗口在屏幕上的大小
   glutCreateWindow("First OpenGL!"); // 创建程序窗口,指定窗口标题
   glutDisplayFunc(Paint); // 指定场景绘制循环函数,必需
   glutMainLoop(); // 开始循环执行 OpenGL 命令
}

基本图元绘制

常见图元类型,对应教材P26

当你需要某种图元类型的绘画的时候,统一采用如下的格式/框架

glBegin(图元类型);
相关参数
glEnd();

例如

// 绘制 4 个独立的点,分别位于坐标 (-1,1)、(1,1)、(1,-1)、(-1,-1) 处
glBegin(GL_POINTS); // 绘点
// glVertex2f按照我们上面的命名规范可以拆分理解  
// gl(核心库函数)+Vertex(英文翻译为顶点)+2f(代表接收两个float类型的参数)
// 所以综合理解就是 核心库函数中的 利用两个float入参 可以绘画一个顶点 的方法
   glVertex2f(-1, 1);    // 左上点
   glVertex2f(1, 1);     // 右上点
   glVertex2f(1, -1);    // 右下点
   glVertex2f(-1, -1);   // 左下点
glEnd();



// 每两个顶点组成一条线段,这里将绘制两条交叉的线段,形成一个 "X" 形,一条连接 (-2,2) 到 (2,-2),另一条连接 (-2,-2) 到 (2,2)。
glBegin(GL_LINES); // 线段
   // 第一条线段
   glVertex2f(-2, 2);
   glVertex2f(2, -2);
   
   // 第二条线段
   glVertex2f(-2, -2);
   glVertex2f(2, 2);
glEnd();



//顶点依次连接形成连续的折线,从 (-2,0) 到 (0,2),再到 (2,0),最后到 (0,-2),形成一个不闭合的菱形轮廓。
glBegin(GL_LINE_STRIP); //折线(顶点依次相连)
   glVertex2f(-2, 0);
   glVertex2f(0, 2);
   glVertex2f(2, 0);
   glVertex2f(0, -2);
glEnd();


// 顶点依次连接形成折线,并且最后一个顶点会与第一个顶点连接形成闭合图形,这里将形成一个五边形轮廓
glBegin(GL_LINE_LOOP);  // 闭合折线
   glVertex2f(-2, 1);
   glVertex2f(0, 2);
   glVertex2f(2, 1);
   glVertex2f(1, -1);
   glVertex2f(-1, -1);
glEnd();

// 每三个顶点组成一个独立的三角形,这里将绘制两个三角形,它们共享一个顶点 (0,2),形成一个类似蝴蝶翅膀的形状
glBegin(GL_TRIANGLES);  // 三角形
   // 第一个三角形
   glVertex2f(-2, 1);
   glVertex2f(0, 2);
   glVertex2f(-1, -1);
   
   // 第二个三角形
   glVertex2f(0, 2);
   glVertex2f(2, 1);
   glVertex2f(1, -1);
glEnd();


//从第一个顶点开始,每新增一个顶点就与前两个顶点组成一个新三角形,形成连续相连的三角形带,这里会形成一个波浪状的条带图形。
glBegin(GL_TRIANGLE_STRIP);  //三角形带 下面有对应的图
   glVertex2f(-2, -1);
   glVertex2f(-1, 1);
   glVertex2f(0, -1);
   glVertex2f(1, 1);
   glVertex2f(2, -1);
glEnd();



// 以第一个顶点为中心,后续每个顶点与前一个顶点及中心点组成三角形,形成类似扇形的形状,这里会形成一个六边形。
glBegin(GL_TRIANGLE_FAN);  // 三角形扇 下面有对应的图
   glVertex2f(0, 0);  // 中心点
   glVertex2f(2, 0);
   glVertex2f(1, 2);
   glVertex2f(-1, 2);
   glVertex2f(-2, 0);
   glVertex2f(-1, -2);
   glVertex2f(1, -2);
   glVertex2f(2, 0);  // 闭合图形
glEnd();


// 所有顶点依次连接形成一个闭合的多边形,这里将绘制一个六边形,顶点按顺时针方向排列形成规则的六边形形状。
glBegin(GL_POLYGON);
   glVertex2f(-1, 2);
   glVertex2f(1, 2);
   glVertex2f(2, 0);
   glVertex2f(1, -2);
   glVertex2f(-1, -2);
   glVertex2f(-2, 0);
glEnd();

image-20251125213232238

image-20251125213756177

在书本的P26-3.3.4部分,介绍了一些OpenGL的预定义好的几何图形,也就是内置了一些写好的图形,可以不需要我们自己去绘制,如果觉得需要可以自己记忆背诵这些预定义的函数原型

基本图元属性

这一块是对上面的基本图元的属性的相关设置的函数介绍,对应教材P30-34,但是因为扫了一圈感觉实际考试中这些函数用的很少,故暂且不做介绍,遇到了再说

颜色与材质的设置

第四章和第五章:图形变换

第四章和第五章的内容是一起的,第四章的内容是第五章的铺垫,一起看了

几何变换理论基础

二维图像和三维图像的三种基本变换都是:平移,绕坐标轴旋转/旋转和缩放(P38,57)

三维复合变换

现实中和题目中,更多的是旋转和反射这些非基本变换,但是实际上所有的非基本变换都是由基本变化复合而来,通过将复合操作拆分为基本操作,就能很好的理解和解答

通用三维旋转(绕某个直线进行旋转)

通用反射轴反射

所谓的反射,其实就是我们常说的对称

 

通用反射面反射


按照PPT,第五章的重点就是上面那些,剩余的内容暂时先不看了

三维观察流水线

image-20260106214616966

模型变换

迷迷糊糊的,不知道怎么考,简要带过

概念

从模型坐标系到世界坐标系的变换。

3D建模之初,模型有自己的坐标系,以及相应的点坐标。如果放到一个世界坐标系中,需要将它自身的坐标点全部移动到给定位置。

方法

首先构造从世界坐标系到模型坐标系的变换,然后计算该变换的逆变换。(M = (RT)-1 = T-1R-1)

  1. 使模型坐标系的原点与世界坐标系的原点重合

  2. 使模型坐标系的坐标轴与世界坐标系的坐标轴重合

  3. 计算上述2个变换复合以后的逆变换。

投影

所谓投影就是:观察坐标系→投影坐标系,将三维场景投影到二维平面上。

分为平行投影透视投影,平行投影细分为正投影斜投影

第六章和第七章

按照CSDN上来看,第六章不重要第七章重要;按照PPT上来看,第六章重要第七章不重要....无语了.....依旧先水一水

顶点变化步骤

(1)指定视图和造型变换。

(2)指定投影变换。

(3)指定视口变换。

模型坐标 →(经过视图造型变换)→ 观察坐标 →(经过投影变换)→ 规范化坐标 →(经过视口变换)→ 窗口坐标

image-20260106215749167

第八章(记概念即可应该,无程序)

OpenGL 的光是由红、绿、蓝组成的。光源的颜色由其所发出的红绿蓝颜色的数量决定,材料的属性用反射的红绿蓝颜色的百分比表示

光源的构成:

光源由环境光成分(简称为泛光)、漫反射成分和镜面反射成分三部分构成。

材料颜色:

第九章:样条方法(计算题,重点,貌似年年考)

理论知识贼难,但是主要还是看Bézier曲线,所以最好直接略过数学理论基础,能直接看懂Bézier

Bézier基函数

image-20260107132200834

Bézier曲线

image-20260107133136665

三次Bézier曲线(P126-127)

三次Bézier曲线是最常用的Bézier曲线之一,按照上面的定义,其实就是一共了3+1个控制点的 Bézier 曲线

那么对应的表达式就是

image-20260107133339893

再根据Bézier基函数可以得到

image-20260107133430933

将上述两式子转化为矩阵形式,即为如下

image-20260107134116203

其中M(Bez)称之为三次Bézier样线的基本矩阵,M(geom)就是控制点组成的矩阵
用U依次乘上M(Bez)的每一行和M(geom)的对应行最后相加,就可以得到前面的表达式
(u^3 u^2 u 1) (-1 3 -3 1) p0 + (u^3 u^2 u 1) (3 -6 3 0) p1 ... = p(u)

聪明的大学生看不懂脑残的公式,有了大致的概念,下面直接做例题进行巩固

例题

image-20260107134740564


第十章开始其实就是另外一门课的内容,这本书本身就是二合一,前面是计算机图形学,第十章开始就是数字图像处理

第十章:数字图像处理概述(概念记忆)

 

第十一章:OpenCV(考点主要体现在程序题,不太会出现单独的章节内容出题)

猜测主要考的应该是Open CV GUI命令,对应P159的11.1

第十二章:PPT和CSDN上均无重点,估计不怎么考

纯数学概念,作为计算基础,本身不属于这门课的内容,也不会单独考

 

第十三章:图像变换

主要考傅立叶变化,理论基础太难,本科生无法战胜,这里只展示了代码部分的内容,想挑战理论部分的童鞋自行探索

傅立叶变化的核心代码过程就四步

载入灰度图片()调用imread函数
->转化为浮点类型(dft函数要求必须入参为浮点类型)
->傅立叶正交变化(dft函数)
->傅立叶逆变化(idft函数)

那么根据上述流程,核心代码就是如下

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
   Mat X = imread("lena.jpg", 0); // 1. 载入灰度图像
   Mat Y = (Mat1f)X;              // 2. 转换为浮点型(Mat1f是浮点型矩阵的简写)
   dft(Y, Y);                     // 3. 傅里叶正变换(核心)
   idft(Y, Y, DFT_SCALE);         // 4. 傅里叶逆变换(核心,DFT_SCALE是必要缩放)
}

稍微加一点辅助代码,方便输出和对比

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
   Mat X = imread("lena.jpg", 0); // 1. 载入灰度图像
   Mat Y = (Mat1f)X;              // 2. 转换为浮点型(Mat1f是浮点型矩阵的简写)
   dft(Y, Y);                     // 3. 傅里叶正变换(核心)
   idft(Y, Y, DFT_SCALE);         // 4. 傅里叶逆变换(核心,DFT_SCALE是必要缩放)
   Y = (Mat1b)Y;                  // 转换回uchar型方便显示(辅助步骤)
   
   imshow("src", X); // 显示原图(辅助)
   imshow("dst", Y); // 显示结果(辅助)
   waitKey();        // 等待按键(辅助)
}

书上P207的代码如下

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
   // 载入灰度图像
   Mat X = imread("lena.jpg", 0);
   // 载入图像失败的判断
   if (X.empty()) return -1;
   // 显示源图像
   imshow("源图像", X);

   // 源图像转换为实数图像(适配傅里叶变换的格式要求)
   X.convertTo(X, CV_32F);
   // 傅里叶正变换,输出复数图像
   dft(X, X, DFT_COMPLEX_OUTPUT);


   int h = X.rows, w = X.cols; // 获取源图像的行数、列数
   // 将靠近四角的元素改为0(与角部距离小于40)
   for (int u = 0; u < w; ++u)
  {
       for (int v = 0; v < h; ++v)
      {
           // 计算相对最近角部的偏移量
           int x = min(u, w - u), y = min(v, h - v);
           // 行列号为(v,u)的位置,若距离角部过近则置0
           if (x * x + y * y < 40 * 40) X.at<Vec2f>(v, u) = 0;
      }
  }


   // 傅里叶逆变换,只存储实部(DFT_SCALE用于缩放结果)
   idft(X, X, DFT_SCALE | DFT_REAL_OUTPUT);
   // 增强高亮度和对比度(归一化处理)
   normalize(X, X, 1, 0, NORM_INF);
   // 显示结果图像
   imshow("结果图像", X);
   // 等待按键(防止窗口一闪而过)
   waitKey();
}

 

第十四章:图像增强

图像平滑处理方法,参考P220中值滤波以及P222-223程序;图像的锐化,主要看拉普拉斯变换,程序题,本科生无法战胜理论

平滑处理方法

图像平滑处理的方法有三种:归一化块滤波器 ;高斯滤波器 ;中值滤波器,我们这里主要介绍中值滤波器的内容

中值滤波是一种非线性处理技术,可以用来抑制图像中的噪音,而且保持轮廓的清晰。

中值滤波使用当前像素旁的n(x) * n(y)个像素的灰度值的中值(中值不是平均值哈)作为当前像素的新的灰度值,即

image-20260109203016595

老规矩,聪明的大学生看不懂脑残的公式,直接上题解析

image-20260109204527300

为了方便定位和解析,我们可以建立一下坐标系

i\j-(i,j)表示某个数 0 1 2
0 5 2 4
1 7 9 1

我们现在要做的就是利用中值,将所有的元素重新计算新值后覆盖即可

首先来看第一个元素,即(0,0)=5

我们以(0,0)这个元素为中心附近的3x3范围内的数据都写出来,然后求中值即可

(0,0)附近的元素(包含自己)有(-1,-1);(0,-1) ;(1,-1) ;(-1,0) ;(0,0) ;(1,0) ;(-1,1) ;(0,1) ;(1,1)

对应的上边坐标的数字,可以发现有一些负坐标的数据,肯定在表格中是不存在的,我们此时注意题意,边界外元素当边界元素处理,例如(-1,-1)最近的边界元素自然是(0,0),那么也就是5 ;(1,-1)最近的元素是(1,0)那么也就是7

y以此类推模板里的 9 个值(超出的部分用边界像素f(0,0)=5补):

f(-1,-1)=5(i=-1→0,j=-1→0)、f(-1,0)=5(i=-1→0)、f(-1,1)=2(i=-1→0)、

f(0,-1)=5(j=-1→0)、f(0,0)=5(原像素)、f(0,1)=2(原像素)、

f(1,-1)=7(j=-1→0)、f(1,0)=7(原像素)、f(1,1)=9(原像素)。

把这 9 个值排序:2,2,5,5,5,5,7,7,9,取第 5 个值→5,所以 g(0,0)=5

同样的,将其余的几个都这样处理,分别得到新的数据,最后结果如下

image-20260109210159517

OpenCV中的平滑处理

OpenCV中提供了三个函数进行平滑处理

样例代码

// Smooth.cpp:OpenCV实现图像的三种平滑(模糊)处理
#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
   // 1. 读入灰度图像(路径是"lena-n.jpg",0表示以灰度模式读取)
   Mat X = imread("lena-n.jpg", 0);
   // 2. 判断图像是否读取失败(若失败则退出程序)
   if (X.empty()) return -1;
   // 3. 显示源图像
   imshow("源图像", X);


   Mat Y; // 用于存储每种模糊的结果图像
   // --------------- 均值模糊 ---------------
   blur(X, Y, {5,5}); // 参数:输入图像X、输出图像Y、模糊核大小5×5
   imshow("简单模糊", Y);

   // --------------- 中值模糊 ---------------
   medianBlur(X, Y, 5); // 参数:输入图像X、输出图像Y、模糊核大小5(必须是奇数)
   imshow("中值模糊", Y);

   // --------------- 高斯模糊 ---------------
   GaussianBlur(X, Y, {5,5}, 0, 0); // 参数:输入X、输出Y、核大小5×5、x/y方向标准差都是0
   imshow("高斯模糊", Y);


   // 等待按键(防止图像窗口一闪而过)
   waitKey();
}

图像的锐化

常见的锐化方法包括Sobel算子的锐化,拉普拉斯算子的锐化和使用方向模板的锐化,这里我们主要介绍OpenCV中对于拉普拉斯算子的锐化的支持

核心方法:

// Laplace.cpp:OpenCV实现拉普拉斯锐化(增强图像边缘)
#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
   // 1. 读入灰度图像(路径为"lena.jpg",0表示灰度模式)
   Mat X = imread("lena.jpg", 0);
   // 2. 校验图像是否读取成功(失败则退出程序)
   if (X.empty()) return -1;
   // 3. 显示源图像(窗口名"Source")
   imshow("Source", X);

   // 4. 执行拉普拉斯锐化
   // 参数说明:输入图像X、输出图像X、深度(-1表示与输入图像深度一致)、内核大小3×3
   Laplacian(X, X, -1, 3);

   // 5. 归一化处理(将结果亮度映射到0~255,方便观察锐化效果)
   normalize(X, X, 255, 0, NORM_INF);

   // 6. 显示拉普拉斯锐化后的结果
   imshow("Laplace", X);
   // 7. 等待按键(防止窗口一闪而过)
   waitKey();
}

 

第十五章:图像解析

边缘检测,考程序,参考 P249的Canny边缘检测代码

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
   // 1. 载入灰度图像(路径为"lena.jpg",0表示以灰度模式读取)
   Mat X = imread("lena.jpg", 0);
   // 2. 校验图像是否读取成功(失败则退出程序)
   if (X.empty()) return -1;
   // 3. 显示源图像(窗口名"Source")
   imshow("Source", X);


   Mat Y; // 存储Canny边缘检测的结果图像
   // --------------- 第一次Canny检测(低阈值=28)---------------
   // 参数说明:输入图像X、输出图像Y、低阈值=28、高阈值=3×28(Canny双阈值的常用比例:高阈值是低阈值的2~3倍)
   Canny(X, Y, 28, 3*28);
   // 显示该阈值下的边缘结果
   imshow("Canny:28,3×28", Y);


   // --------------- 第二次Canny检测(低阈值=68)---------------
   // 参数:输入图像X、输出图像Y、低阈值=68、高阈值=3×68
   Canny(X, Y, 68, 3*68);
   // 显示该阈值下的边缘结果
   imshow("Canny:68,3×68", Y);


   // 4. 等待按键(防止图像窗口一闪而过)
   waitKey();
}

 

猜题大王来猜题

第一章只讲了这两个点而且有一定的重复说明,疑似考试几率大


第六章



收到2条评论
avatar
ZealSinger 5 天前
三维的变换感觉考的概率不会很大,而且那几张写的内容也比较多,临时抱佛脚策略的童鞋那部分可以快速看,没必要都看了
回复
avatar
ZealSinger 5 天前
1.9更新
(1)新增第二章内容,主要添加了帧缓冲器的定义和计算题,以及DDA画线算法
(2)进度到了所有的章节基本都有涉及了
(3)结合录音,ppt,题目进行了部分修改
(4)添加了“猜题大王模块”
回复