全国服务热线:

15861139266

使用Python进行二维图像的三维重建(下),苏州机器视觉培训,苏州上位机培训
发布时间:2023-12-14 15:58:43 点击次数:249

使用Python进行二维图像的三维重建(下)

结果比较

# importing the libraries

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D


# Create a figure with two subplots

fig, axs = plt.subplots(1, 2, figsize=(10, 5))

# Visualize the original image in the first subplot

axs[0].imshow(images[0], cmap='gray')

axs[0].axis('off')

axs[0].set_title('Original')

# Visualize the reconstructed mesh in the second subplot

ax = fig.add_subplot(1, 2, 2, projection='3d')

ax.plot_trisurf(verts[:, 0], verts[:, 1], verts[:, 2], triangles=faces)

ax.set_title('Reconstructed')

# Show the figure

plt.show()

9.jpg

解释:在此代码中,使用matplotlib创建了包含两个子图的图形。在第一个图中,显示了来自数据集的原始图像。在第二个图中,使用3D三角形表面图可视化了重建的3D网格。


方法2


以下是执行来自TempleRing数据集图像的3D重建的另一个示例代码:


引入模块:


import cv2

import numpy as np

import matplotlib.pyplot as plt

from google.colab.patches import cv2_imshow

加载两个Temple Ring数据集图像:


# Load the PNG images (replace with your actual file paths)

image1 = cv2.imread('/content/drive/MyDrive/templeRing/templeR0001.png')

image2 = cv2.imread('/content/drive/MyDrive/templeRing/templeR0002.png'

解释:该代码使用OpenCV的cv2.imread函数从TempleRing数据集加载两个图像。


转换为灰度图:


# Convert images to grayscale

gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)


该代码使用OpenCV将两个图像转换为灰度图像。它们以单通道表示,其中每个像素的值表示其强度,并且没有颜色通道。


查找SIFT关键点和描述符:


# Initialize the SIFT detector

sift = cv2.SIFT_create()


# Detect keypoints and compute descriptors for both images

kp1, des1 = sift.detectAndCompute(gray1, None)

kp2, des2 = sift.detectAndCompute(gray2, None)


该代码使用尺度不变特征变换(SIFT)算法在两个图像中查找关键点和描述符。它使用OpenCV的cv2.SIFT_create()函数创建一个SIFT对象,并调用其detectAndCompute方法来计算关键点和描述符。


使用FLANN匹配器匹配描述符:


# Create a FLANN-based Matcher object

flann = cv2.FlannBasedMatcher({'algorithm': 0, 'trees': 5}, {})


# Match the descriptors using KNN (k-nearest neighbors)

matches = flann.knnMatch(des1, des2, k=2)


解释:该代码使用Fast Library for Approximate Nearest Neighbors(FLANN)匹配器对描述符进行匹配。它使用OpenCV的cv2.FlannBasedMatcher函数创建FLANN匹配器对象,并调用其knnMatch方法来找到每个描述符的k个最近邻。


使用Lowe的比率测试筛选出好的匹配项


# Apply Lowe's ratio test to select good matches

good_matches = []

for m, n in matches:

    if m.distance < 0.7 * n.distance:

        good_matches.append(m)


解释:该代码使用Lowe的比率测试筛选出好的匹配项。它使用最近邻和次近邻之间距离比的阈值来确定匹配是否良好。


提取匹配的关键点


# Extract matched keypoints

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)


解释:该代码从两组关键点中提取匹配的关键点,这些关键点将用于估算对齐两个图像的变换。这些关键点的坐标存储在'src_pts'和'dst_pts'中。


使用RANSAC找到单应矩阵


# Find the homography matrix using RANSAC

H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)


在这段代码中,它使用RANSAC算法基于匹配的关键点计算描述两个图像之间的变换的单应矩阵。单应矩阵后来可以用于拉伸或变换一个图像,使其与另一个图像对齐。


使用单应矩阵将第一个图像进行变换


# Perform perspective transformation to warp image1 onto image2

height, width = image2.shape[:2]

result = cv2.warpPerspective(image1, H, (width, height))

# Display the result

cv2_imshow(result)

10.jpg

解释:该代码使用单应矩阵和OpenCV的cv2.warpPerspective函数将第一个图像进行变换。它指定输出图像的大小足够大,可以容纳两个图像,然后呈现结果图像。


显示原始图像和重建图像


# Display the original images and the reconstructed image side by side

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(12, 4))

ax1.imshow(cv2.cvtColor(image1, cv2.COLOR_BGR2RGB))

ax1.set_title('Image 1')

ax1.axis('off')

ax2.imshow(cv2.cvtColor(image2, cv2.COLOR_BGR2RGB))

ax2.set_title('Image 2')

ax2.axis('off')

ax3.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))

ax3.set_title('Reconstructed Image')

ax3.axis('off')

plt.show()

输出:

11.jpg

解释:这段代码展示了在一个具有三个子图的单一图形中可视化原始图像和重建图像的过程。它使用matplotlib库显示图像,并为每个子图设置标题和轴属性。


不同的可能方法


有许多不同的方法和算法可用于从2D图像执行3D重建。选择的方法取决于诸如输入图像的质量、摄像机校准信息的可用性以及重建的期望准确性和速度等因素。


一些常见的从2D图像执行3D重建的方法包括立体对应、运动结构和多视图立体。每种方法都有其优点和缺点,对于特定应用来说,最佳方法取决于具体的要求和约束。


结论

总的来说,本文概述了使用Python从2D图像进行3D重建的过程。我们讨论了深度图、点云和网格等关键概念,并使用TempleRing数据集演示了使用两种不同方法逐步进行的过程。我们希望本文能帮助您更好地理解从2D图像进行3D重建以及如何使用Python实现这一过程。有许多可用于执行3D重建的不同方法和算法,我们鼓励您进行实验和探索,以找到最适合您需求的方法。


立即咨询
  • 品质服务

    服务贴心周到

  • 快速响应

    全天24小时随时沟通

  • 专业服务

    授权率高,保密性强

  • 完善售后服务

    快速响应需求,及时性服务

直播课程
软件开发基础课程
上位机软件开发课
机器视觉软件开发课
专题课
联系方式
电话:15861139266
邮箱:75607082@qq.com
地址:苏州吴中区木渎镇尧峰路69号
关注我们

版权所有:江苏和讯自动化设备有限公司所有 备案号:苏ICP备2022010314号-1

技术支持: 易动力网络