小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

?用Python進(jìn)行相機(jī)校準(zhǔn)

 漢無為 2022-05-02 發(fā)布于湖北

介紹

相機(jī)校準(zhǔn)的基本思想是給定世界上已知的一組點(diǎn)及其在圖像中的相應(yīng)投影,我們必須找到負(fù)責(zé)投影變換的矩陣。然后我們可以使用這個(gè)矩陣將世界上的任何點(diǎn)投影到圖像上。我們將在本文中了解如何執(zhí)行相機(jī)校準(zhǔn)。

在此之前,讓我們回顧一下。

回顧

相機(jī)外參矩陣

在本系列的第2部分中,我們看到相機(jī)外參矩陣是基礎(chǔ)矩陣的一種變化,它將一個(gè)點(diǎn)的坐標(biāo)從世界坐標(biāo)系轉(zhuǎn)換為相機(jī)坐標(biāo)系。

https:///camera-extrinsic-matrix-with-example-in-python-cfe80acab8dd

它讓我們從相機(jī)的角度來觀察世界。我們還看到,它是旋轉(zhuǎn)矩陣和平移矩陣的組合——旋轉(zhuǎn)矩陣定向相機(jī),平移矩陣移動(dòng)相機(jī)。

因此,給定世界上一個(gè)點(diǎn)的坐標(biāo),我們可以應(yīng)用相機(jī)外參矩陣來改變它在相機(jī)上的坐標(biāo),如下所示:

圖片

此處的符號(hào)如下所示:

圖片

在這里,這些點(diǎn)被表示為齊次坐標(biāo),這實(shí)質(zhì)上是在原始坐標(biāo)上增加一個(gè)額外的維度。

相機(jī)外參矩陣的最后一行只是0和1,它們不會(huì)給變換增加任何值,因此我們可以安全地刪除最后一行并重寫如下等式:

圖片

注意這里輸出的形狀是3×1,而之前是4×1。這意味著點(diǎn)在這里用歐幾里德形式表示,這是一件好事,因?yàn)槲覀儾恍枰~外的步驟來從齊次坐標(biāo)轉(zhuǎn)換回來。

此外,攝像機(jī)的內(nèi)參矩陣,即管道中的下一個(gè)矩陣,接受3×1的輸入形狀,我們將在下面看到。

總之,給定世界坐標(biāo)系中某個(gè)點(diǎn)的坐標(biāo),相機(jī)外參矩陣將坐標(biāo)轉(zhuǎn)換為相機(jī)坐標(biāo)系。這種轉(zhuǎn)變可以表示為:

圖片

攝像機(jī)內(nèi)參矩陣

現(xiàn)在,我們已經(jīng)使用相機(jī)外參矩陣得到了相機(jī)上的一個(gè)點(diǎn)的坐標(biāo),下一步是將該點(diǎn)投影到相機(jī)的圖像平面上,并形成一個(gè)圖像。這是相機(jī)內(nèi)參矩陣的工作。

本系列的第3部分已經(jīng)深入討論了相機(jī)內(nèi)參矩陣:

https:///camera-intrinsic-matrix-with-example-in-python-d79bf2478c12

但總而言之,相機(jī)內(nèi)參矩陣將相機(jī)給定坐標(biāo)的點(diǎn)投影到相機(jī)的圖像平面上。從本質(zhì)上說,我們可以使用相機(jī)內(nèi)參矩陣來獲得圖像中點(diǎn)的像素位置。如下所示:

圖片

這些符號(hào)是:

圖片

輸出將是同質(zhì)形式的投影。要將其轉(zhuǎn)換為歐幾里德形式,我們只需除以最后一個(gè)坐標(biāo),并丟棄最后一個(gè)維度,如下所示:

圖片

這里(u,v)是圖像中點(diǎn)P的像素位置。攝像機(jī)內(nèi)參矩陣由以下表達(dá)式表示:??, 這種轉(zhuǎn)變可以表示為:

圖片

結(jié)合相機(jī)的外參和內(nèi)參矩陣

結(jié)合相機(jī)的外在和內(nèi)參矩陣,我們可以建立一個(gè)管道,以世界坐標(biāo)系中的一個(gè)點(diǎn)為輸入,計(jì)算其在攝像機(jī)形成的圖像上的投影。它可以表示為:

