用C++写一个三维显示的图像,输入参数为:已知mat类型的三维离散点坐标x,y,z,并对代码进行注释
时间: 2024-04-30 14:25:03 浏览: 139
图像的三维显示源代码(图像处理)
5星 · 资源好评率100%
以下是一个简单的用OpenGL在窗口中绘制三维点云的示例代码,输入参数为已知的三维离散点坐标x,y,z。代码注释在代码中标出。
```cpp
#include <GL/glut.h> //OpenGL头文件
#include <opencv2/opencv.hpp> //OpenCV头文件
using namespace cv;
// 定义窗口大小
const int window_width = 640;
const int window_height = 480;
// 定义三维离散点坐标的矩阵
Mat points3d;
// OpenGL 初始化函数
void init()
{
// 设置背景颜色为黑色
glClearColor(0.0, 0.0, 0.0, 0.0);
// 设置点的大小
glPointSize(2.0);
// 设置投影矩阵,使用透视投影,视角为 45 度
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, window_width / window_height, 0.1, 100.0);
// 设置模型视图矩阵,将相机位置设置为 (0, 0, 5),并将相机方向设置为 (0, 0, -1),将上向量设置为 (0, 1, 0)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
}
// OpenGL 显示函数
void display()
{
// 清除颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);
// 将矩阵模式设置为模型视图矩阵
glMatrixMode(GL_MODELVIEW);
// 将点云绘制成白色
glColor3f(1.0, 1.0, 1.0);
// 遍历三维离散点坐标矩阵并绘制点
glBegin(GL_POINTS);
for (int i = 0; i < points3d.rows; i++) {
glVertex3d(points3d.at<double>(i, 0), points3d.at<double>(i, 1), points3d.at<double>(i, 2));
}
glEnd();
// 强制执行缓冲区交换
glutSwapBuffers();
}
int main(int argc, char** argv)
{
// 读入三维离散点坐标矩阵
points3d = (Mat_<double>(5, 3) << 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1);
// 初始化 OpenGL
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(window_width, window_height);
glutCreateWindow("3D Point Cloud");
// 设置 OpenGL 初始化函数和显示函数
init();
glutDisplayFunc(display);
// 进入主循环
glutMainLoop();
return 0;
}
```
这个示例代码使用了 OpenGL 和 OpenCV 库,通过遍历三维离散点坐标矩阵并将其绘制成点云的形式展示在窗口中。
阅读全文