常州电工培训

常州电工证

常州变频器培训

常州触摸屏培训

江苏和讯自动化设备有限公司欢迎您!
  • 和讯PLC,电工培训中心优势,名师团队一对一教学.
热门课程
联系方式
  • 常州和讯自动化培训中心
  • 常州市新北区太湖东路府琛大厦2号楼307-1室,307-2室(常州万达广场对面)
  • 电话:0519-85602926
  • 手机:15861139266 13401342299
当前位置:网站首页 > 新闻中心 新闻中心
使用Python进行二维图像的三维重建(下)-常州机器视觉培训,常州上位机培训
日期:2023-12-15 10:29:10人气:  标签:常州机器视觉培训 常州上位机培训

 

结果比较

# 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重建的不同方法和算法,我们鼓励您进行实验和探索,以找到最适合您需求的方法。


本文网址:

相关信息:
版权所有 CopyRight 2006-2017 江苏和讯自动化设备有限公司 电话:0519-85602926 地址:常州市新北区太湖东路府琛大厦2号楼307-1室,307-2室
苏ICP备14016686号-2 技术支持:常州鹤翔网络
本站关键词:常州电工培训 常州电工证 常州变频器培训 常州触摸屏培训 网站地图 网站标签
在线与我们取得联系