圖片

此外,使用矩陣組合,我們可以將兩個(gè)矩陣組合成一個(gè)矩陣M,如下所示:

圖片

形狀為3×4的矩陣M具有所有必需的信息。

整合

使用矩陣M,我們可以將整個(gè)管道表示為:

圖片

如果你觀察,矩陣M有12個(gè)元素,但我們在之前的文章中看到,內(nèi)參矩陣和外參矩陣有11個(gè)自由度(6個(gè)來自外參矩陣,5個(gè)來自內(nèi)參矩陣)。所以M中有一個(gè)元素依賴于其他元素。

假設(shè)最后一個(gè)元素M(3,4)是依賴元素。這意味著如果我們用這個(gè)元素劃分矩陣M,M中的信息不會(huì)受到影響,因?yàn)樗且粋€(gè)依賴元素。

圖片

在上面的等式中,我們將矩陣M與最后一個(gè)元素M(3,4)分開,得到一個(gè)新的矩陣。這里需要注意的重要一點(diǎn)是,盡管進(jìn)行了操作,但兩種情況下的輸出或投影都是相同的。矩陣M的這個(gè)性質(zhì)被稱為尺度不變性,這意味著我們可以用任何因子對(duì)矩陣M進(jìn)行縮放,而不會(huì)影響輸出。

通常,在實(shí)際應(yīng)用中,矩陣M是未知的,相機(jī)校準(zhǔn)的目標(biāo)是使用一組已知點(diǎn)及其投影來找到它。

幾何相機(jī)校準(zhǔn)

圖片

我們可以從上述矩陣乘法中找到圖像坐標(biāo)(ui,vi),如下所示:

圖片

我們可以將這個(gè)等式改寫為:

圖片
圖片

我們可以進(jìn)一步簡化為:

圖片

如果你觀察,上面的方程看起來像一個(gè)齊次線性方程,以 m? 為單位,通常有如下形式:

圖片

現(xiàn)在,齊次線性方程組可以用矩陣形式表示為A??? = 0 ?, 其中A是m×n矩陣,??? 是包含n個(gè)條目的列向量,0 ? 是包含m個(gè)條目的零向量。

現(xiàn)在我們可以用矩陣形式來表示我們的方程Am? = 0 ?

圖片

上述方程式代表Am? = 0 ?。m? 是向量形式的平坦矩陣M。記住,我們的目標(biāo)是求矩陣M的系數(shù),這與求解這個(gè)齊次系統(tǒng)是一樣的。

現(xiàn)在,每個(gè)齊次系統(tǒng)都至少有一個(gè)解,稱為零解,它是通過給每個(gè)元素賦值得到的。但這不是我們正在尋找的解。那么,我們怎樣才能找到這個(gè)齊次系統(tǒng)的非零解呢?

我們可以找到一個(gè)近似解,而不是找到一個(gè)精確解,我們甚至不確定它是否存在。

從數(shù)學(xué)上講,這意味著我們不能找到Am?*=0* ?的精確解, 但是我們可以找到m? ,以至于|Am?| 最小。本質(zhì)上,我們試圖最小化代數(shù)誤差。

此外,我們可以將m?標(biāo)準(zhǔn)化, 所以它變成了單位向量。

所以,現(xiàn)在我們的問題是求*|Am|*的最小值,且 以|m?|=1。

