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;
}