使用PyOpenGL绘制真实感静态石墙程序

需积分: 0 0 下载量 53 浏览量 更新于2024-08-05 收藏 479KB PDF 举报
"该资源是一个使用Python和PyOpenGL库创建真实感静态景物的程序,具体为绘制一个石墙。程序作者是陈旭锋,它需要Python3、numpy以及PyOpenGL库来运行,并且推荐使用PyCharm作为开发工具。程序通过定义一个`StoneWall`类来组织代码,包含了石墙的参数设置、顶点坐标、纹理坐标以及表面划分等信息。" 在《PJ2程序说明1》中,主要涉及的知识点包括: 1. **OpenGL**: OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。在Python中,通常使用PyOpenGL库来调用OpenGL的功能。在这段代码中,`from OpenGL.GL import *`、`from OpenGL.GLUT import *`和`from OpenGL.GLU import *`分别导入了OpenGL的核心模块、GLUT(通用工具集)模块和GLU(OpenGL实用库)模块,这些模块提供了与OpenGL交互所需的基本函数。 2. **numpy**: numpy是Python中的科学计算库,主要用于处理数组和矩阵运算。在这个程序中,numpy被用来存储和操作数据,例如定义石墙的视图矩阵、眼睛位置、上向量和观察目标点。 3. **PyCharm**: PyCharm是一款强大的Python集成开发环境,支持代码调试、语法高亮、项目管理等功能,是编写Python代码的常用工具。 4. **PyOpenGL**: PyOpenGL是Python的OpenGL绑定库,使得Python程序员可以直接使用OpenGL API,用于创建复杂的3D图形。在这里,它用于实现石墙的绘制,包括设置顶点、纹理坐标和表面划分。 5. **纹理映射(Texure Mapping)**: 程序中提到了`texture_id`,这通常与纹理映射有关。在3D图形中,纹理映射是将2D图像(纹理)贴到3D模型表面的技术,增加视觉的真实感。`self.tex_coords`定义了石墙每个顶点的纹理坐标,用于将纹理正确地映射到石墙的表面。 6. **顶点(Vertices)**: `self.vertexes`定义了石墙各边角的3D坐标,这是构建3D模型的基础。在这个例子中,石墙由8个顶点构成,形成一个封闭的立方体形状。 7. **表面(Surfaces)**: `self.surfaces`定义了石墙的6个面,每个面由4个顶点构成,按照一定的顺序连接。这六个面分别是前、右、后、左、上、下,用于绘制3D模型的各个面。 8. **初始化函数**: `init`方法中,可能包含了初始化OpenGL状态、设置投影和观察矩阵等操作。由于代码未完全给出,具体的实现细节无法详细描述。 9. **纹理加载**: 虽然代码中没有显示,但通常在实际的3D渲染中,还需要加载纹理图像并绑定到特定的纹理ID上,这里可能在`StoneWall`类的其他方法或者外部代码中完成。 10. **GLUT**: GLUT库提供了创建和管理OpenGL窗口,以及处理用户输入的函数。在这个程序中,可能会用于创建窗口、处理事件等。 这个程序的目的是利用OpenGL和Python构建一个具有真实感的3D静态场景,通过定义石墙的几何形状、纹理和表面,最终在屏幕上渲染出逼真的石墙效果。通过运行`draw.py`,用户可以在PyCharm或其他支持Python的环境中查看和交互这个3D模型。

import cv2 import numpy as np # 读取两幅图像 img1 = cv2.imread('D:\wzk\JIEMIAN\images\er_duibidu.jpg') img2 = cv2.imread('D:\wzk\JIEMIAN\images\yi_duibidu.jpg') # 将两幅图像转换为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 提取图像特征点 orb = cv2.ORB_create() kp1, des1 = orb.detectAndCompute(gray1, None) kp2, des2 = orb.detectAndCompute(gray2, None) # 匹配特征点 matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING) matches = matcher.match(des1, des2) # 选择最佳匹配点 matches = sorted(matches, key=lambda x: x.distance) good_matches = matches[:int(len(matches)*0.15)] # 绘制特征点连接图 img3 = cv2.drawMatches(img1, kp1, img2, kp2, good_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) # 计算变换矩阵 src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # 拼接图像 result = cv2.warpPerspective(img1, M, (img1.shape[1] + img2.shape[1], img1.shape[0])) result[0:img2.shape[0], 0:img2.shape[1]] = img2 # 保存连接图 cv2.imwrite('D:\wzk\JIEMIAN\Result\ORB-pz.jpg', img3) # 保存第二幅图像 cv2.imwrite('D:\wzk\JIEMIAN\Result\ORB-pj.jpg', result) # 显示结果 cv2.namedWindow("Keypoint Matches", cv2.WINDOW_NORMAL) cv2.imshow("Keypoint Matches", img3) cv2.namedWindow("Result",cv2.WINDOW_NORMAL) cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows()改进为对文件夹内的多幅图像进行配准拼接

2023-05-18 上传