在本系列的第4部分中(https:///find-the-minimum-stretching-direction-of-positive-definite-matrices-79c2a3b397fc),我們知道了如果單位向量??? 沿著?????的最小特征向量的方向,那么|?????| 能被最小化

讓我們先看看矩陣A:

圖片

我們的想法是,我們將找到一些由(Xi,Yi,Zi)表示的點(diǎn),并在由(ui,vi)表示的圖像中找到它們相應(yīng)的投影,然后我們可以計(jì)算矩陣A。

這個(gè)標(biāo)記過程是手動(dòng)完成的?,F(xiàn)在,如果我們標(biāo)記n個(gè)點(diǎn),矩陣A的形狀將是2n×12,而m? 的形狀將保持固定在12×1。零向量的形狀是2n×1。

這里有一個(gè)問題要問你:我們需要標(biāo)注多少點(diǎn)?m?的大小是12,這意味著有12個(gè)未知數(shù),所以我們需要解12個(gè)獨(dú)立的方程來找到這12個(gè)未知數(shù)。所以我們要求n至少為6,這意味著我們應(yīng)該標(biāo)記至少6個(gè)獨(dú)立點(diǎn)來求解m? 。我們還可以標(biāo)記更多的點(diǎn),一般來說,點(diǎn)越多越好;但6是最低要求。

整合

好的,計(jì)劃是標(biāo)記至少6個(gè)點(diǎn),然后計(jì)算矩陣A,然后我們可以計(jì)算????? 的特征向量還有m?  。最后,我們可以重塑向量m?  得到3×4矩陣M,這將是我們校準(zhǔn)的攝像機(jī)矩陣。使用M,我們可以找到圖像中任何世界點(diǎn)的投影。

讓我們用一個(gè)例子來說明這一點(diǎn)。


實(shí)例

設(shè)置

包含所有代碼的GitHub存儲(chǔ)庫可以在這里找到。

https://github.com/wingedrasengan927/Image-formation-and-camera-calibration

假設(shè)之前沒有設(shè)置環(huán)境,現(xiàn)在可以通過運(yùn)行以下命令來完成:

# create a virtual environment in anaconda
conda create -n camera-calibration-python python=3.6 anaconda
conda activate camera-calibration-python

# clone the repository and install dependencies
git clone https://github.com/wingedrasengan927/Image-formation-and-camera-calibration.git
cd Image-formation-and-camera-calibration
pip install -r requirements.txt

注意:這假設(shè)你已經(jīng)安裝了anaconda。

我們將使用兩個(gè)主要的庫:

  • pytransform3d:這個(gè)庫對(duì)于三維空間中的可視化和轉(zhuǎn)換具有強(qiáng)大的功能。

  • ipympl:它使matplotlib繪圖具有交互性,允許我們在筆記本電腦中實(shí)時(shí)執(zhí)行平移、縮放和旋轉(zhuǎn),這在使用3D繪圖時(shí)非常有用。

例子

為了進(jìn)行攝像機(jī)校準(zhǔn),我們首先需要準(zhǔn)備真實(shí)標(biāo)簽,它本質(zhì)上是世界上的一組點(diǎn)及其在圖像上的相應(yīng)投影。

在現(xiàn)實(shí)世界中,我們手動(dòng)測量點(diǎn)與相機(jī)的距離,并在圖像中找到相應(yīng)的像素。然而,在計(jì)算機(jī)上,我們可以模擬這個(gè)過程——我們可以創(chuàng)建一個(gè)相機(jī)外參矩陣和內(nèi)參矩陣,并構(gòu)建一個(gè)管道來計(jì)算世界點(diǎn)的投影。

我們已經(jīng)在本系列的第2部分和第3部分中看到了如何創(chuàng)建矩陣。一旦我們得到了真實(shí)標(biāo)簽,我們就可以用它來構(gòu)造代數(shù)矩陣A,然后找到它的轉(zhuǎn)置并進(jìn)行計(jì)算?????, 最后,我們可以取????? 用最小特征值對(duì)其進(jìn)行重塑,得到矩陣M。

以下是代碼實(shí)現(xiàn):

%matplotlib widget

import matplotlib.pyplot as plt
from utils import *
np.random.seed(42)

創(chuàng)建矩陣

定義參數(shù)

# define extrinsic parameters
# -------------------------------

# rotate an angle of pi/4 along the standard Y axis
angles = [np.pi/4]
order = 'y'

# transalte by the given offset
offset = np.array([0-80])

# define intrinsic parameters
# -------------------------------

f = 2
s = 0
a = 1
cx = 0
cy = 0
img_size = (1010)

創(chuàng)建外參和內(nèi)參矩陣

# create extrinsic matrix
# --------------------------

# create rotation transformation matrix
R = create_rotation_transformation_matrix(angles, order)
R_ = np.identity(4)
R_[:3, :3] = R

# create translation transformation matrix
T_ = create_translation_matrix(offset)

E = np.linalg.inv(R_ @ T_)
E = E[:-1, :]

# create intrinsic matrix
# ---------------------------
K = compute_intrinsic_parameter_matrix(f, s, a, cx, cy)

生成隨機(jī)點(diǎn)

# choose the lower limit of the points such they're always beyond the image plane

n_points = 12
rand_points = generate_random_points(n_points, (-100), (-1010), (f, 10))

繪圖設(shè)置

# create an image grid
xx, yy, Z = create_image_grid(f, img_size)

# convert the image grid to homogeneous coordinates
pt_h = convert_grid_to_homogeneous(xx, yy, Z, img_size)

# transform the homogeneous coordinates
pt_h_transformed = R_ @ T_ @ pt_h

# convert the transformed homogeneous coordinates back to the image grid
xxt, yyt, Zt = convert_homogeneous_to_grid(pt_h_transformed, img_size)

# define axis and figure
fig = plt.figure(figsize=(86))
ax = fig.add_subplot(111,projection='3d')

# set limits
ax.set(xlim=(-105), ylim=(-155), zlim=(010))

# plot the camera in the world
ax = pr.plot_basis(ax, R, offset)
ax.plot_surface(xxt, yyt, Zt, alpha=0.75)

# plot the generated random points
c = 0
for i in range(n_points):
    point = rand_points[:, c]
    ax.scatter(*point, color='orange')
    ax.plot(*make_line(offset, point), color='purple', alpha=0.25)
    c += 1

ax.set_title('The Setup')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

圖片

計(jì)算這些點(diǎn)的投影并形成圖像

rand_points_camera = compute_coordniates_wrt_camera(rand_points, E, is_homogeneous=False)

projections = compute_image_projection(rand_points_camera, K)

fig = plt.figure(figsize=(86))
ax = fig.add_subplot(111)

for i in range(n_points):
    ax.scatter(*projections.reshape(-12)[i], color='orange')
    
ax.set_title('projection of points in the image')

圖片

直接線性校正

建立代數(shù)矩陣A并求出m

# compute the algebraic matrix A
A = create_algebraic_matrix(rand_points, projections)

# compute At x A
A_ = np.matmul(A.T, A)
# compute its eigenvectors and eigenvalues
eigenvalues, eigenvectors = np.linalg.eig(A_)
# find the eigenvector with the minimum eigenvalue
# (numpy already returns sorted eigenvectors wrt their eigenvalues)
m = eigenvectors[:, 11]

# reshape m back to a matrix
M = m.reshape(34)

從校準(zhǔn)的矩陣M計(jì)算預(yù)測

predictions = compute_world2img_projection(rand_points, M, is_homogeneous=False)

畫出預(yù)測和真實(shí)值

fig = plt.figure(figsize=(86))
ax = fig.add_subplot(111)

for i in range(n_points):
    if i == 0:
        o_label = 'groundtruth'
        g_label = 'predictions'
    else:
        o_label = ''
        g_label = ''
        
    ax.scatter(*projections.reshape(-12)[i], color='orange', alpha=0.75, label=o_label)
    ax.scatter(*predictions.reshape(-12)[i], color='green', alpha=0.75, label=g_label)
    
ax.set_title('groundtruth vs predictions - direct linear calibration')
ax.legend()

圖片

優(yōu)化wrt幾何誤差

from scipy.optimize import minimize

result = minimize(geometric_error, m, args=(rand_points, projections))

M_ = result.x.reshape(34)

predictions_v2 = compute_world2img_projection(rand_points, M_, is_homogeneous=False)

fig = plt.figure(figsize=(86))
ax = fig.add_subplot(111)

for i in range(n_points):
    if i == 0:
        o_label = 'groundtruth'
        g_label = 'predictions'
    else:
        o_label = ''
        g_label = ''
        
    ax.scatter(*projections.reshape(-12)[i], color='orange', alpha=0.5, label=o_label)
    ax.scatter(*predictions_v2.reshape(-12)[i], color='green', alpha=0.5, label=g_label)
    
ax.set_title('groundtruth vs predictions - optimization wrt geometric error')
ax.legend()

圖片

fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(86))

