资源描述
复习参考题
3、请使用 OpenGL 和 GLUT 编写一个简单的图形程序,用于显示一个填充的白色矩形。其 中矩形规定为(-0.8, -0.8)~(0.8, 0.8),程序窗口的大小为(200, 200),标题为“白色矩形”。
#include <GL/glut.h>
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.8, -0.8, 0.8, 0.8);
glFlush();
}
int main()
{
glutInitWindowSize(200, 200);
glutCreateWindow("白色矩形");
glutDisplayFunc(Paint);
glutMainLoop();
}
4、 请使用 OpenGL 和 GLUT 编写一个简单的图形程序,用于显示一个填充的红色三角形。 其中三角形的顶点分别是(-0.8, -0.8)、(0.8, -0.8)和(0, 0.8),程序窗口大小为(200, 200),标题 为“红色三角形”。
#include <GL/glut.h>
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1, 0, 0);
glBegin(GL_TRIANGLES);
glVertex2d(-0.8, -0.8), glVertex2d(0.8, -0.8), glVertex2d(0, 0.8); glEnd();
glFlush();
}
int main()
{ glutInitWindowSize(200, 200);
glutCreateWindow("红色三角形!");
glutDisplayFunc(Paint);
glutMainLoop();
}
5、 请使用 OpenGL 和 GLUT 编写一个简单的图形程序,用于演示点的反走样效果。要求使 用线段(-0.6, -0.6)~(0.6, 0.6)上均匀分布的 5 个点(含端点),点的大小为 10.5 像素,程序 窗口的大小为(200, 200),标题为“点的反走样”。
#include <GL/glut.h>
void Paint()
{
double x;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS);
for(x = - 0.6; x <= 0.6; x += 0.3)
glVertex2f(x, x);
glEnd();
glFlush();
}
int main()
{ glutInitWindowSize(200, 200);
glutCreateWindow("点的反走样");
glutDisplayFunc(Paint);
glPointSize(10.5);
glEnable(GL_POINT_SMOOTH);
glutMainLoop();
}
6、 请使用 OpenGL 和 GLUT 编写一个简单的图形程序,用于演示线段的反走样效果。其中 线段的端点为(-0.6, -0.3)和(0.6, 0.3),线宽为 4.5 像素,程序窗口的大小为(200, 200),标题为“线段的反走样”。
#include <GL/glut.h>
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
glVertex2f(-0.6, -0.3), glVertex2f(0.6, 0.3);
glEnd();
glFlush();
}
int main()
{
glutInitWindowSize(200, 200);
glutCreateWindow("线段的反走样");
glutDisplayFunc(Paint);
glLineWidth(4.5);
glEnable(GL_LINE_SMOOTH);
glutMainLoop();
}
}}
25、请使用 OpenGL、GLU 和 GLUT 编写一个三维犹他茶壶程序。其中茶壶的半径为 1 单 位,并远移 6.5 单位;观察体规定为:视场角=30 度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“尤他茶壶”。
#include <GL/glut.h>
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluPerspective(30, 1, 1, 100);
glTranslatef(0, 0, - 6.5);
glutSolidTeapot(1);
glFlush();
}
int main()
{
glutInitWindowSize(200, 200);
glutCreateWindow("尤他茶壶");
glutDisplayFunc(Paint);
glutMainLoop();
}
26、 请使用 OpenGL 和 GLUT 编写一个显示线框球体的简单图形程序。其中球体的半径为 0.8,经线数为 24,纬线数为 12,并绕x 轴旋转 30 度,程序窗口的大小为(200, 200),标题 为“线框球”。
#include <GL/glut.h>
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glRotated(30, 1, 0, 0);
glutWireSphere(0.8, 24, 12);
glFlush();
}
int main()
{
glutInitWindowSize(200, 200);
glutCreateWindow("线框球");
glutDisplayFunc(Paint);
glutMainLoop();
}
27、 请使用 OpenGL 和 GLUT 编写一个显示线框椭球体的简单图形程序。其中椭球体的两 极方向为上下方向,左右方向的半径为 0.98,上下方向的半径为 0.49,前后方向的半径为0.6,经线数为 48,纬线数为 24,使用正投影,裁剪窗口为(-1, -0.5)~(1, 0.5),程序窗口的大 小为(400, 200),标题为“线框椭球”。
#include <GL/glut.h>
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluOrtho2D(-1, 1, -0.5, 0.5);
glScaled(0.98, 0.49, 0.6);
glRotated(-90, 1, 0, 0); // 调整两极方向
glutWireSphere(1, 48, 24);
glFlush();
}
int main()
{
glutInitWindowSize(400, 200);
glutCreateWindow("线框椭球");
glutDisplayFunc(Paint);
glutMainLoop();
}
28、 请使用 OpenGL、GLU 和 GLUT 编写一个三维犹他茶壶程序。其中茶壶的半径为 1 单 位,并远移 6.5 单位;观察体规定为:视场角=30 度,宽高比=1,近=1,远=100;程序窗口 的大小为(200, 200),标题为“旋转的尤他茶壶”。茶壶绕 z 轴不断旋转,旋转的时间间隔为 25 毫秒,角度间隔为 2 度。注意旋转角度必须限定在 0~360 度以内。
#include <gl/glut.h>
int angle = 0;
void Paint()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluPerspective(30, 1, 1, 100);
glTranslatef(0, 0, -6.5);
glRotated(angle, 0, 0, 1);
glutSolidTeapot(1);
glFlush();
}
void timer(int millis)
{
angle = (angle + 2) % 360;
glutPostRedisplay();
glutTimerFunc(millis, timer, millis);
}
int main()
{
glutInitWindowSize(200, 200);
glutCreateWindow("旋转的尤他茶壶");
glutTimerFunc(25, timer, 25);
glutDisplayFunc(Paint);
glutMainLoop();
}
29、 请使用 OpenGL、GLU 和 GLUT 编写一个简单的多视口演示程序。要求:在屏幕窗口 左下角的 1/4 部分显示一个红色的填充正三角形;在屏幕窗口右上角的 1/4 部分显示一个绿 色的填充正方形;三角形和正方形的左下角顶点坐标值均为(0, 0),右下角顶点坐标值均为(1, 0);裁剪窗口均为(-0.1, -0.1)~(1.1, 1.1);程序窗口的大小为(200, 200),标题为“多视口演示”。
#include <gl/glut.h>
void Viewport(int x, int y, int w, int h)
{
glViewport(x, y, w, h);
glLoadIdentity();
gluOrtho2D(-0.1, 1.1, -0.1, 1.1);
}
void Triangle()
{
glBegin(GL_TRIANGLES);
glVertex2d(0, 0);
glVertex2d(1, 0);
glVertex2d(0.5, 0.8660);
glEnd();
}
void Paint()
{
int w = glutGet(GLUT_WINDOW_WIDTH) / 2;
int h = glutGet(GLUT_WINDOW_HEIGHT) / 2;
glClear(GL_COLOR_BUFFER_BIT);
Viewport(0, 0, w, h);
glColor3f(1, 0, 0);
Triangle();
Viewport(w, h, w, h);
glColor3f(0, 1, 0);
glRectd(0, 0, 1, 1);
glFlush();
}
int main()
{
glutInitWindowSize(200, 200); glutCreateWindow("多视口演示");
glutDisplayFunc(Paint);
glutMainLoop();
}
30、请使用 OpenCV 编写一个简单的程序,用于从当前目录读入并显示一幅图像(例如当 前目录中的 lena.jpg)。
#include<opencv/cv.h> // CV
#include<opencv/highgui.h> // GUI
int main()
{
IplImage *im = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR); // 声明IplImage指针,载入彩色图像
if(im == 0) return -1; // 载入失败
cvNamedWindow("First OpenCV", CV_WINDOW_AUTOSIZE); //创建窗口
cvShowImage("First OpenCV", im); // 显示图像
while(cvWaitKey(0) != 27) {} // 等待按Esc键
cvDestroyWindow("First OpenCV"); // 销毁窗口
cvReleaseImage(&im); // 释放图像
}
31、 请使用 OpenCV 编写一个简单的程序,该程序首先读入一幅彩色图像(例如当前目录 中的 lena.jpg),然后将这幅彩色图像的 3 个通道分离出来,得到 3 幅灰度图像,最后显示 这 3 幅灰度图像并释放相关资源。
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
IplImage* img;
int y,x;
img = cvLoadImage("lena.jpg ");//加载图像lena.jpg
/* 将3通道图像 分解成 3幅单通道的图像 */
IplImage* b_img ,*g_img,*r_img; //声明三个图像变量
/**** 给三个单通图像 分配内存空间 *****/
b_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
g_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
r_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
for(y=0;y<img->height;y++)
{//将图像指针偏移到第y行
unsigned char* prow = (unsigned char*)( img->imageData + y* img->widthStep);
unsigned char* brow = (unsigned char*)(b_img->imageData + y*b_img->widthStep);
unsigned char* grow = (unsigned char*)(g_img->imageData + y*g_img->widthStep);
unsigned char* rrow = (unsigned char*)(r_img->imageData + y*r_img->widthStep);
for(x=0;x<img->width;x++)
{//将B通道 G通道 R通道的值 分别拷贝到3个单通道的图像中去
brow[x] = prow[3*x + 0] ; //拷贝B通道的值prow[3*x + 0] 到 单通道图像b_img
grow[x] = prow[3*x + 1] ; //拷贝G通道的值prow[3*x + 0] 到 单通道图像g_img
rrow[x] = prow[3*x + 2] ; //拷贝R通道的值prow[3*x + 0] 到 单通道图像r_img
}
}
/***** 创建3个窗口 *****/
cvNamedWindow("b");
cvNamedWindow("g");
cvNamedWindow("r");
/***** 显示b g r三个通道的图像 *****/
cvShowImage("b" , b_img);
cvShowImage("g" , g_img);
cvShowImage("r" , r_img);
/***** 显示大图像 ******/
cvNamedWindow("1");
cvShowImage("1",img);
cvWaitKey(0); //等待按键
cvReleaseImage(&img); //释放内存空间
}
32、 使用 OpenCV 编写一个演示傅立叶变换和逆变换的程序。该程序首先装入一幅灰度图 像并显示该图像(例如当前目录中的 lena.jpg),然后对该图像进行傅立叶正变换,对得到 的结果进行傅立叶逆变换,显示得到的结果以便与原图像进行比对。
#include<opencv/cv.h>
#include<opencv/highgui.h>
int main()
{
CvMat *X = cvLoadImageM("lena.jpg", 0);
CvMat *Y = cvCreateMat(X->rows, X->cols, CV_64F);
cvScale(X, Y, (double)1 / 255, 0);
cvDFT(Y, Y, CV_DXT_FORWARD, 0);
cvDFT(Y, Y, CV_DXT_INVERSE_SCALE, 0);
cvShowImage("src", X), cvShowImage("dst", Y); cvWaitKey(0);
cvReleaseMat(&X), cvReleaseMat(&Y); cvDestroyAllWindows();
}
33、 使用 OpenCV 编写一个程序,该程序对一幅彩色图像(例如当前目录中的 lena.jpg)进 行一次中值模糊,要求分别显示源图像和模糊化以后的图像。其中内核大小为 5×5。
#include<opencv/cv.h>
#include<opencv/highgui.h>
int main()
{
CvMat *X = cvLoadImageM("lena.jpg", 1); cvShowImage("src", X);
cvSmooth(X, X, CV_MEDIAN, 5, 5, 0, 0); cvShowImage("dst", X);
cvWaitKey(0);
cvReleaseMat(&X);
cvDestroyAllWindows();
}
34、 使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行Sobel 锐化,要求显示锐化以后的图像。其中内核大小为 3×3,x 和 y 方向均使用 1 阶差 分。
#include<opencv/cv.h>
#include<opencv/highgui.h>
int main()
{
CvMat *X = cvLoadImageM("lena.jpg", 1);
cvShowImage("src", X);
CvMat *tmp = cvCreateMat(X->rows, X->cols, CV_16SC3);
cvSobel(X, tmp, 1, 1, 3);
cvConvert(tmp, X);
cvShowImage("dst", X);
cvWaitKey(0);
cvReleaseMat(&X), cvReleaseMat(&tmp);
cvDestroyAllWindows();
}
35、 使用 OpenCV 编写一个程序,该程序使用大小为 3 的正方形模板(锚点位于模板中心) 对源图像(例如当前目录中的二值图像 image-j.bmp)进行 2 次腐蚀操作,要求显示源图像 和腐蚀以后的图像。
#include<opencv/cv.h>
#include<opencv/highgui.h>
int main()
{
CvMat *X = cvLoadImageM("lena.jpg", 1);
cvShowImage("src", X);
CvMat *tmp = cvCreateMat(X->rows, X->cols, CV_16SC3);
cvSobel(X, tmp, 1, 1, 3);
cvConvert(tmp, X);
cvShowImage("dst", X);
cvWaitKey(0);
cvReleaseMat(&X), cvReleaseMat(&tmp);
cvDestroyAllWindows();
}
36、 使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进 行直方图均衡化,要求分别显示源图像和均衡化以后的图像。
#include <opencv/cv.h>
#include <opencv/highgui.h>
int main()
{
CvMat *X = cvLoadImageM("lena.jpg", 0);
cvShowImage("Source image", X);
cvEqualizeHist(X, X);
cvShowImage("Equalized Image", X);
cvWaitKey(0);
cvReleaseMat(&X);
cvDestroyAllWindows();
}
37、 使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进 行二值化变换,要求分别显示源图像和二值化以后的图像。其中二值化阈值为 127,高亮度 改为 255。
#include <opencv/cv.h>
#include <opencv/highgui.h>
int main()
{
CvMat *X = cvLoadImageM("lena.jpg", 0);
cvShowImage("Source image", X);
cvThreshold(X, X, 127, 255, CV_THRESH_BINARY);
cvShowImage("Binary Image", X);
cvWaitKey(0);
cvReleaseMat(&X);
cvDestroyAllWindows();
}
38、使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进
行 Canny 边缘检测,要求分别显示源图像和检测到的边缘。其中小阈值为 50,大阈值为 150, 内核大小为 3。
#include <opencv/cv.h>
#include <opencv/highgui.h>
int main()
{
CvMat *X = cvLoadImageM("lena.jpg", 0);
cvShowImage("Source image", X);
cvCanny(X, X, 50, 150, 3);
cvShowImage("Canny Image", X);
cvWaitKey(0);
cvReleaseMat(&X);
cvDestroyAllWindows();
}
展开阅读全文