HNUST(王志喜)图形图像编程复习题

1.请使用OpenGL 和GLUT 编写一个简单的图形程序,用于显示一个填充的紫色梯形。其中梯形的4 个顶点分别(-0.8,-0.4)、(0.4, -0.4)、(0.4, 0.4)和(-0.4, 0.4),程序窗口的大小为(300, 300),标题为“紫色梯形”。
包括梯形,矩形等多边形图形可使用glBegin(GL_QUADS),glBegin(GL_POLYGON)。三角形glBegin(GL_TRIANGLES)。

#include <GL/glut.h>
void display(){
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_QUADS);
	glColor3f(0.5, 0, 0.5);//设置颜色,(x,y,z)分别代表(红,绿,蓝)
	glVertex2f(-0.8, -0.4);
	glVertex2f(0.4, -0.4);
	glVertex2f(0.4, 0.4);
	glVertex2f(-0.4, 0.4);
	glEnd();
	glFlush();
}
int main(int argc,char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
	glutInitWindowSize(300, 300);//设置框体的大小
	glutCreateWindow("紫色梯形");//创建窗口并设置名称
	glutDisplayFunc(display);//设置显示函数
	glutMainLoop();
	return 0;
}

2.请使用OpenGL 和GLUT 编写一个显示线框球体的简单图形程序。其中球体的半径为0.8,经线数为24,纬线数为12,并绕x 轴旋转40 度,程序窗口的大小为(300, 300),标题为“线框球”。

#include<GL/glut.h>
void display()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	glRotatef(40.0, 1.0, 0.0, 0.0);//旋转角度
	glColor3f(1.0, 1.0, 1.0);
	glutWireSphere(0.8, 24, 12);//画三维球体
	glPopMatrix();
	glFlush();
}
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
	glutInitWindowSize(300, 300);
	glutCreateWindow("线框球");
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

3.请使用OpenGL和GLUT编写一个显示线框椭球体的简单图形程序。其中椭球体的两极方向为上下方向,左右方向的半径为0.98,上下方向的半径为0.49,前后方向的半径为0.6,经线数为48,纬线数为24,使用正投影,裁剪窗口为(-1, -0.5)~(1, 0.5),程序窗口的大小为(400, 200),标题为“线框椭球”。

#include<GL/glut.h>

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glPushMatrix();
	glScalef(0.98, 0.49, 0.6);
	glColor3f(1.0, 1.0, 1.0);
	glutWireSphere(1.0, 48, 24);
	glPopMatrix();
	glFlush();
}
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
	glutInitWindowSize(400, 200);
	glutCreateWindow("线框球");
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

4.请使用 OpenGL、GLU 和 GLUT 编写一个显示线框立方体的程序。其中立方体的半径为 1.5 单位,并首先绕(0, 0, 0)~(1, 1, 0)旋转 30 度,然后远移 6.5 单位;观察体规定为:视场角=30度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“线框立方体”。

#include <GL/glut.h>

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空颜色缓冲区和深度缓冲区
    gluPerspective(30.0, 1.0, 1.0, 100.0); // 设置透视投影,视场角=30度,宽高比=1,近=1,远=100
    glLoadIdentity(); // 重置当前矩阵为单位矩阵
    glTranslatef(0.0, 0.0, -6.5); // 远移6.5单位 
    glRotatef(30.0, 1.0, 1.0, 0.0); // 绕(1, 1, 0)旋转30度
    glutWireCube(1.5); // 绘制线框立方体,半径为1.5
    glFlush(); // 刷新绘图
}