for i in range(n_points):
        
    axes[0].scatter(*projections.reshape(-12)[i], color='orange', label=o_label)
    axes[1].scatter(*predictions_v2.reshape(-12)[i], color='green', label=g_label)
    
axes[0].set_title('groundtruth')
axes[1].set_title('predictions')

plt.tight_layout()

圖片

讓我們一步一步地瀏覽,了解發(fā)生了什么:

  • 首先,我們定義必要的參數(shù),并創(chuàng)建相機(jī)外參矩陣和內(nèi)參矩陣。這些都是建造管道和準(zhǔn)備標(biāo)簽必需的。然后我們在世界上生成n個(gè)隨機(jī)點(diǎn)(這里我選擇了n=12)。這是一個(gè)用相機(jī)和隨機(jī)點(diǎn)繪制的空間圖。

圖片
  • 我們可以計(jì)算這些點(diǎn)的投影并形成一個(gè)圖像。首先,我們必須應(yīng)用外參矩陣來表示攝像機(jī)坐標(biāo)系中的點(diǎn),然后我們可以應(yīng)用內(nèi)參矩陣來獲得投影,最后,我們可以在圖像中繪制這些投影,如下所示。

圖片
  • 現(xiàn)在我們已經(jīng)準(zhǔn)備好了真實(shí)值,就是世界上的點(diǎn)(Xi,Yi,Zi)以及它們在圖像中的對(duì)應(yīng)投影(ui,vi)。使用它們我們可以計(jì)算代數(shù)矩陣A。如果你記得的話,這就是矩陣A:

