标签:计算机视觉
(个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42779341)
研究内容
图形的概念:计算机图形学的研究对象
图形的要素
图形表示法
与相关学科的关系
发展历史_软件发展及软件标准
计算机图形学的应用
当前的研究动态
视频显示设备
刷新式CRT
光栅扫描显示器
随机扫描显示器
光栅扫描系统
输入设备
硬拷贝设备
图形软件
OpenGL
OpenGL简介
核心库(GL):基本库。
实用函数库(GLU):处理专门操作的附加库。
实用函数工具包(GLUT):实用函数工具包。
OpenGL基本语法
XXX
图元的生成(扫描转换):
画线算法
void lineDDA(int x0, int y0, int xEnd, int yEnd) {
int dx = xEnd - x0, dy = yEnd - y0, steps, k;
float xIncrement, yIncrement, x = x0, y = y0;
if (abs(dx) > abs(dy)) //判断斜率是否大于
steps = abs(dx);
else
steps = abs(dy);
xIncrement = float(dx) / float(steps);
yIncrement = float(dy) / float(steps);
setPixel(round(x), round(y));
for (k = 0; k < steps; k++) {
x += xIncrement;
y += yIncrement;
setPixel(round(x), round(y));
}
}
// 下面的是斜率 < 1.0 的程序
// 斜率 > 1.0 的只要交换 x x和 y 方向的规则即可
void lineBres(int x0, int y0, int xEnd, int yEnd) {
int dx = fabs(xEnd - x0);
int dy = fabs(yEnd - y0);
int p = 2 * dy - dx;
int twoDy = 2 * dy, twoDyMinusDx = 2 * (dy - dx);
int x, y;
if (x0 > xEnd) {
x = xEnd;
y = yEnd;
xEnd = x0;
} else {
x = x0;
y = y0;
}
setPixel(x, y);
while (x < xEnd) {
x++;
if (p < 0)
p += twoDy;
else {
y++;
p += twoDyMinusDx;
}
setPixel(x, y);
}
}
圆 圆弧 椭圆的生成
F(X+1,Y+0.5)>=0
,则下一个点是(X+2,Y-0.5)
F(X+1,Y+0.5)<0
,则下一个点是(X+2,Y-1.5)
多边形填充区
颜色和查找表
点的属性
线的属性
填充区属性
通用扫描线填充算法
不规则边界区域填充方法
void flood_fill_4(int x, y, old_color, fill_color) {
int current;
current = read_pixel(x, y);
if (current == old_color && current != fill_color) {
write_pixel(x, y, fill_color);
flood_fill_4(x - 1, y, old_color, fill_color); /* 左 */
flood_fill_4(x, y + 1, old_color, fill_color); /* 上 */
flood_fill_4(x + 1, y, old_color, fill_color); /* 右 */
flood_fill_4(x, y - 1, old_color, fill_color); /* 下 */
}
}
void Scanline(int x, int y) {
if (x < 0 || x >= ROW || y < 0 || y >= COL || vis[x][y])
return;
int xl = 0, xr = 0, i;
drawPoint(x, y, 2);
for (xl = x - 1; xl >= 0; xl--) {
if (!vis[xl][y])
drawPoint(xl, y, 2);
else
break;
}
for (xr = x + 1; xr < ROW; xr++) {
if (!vis[xr][y])
drawPoint(xr, y, 2);
else
break;
}
for (i = xl + 1; i < xr; i++) {
Scanline(i, y - 1);
Scanline(i, y + 1);
}
}
反走样
基本的二维几何变换
x‘=x+tx, y‘=y+ty
x‘=xcosθ-ysinθ, y‘=xsinθ+ycosθ
x‘=sxx, y‘=syy
矩阵表示和齐次坐标
逆变换
二维复合变换
其它二维变换
二维坐标系间的变换
M = R(- θ)*T(-x0,-y0)
三维空间的几何变换
// x 轴
0 1 0 0
0 C -S 0
0 S C 0
0 0 0 1
// y 轴
C 0 S 0
0 1 0 0
-S 0 C 0
0 0 0 1
// z 轴
C -S 0 0
S C 0 0
0 0 1 0
0 0 0 1
R(θ)=T(x1,y1,z1)·Rx(α)T·Ry(β)T·Rz(θ)·Ry(β)·Rx(α)·T(-x1,-y1,-z1)
Sx 0 0 0
0 Sx 0 0
0 0 Sz 0
0 0 0 1
三维复合变换
三维坐标系间的变换
Ux1 Ux2 Ux3 0
Uy1 Uy2 Uy3 0
Uz1 Uz2 Uz3 0
0 0 0 1
仿射变换
二维观察流水线
OpenGL二维观察函数
gluOrtho2D(xwmin, xwmax, ywmin, ywmax);
glViewport(xvmin, yvmin, width, height);
二维点的裁剪
xwmin <= x <= xwmax;
ywmin <= y <= ywmax;
则保留该点.二维线的裁剪
位 4 3 2 1
坐标区 上 下 右 左
up<=q
的参数式再处理三维观察概念综述
三维观察流水线
三维观察坐标参数
世界坐标系到观察 坐标系的变换
M = R * T
投影变换
正投影
斜投影
透视投影
多面体
OpenGL多面体函数
// 三棱锥
glutWiredTetrahedron();
glutSolidTetrahedron();
// 立方体
glutWireCube(edgeLength);
glutSolidCube(edgeLength);
// 八面体
glutWireOctahedron();
glutSolidOctahedron();
// 12
glutWireDodecahedron();
glutSolidDodecahedron();
// 20
glutWireIcosahedron();
glutSolidIcosahedron();
曲面
二次曲面
x=rcosΦcosθ (-π/2 <=Φ<=π/2)
y=rcosΦsinθ (-π<=θ<=π)
z=rsinθ
可见面判别(隐藏面消除)算法
Back-Face Detection 后向面判别
Depth-Buffer Method 深度缓冲算法
depthBuff(x, y) = 1.0
, frameBuff(x, y) = backgndColor
z < depthBuff(x, y)
,就更新A-Buffer Method A-缓冲算法
Scan-Line Method 扫描线算法
Depth-Sorting Method 深度-排序算法
一道大题,主要考察大家对基本图形应用与OPENGL编程框架的掌握。
OPENGL语句,只需要理解,不需要记忆。
标签:计算机视觉
原文地址:http://blog.csdn.net/hcbbt/article/details/42779341