void reshape(int w, int h) {
    glViewport(0, 0, (GLsizei)w, (GLsizei)h); // 设置视口
    glMatrixMode(GL_PROJECTION); // 设置投影矩阵
    glLoadIdentity(); // 重置当前矩阵为单位矩阵
    if (w <= h) {
        glOrtho(-1.5, 1.5, -1.5 * (GLfloat)h / (GLfloat)w, 1.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
    }
    else {
        glOrtho(-1.5 * (GLfloat)w / (GLfloat)h, 1.5 * (GLfloat)w / (GLfloat)h, -1.5, 1.5, -10.0, 10.0);
    }
    glMatrixMode(GL_MODELVIEW); // 设置模型视图矩阵
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(200, 200);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("线框立方体");
    //init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

5.请使用OpenCV 编写一个简单的程序,用于从当前目录读入并显示一幅彩色图像(例如当前目录中的lena.jpg)

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main() {
    // 读取图像
    Mat img = imread("D:/tom.jpg", IMREAD_COLOR);
    // 创建窗口
    namedWindow("Window", WINDOW_NORMAL);
    // 显示图像
    imshow("Window", img);
    // 等待用户按键,然后关闭窗口
    waitKey(0);
    return 0;
}

6.使用OpenCV 编写一个演示傅立叶变换和逆变换的程序。该程序首先装入一幅灰度图像并显示该图像(例如当前目录中的lena.jpg),然后对该图像进行傅立叶正变换,对得到的结果进行傅立叶逆变换,显示得到的结果以便与原图像进行比对。

int main() {
// 装入一幅灰度图像
Mat image = imread("D:/tom.jpg", IMREAD_GRAYSCALE);
// 显示原图像
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", image);
waitKey(0);
// 确保图像的尺寸是2的幂次方
int m = getOptimalDFTSize(image.rows);
int n = getOptimalDFTSize(image.cols);
Mat padded;
copyMakeBorder(image, padded, 0, m - image.rows, 0, n - image.cols, BORDER_CONSTANT, Scalar::all(0));
// 确保图像的数据类型是浮点型
padded.convertTo(padded, CV_32F);
// 进行傅立叶正变换
Mat fourierTransform;
dft(padded, fourierTransform, DFT_COMPLEX_OUTPUT);
// 分离实部和虚部
Mat planes[2];
split(fourierTransform, planes);
magnitude(planes[0], planes[1], planes[0]);
Mat magnitudeImage = planes[0];
// 对数变换
magnitudeImage += Scalar::all(1);
log(magnitudeImage, magnitudeImage);
// 归一化
normalize(magnitudeImage, magnitudeImage, 0, 1, NORM_MINMAX);
// 显示傅立叶变换结果
namedWindow("Fourier Transform", WINDOW_NORMAL);
imshow("Fourier Transform", magnitudeImage);
waitKey(0);
// 进行傅立叶逆变换
Mat inverseTransform;
dft(fourierTransform, inverseTransform, DFT_INVERSE | DFT_REAL_OUTPUT);
// 显示傅立叶逆变换结果
namedWindow("Inverse Transform", WINDOW_NORMAL);
imshow("Inverse Transform", inverseTransform);
waitKey(0);
return 0;
}

7.使用OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的lena.jpg)进行Laplace锐化,要求显示锐化以后的图像。其中内核大小为3×3。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
	Mat img = imread("D:/tom.jpg", IMREAD_GRAYSCALE);
	namedWindow("Original Image", WINDOW_NORMAL);
	imshow("Original Image", img);
	Mat result;
	Laplacian(img, result, CV_16S, 3, 1, 0, BORDER_DEFAULT);
	convertScaleAbs(result, result);
	namedWindow("Result Image", WINDOW_NORMAL);
	imshow("Result Image", result);
	waitKey(0);
	return 0;
}

8.使用OpenCV编写一个程序,该程序对一幅灰度图像进行Sobel锐化,要求显示锐化以后的图像。其中内核大小为3×3,x和y方向均使用1阶差分。

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

int main() {
    // 读取图像
    Mat img = imread("D:/tom.jpg", 0);
    // 创建窗口
    namedWindow("Source", WINDOW_NORMAL);
    // 显示图像
    imshow("Source", img);
    //使用Sobel,内核大小3*3
    Sobel(img, img, -1, 1, 1, 3);
    namedWindow("Sobel", WINDOW_NORMAL);
    imshow("Sobel", img);
    // 等待用户按键,然后关闭窗口
    waitKey(0);
    return 0;
}

9.使用OpenCV编写一个程序,该程序对一幅彩色图像进行一次中值模糊,要求分别显示源图像和模糊化以后的图像。其中内核大小为5×5。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat img = imread("D:/tom.jpg", IMREAD_COLOR);
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", img);
Mat result;
medianBlur(img, result, 5);
namedWindow("Result Image", WINDOW_NORMAL);
imshow("Result Image", result);
waitKey(0);
return 0;
}

10.使用OpenCV编写一个程序,该程序对一幅灰度图像进行二值化变换,要求分别显示源图像和二值化以后的图像。其中二值化阈值为127,高亮度改为255。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat img = imread("D:/tom.jpg", IMREAD_GRAYSCALE);
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", img);
Mat result;
threshold(img, result, 127, 255, THRESH_BINARY);
namedWindow("Result Image", WINDOW_NORMAL);
imshow("Result Image", result);
waitKey(0);
return 0;
}

11.使用OpenCV编写一个程序,该程序对一幅灰度图像进行Canny边缘检测,要求分别显示源图像和检测到的边缘。其中小阈值为50,大阈值为150,内核大小为3。

int main()
{
Mat img = imread("D:/tom.jpg", IMREAD_GRAYSCALE);
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", img);
Mat edges;
Canny(img, edges, 50, 150, 3);
namedWindow("Edges", WINDOW_NORMAL);
imshow("Edges", edges);
waitKey(0);
return 0;
}

12.使用OpenCV编写一个程序,该程序对一幅彩色图像(例如当前目录中的lena.jpg)使用指定的模板图像(例如当前目录中的Template.jpg)进行模板匹配。要求使用分别使用OpenCV支持的6种匹配算法分别进行模板匹配,源图像中与模板最匹配的区域分别 使用一个指定颜色的矩形标记。

int main()
{
Mat img = imread("D:/tom.jpg");
Mat templ = imread("D:/xm.jpg");
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", img);
namedWindow("Template Image", WINDOW_NORMAL);
imshow("Template Image", templ);
for (int i = 0; i < 6; i++)
{
Mat result;
matchTemplate(img, templ, result, i);
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
double minVal, maxVal;
Point minLoc, maxLoc;
Point matchLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
if (i == 0 || i == 1)
{
matchLoc = minLoc;
}
else
{
matchLoc = maxLoc;
}
rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 0, 255), 2, 8, 0);
}
namedWindow("Result Image", WINDOW_NORMAL);
imshow("Result Image", img);
waitKey(0);
return 0;
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值