圖片
  • 在計(jì)算矩陣A之后,我們可以計(jì)算????? 并用最小的特征值選取其特征向量。這將給我們大小為12的向量m?。最后,我們可以重塑m?為 3×4得到我們要找的校準(zhǔn)矩陣M。

  • 我們可以直接使用矩陣M來計(jì)算世界點(diǎn)在圖像上的投影。它有所有必要的信息。讓我們將矩陣M應(yīng)用于我們生成的n個(gè)隨機(jī)點(diǎn);通過這種方式,我們可以將校準(zhǔn)矩陣M的投影與真實(shí)標(biāo)簽進(jìn)行比較。下圖顯示了比較結(jié)果。

圖片
  • 嗯……我們校準(zhǔn)矩陣M的預(yù)測并不十分準(zhǔn)確。有些點(diǎn)接近實(shí)際情況,有些則相去甚遠(yuǎn),但總的來說并不好。在下一節(jié)中,我們將討論可能發(fā)生了什么,以及我們可以做些什么來改進(jìn)。

圖片

幾何誤差

我們上面討論的方法叫做直接線性校準(zhǔn)。它不是很好的一個(gè)原因是因?yàn)槲覀冊噲D最小化代數(shù)誤差——我們基本上是在試圖找到m?,它很好地符合代數(shù)方程Am? = 0 ?。

這種線性優(yōu)化的問題是,當(dāng)非線性誤差和不確定性(如徑向畸變)潛入相機(jī)時(shí)(這在現(xiàn)實(shí)世界中經(jīng)常發(fā)生),算法將嚴(yán)重失敗。我們應(yīng)該針對(duì)正確的錯(cuò)誤類型進(jìn)行優(yōu)化。

我們應(yīng)該看到的誤差叫做幾何誤差。幾何誤差基本上給出了預(yù)測與真實(shí)標(biāo)簽之間的距離估計(jì)。它通過測量點(diǎn)的預(yù)測投影與其真實(shí)情況的投影之間的距離來實(shí)現(xiàn)。

當(dāng)我們最小化幾何誤差時(shí),我們實(shí)際上是在最小化預(yù)測和真實(shí)標(biāo)簽之間的距離。

幾何誤差由以下公式給出:

圖片

這里d是距離度量,我們通常使用歐幾里德距離。在我們的例子中,預(yù)測??′?? 由MXi給出,其中M是我們標(biāo)定的攝像機(jī)矩陣,Xi是世界坐標(biāo)系中的一個(gè)點(diǎn)。我們可以把方程改寫為:

圖片
圖片

好的,我們的想法是執(zhí)行某種非線性優(yōu)化,并更新矩陣M的權(quán)重,以最小化幾何誤差。

這種方法在直覺上類似于機(jī)器學(xué)習(xí),我們使用梯度下降算法更新模型以最小化損失。幸運(yùn)的是,我們不需要自己編寫優(yōu)化算法。scipy在scipy中提供了幾十種優(yōu)化算法。優(yōu)化模塊。

讓我們看看如何在代碼中實(shí)現(xiàn):

from scipy.optimize import minimize

def geometric_error(m, world_points, projections):
    '''
    compute the geometric error wrt the 
    prediction projections and the groundtruth projections
    
    Parameters
    ------------
    m - np.ndarray, shape - (12)
        an 12-dim vector which is to be updated
        
    world_points - np.ndarray, shape - (3, n)
                   points in the world coordinate system
                   
    projections - np.ndarray(2, n)
                  projections of the points in the image
    
    Returns
    --------
    error - float
            the geometric error
    '''

    
    assert world_points.shape[1] == projections.shape[1]
    
    error = 0
    n_points = world_points.shape[1]
    
    for i in range(n_points):
        
        X, Y, Z = world_points[:, i]
        u, v = projections[:, i]
        
        u_ = m[0] * X + m[1] * Y + m[2] * Z + m[3]
        v_ = m[4] * X + m[5] * Y + m[6] * Z + m[7]
        d = m[8] * X + m[9] * Y + m[10] * Z + m[11
        
        u_ = u_/d
        v_ = v_/d
        
        error += np.sqrt(np.square(u - u_) + np.square(v - v_))
        
    return error
  
result = minimize(geometric_error, m, args=(rand_points, projections))
M_ = result.x.reshape(34)

predictions_v2 = compute_world2img_projection(rand_points, M_, is_homogeneous=False)

在上面的代碼中,我們首先定義幾何誤差函數(shù)。此函數(shù)接受向量m?作為參數(shù)以及真實(shí)標(biāo)簽,這是一組世界點(diǎn)及其在圖像中的相應(yīng)投影。它使用我們上面討論的公式計(jì)算預(yù)測:

圖片

最后,我們計(jì)算所有點(diǎn)的預(yù)測投影和實(shí)際投影之間的歐氏距離,并計(jì)算幾何誤差。

從模塊scipy.optimize導(dǎo)入的函數(shù)minimize包含兩個(gè)重要參數(shù)——誤差函數(shù)和初始權(quán)重。我們可以將上面定義的幾何誤差函數(shù)作為第一個(gè)參數(shù)傳遞,作為第二個(gè)參數(shù),我們可以將任何12維向量作為初始狀態(tài)傳遞——然而,因?yàn)槲覀円呀?jīng)從直接線性校準(zhǔn)方法計(jì)算了m?,我們可以通過它作為初始狀態(tài),而不是一些隨機(jī)向量。作為第三個(gè)參數(shù),我們可以傳遞一個(gè)包含error函數(shù)參數(shù)的元組。

執(zhí)行最小化函數(shù)后,它運(yùn)行并完成優(yōu)化過程,并返回一個(gè)包含結(jié)果的對(duì)象。我們可以通過x屬性訪問該對(duì)象的最終更新權(quán)重。然后,我們可以將這個(gè)12維的權(quán)重向量重塑為一個(gè)3×4矩陣,并計(jì)算預(yù)測。下圖是我們從該方法得到的預(yù)測與真實(shí)投影的比較:

圖片

正如我們所看到的,預(yù)測和真實(shí)標(biāo)簽是重疊的!這意味著我們已經(jīng)精確校準(zhǔn)了攝像機(jī)矩陣。從上圖中很難看到重疊,因此在下圖中我將它們分開:

圖片

這種方法的另一個(gè)優(yōu)點(diǎn)是,即使投影變換是非線性的,它也可以應(yīng)用。

總結(jié)

總而言之,攝像機(jī)校準(zhǔn)算法包括兩個(gè)主要步驟:第一步是使用直接線性校準(zhǔn)方法計(jì)算向量m? ,第二步是通過取m?作為初始狀態(tài)來最小化預(yù)測和真實(shí)標(biāo)簽之間的幾何誤差,使用非線性優(yōu)化更新其權(quán)重。

參考引用

https://classroom./courses/ud810

感謝閱讀!


☆ END ☆

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多