Matplotlib學習---可視化人體姿態


1.簡介

Matplotlib是一個Python 2D繪圖庫,可生成圖表、直方圖、散點圖、譜圖、條形圖等。pyplot提供了類似MALAB的界面,它提供了matplotlib的“狀態機器環境”,位於層次結構頂部,其中的一些簡單的函數便可繪圖。pyplot的下一個層次是面向對象接口(?)。

1)圖 figure

fig = plt.figure() # 最簡單的方式創建一個圖
fig.suptitle('No axes on this figure') # Add a title so we know which it is
fig, ax_lst = plt.subplots(2, 2) # a figure with a 2x2 grid of Axes

2)軸 Axes

一個圖可以包含多個軸,但一個給定的軸對象只能在一個圖中。軸對象可以包含兩個或三個坐標軸,負責數據限制,x坐標和y坐標。
Axes 類及其成員函數是使用OO接口的主要入口點。

3)坐標軸 Axis

負責設置圖形限制並生成刻度(軸上的標記)和 ticklabel (標記刻度的字符串)。

4)藝術家 Artist

圖形中看到的每一個元素都是藝術家,例如:figure、Axes、Axis等。
輸入在繪圖之前,最好講輸入轉換為np.array對象。
Matplotlib,pyplot和pylab之間的關系?
Matplotlib 是整個包,而 Matplotlib.pyplot 是 Matplotlib 的一個模塊。
對於 pyplot 模塊中的函數,總是有一個“當前”圖形和軸(根據請求自動創建)。
pylab已被丟棄。

編碼風格

pyplot風格
import maplotlib.pyplot as plt
import numpy as np
然后調用np.arange, np.zeros, np.pi, plt.figure, plt.plot, plt.show等函數。
使用 pyplot 接口創建圖形,然后使用 object 方法創建其余的圖形。
交互模式
TO-DO

Pyplot 常用API----Updating

matplotlib.pyplot是一系列讓matplotlib像MATLAB那樣工作的的函數集合。
matplotlib.pyplot.plot(x,y,format_string,**kwargs)----折線圖
注:相鄰點之間線段相連,不相鄰的不連
format_string有顏色字符,風格字符和標記字符

matplotlib.pyplot.figure( num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True )
num:圖像編號或名稱,數字為編號 ,字符串為名稱
figsize:指定figure的寬和高,單位為英寸;
dpi參數指定繪圖對象的分辨率,即每英寸多少個像素,缺省值為80 1英寸等於2.5cm,A4紙是 21*30cm的紙張
facecolor:背景顏色
edgecolor:邊框顏色
frameon:是否顯示邊框
matplotlib.pyplot.subplot(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
注意:subplot可以規划figure划分為n個子圖,但每條subplot命令只會創建一個子圖 。
plt.axis('off') # 不顯示坐標尺寸

一般步驟:

1.建立一個畫布
plt.figure
2.建立子圖
plt.subplot()/plt.plot()
3.顯示
plt.show()

可視化二維人體姿態

import matplotlib.pyplot as plt
import matplotlib.mplot3d import Axes3D
import numpy as np
是對(32,2)這樣維度的2d pose進行可視化
1.判斷是否是正確的維度
assert channel == len(H36_NAMES)*2 # 這是可以根據不同情況進行變化的,比如(17,3)
2.根據如下的人體骨骼圖的連接定義兩個列表

I = np.array([1,2,3,1,7,8,1, 13,14,15,14,18,19,14,26,27])-1 # start points
J = np.array([2,3,4,7,8,9,13,14,15,16,18,19,20,26,27,28])-1 # end points
LR = np.array([1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1])
3.建立連接矩陣
for i in np.arange(len(I)):
x, y = [np.array( [vals[I[i], j], vals[J[i], j]] ) for j in range(2)]
ax.plot(x, y, lw=2, c='#e74c3c' if LR[i] else c='#3498db') # 左右兩邊的骨骼以不同的顏色展示
4.設置坐標軸的上下限
root_x, root_y = vals[0,0], vals[0,1]
Radius = 350
ax.set_xlim([-Radius+root_x, Radius+root_x])
ax.set_ylim([-Radius+root_y, Radius+root_y])
Optional
5.設置無坐標軸刻度
ax.set_xticks([])
ax.set_yticks([])
6.去除坐標軸刻度標簽
ax.get_xaxis().set_xticklabels([])
ax.get_yaxis().set_yticklabels([])
ax.set_aspect('equal') # x軸和y軸的比例是1:1
注:這樣顯示出來的2d pose是倒立的,需要加上下面這行代碼進行翻轉:
ax.invert_yaxis()

可視化三維人體姿態

import matplotlib.pyplot as plt
import matplotlib.mplot3d import Axes3D
import numpy as np
是對(32,3)這樣維度的3d pose進行可視化
1.判斷是否是正確的維度
assert channel == len(H36_NAMES)*3 # 這是可以根據不同情況進行變化的,比如(17,3)
2.根據上面的人體骨骼圖的連接定義兩個列表
I = np.array([1,2,3,1,7,8,1, 13,14,15,14,18,19,14,26,27])-1 # start points
J = np.array([2,3,4,7,8,9,13,14,15,16,18,19,20,26,27,28])-1 # end points
LR = np.array([1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1])
3.建立連接矩陣
for i in np.arange(len(I)):
x, y, z = [np.array( [vals[I[i], j], vals[J[i], j]] ) for j in range(3)]
ax.plot(x, y, z,lw=2, c='#e74c3c' if LR[i] else c='#3498db') # 左右兩邊的骨骼以不同的顏色展示
4.設置坐標軸的上下限
root_x, root_y, root_z= vals[0,0], vals[0,1], vals[0,2]
Radius = 750
ax.set_xlim3d([-Radius+root_x, Radius+root_x])
ax.set_ylim3d([-Radius+root_y, Radius+root_y])
ax.set_ylim3d([-Radius+root_z, Radius+root_z])
5.設置無坐標軸刻度
ax.set_xticks([])
ax.set_yticks([])
ax.set_zticks([])
6.去除坐標軸刻度的標簽
ax.get_xaxis.set_xticklabels([])
ax.get_yaxis.set_yticklabels([])
ax.get_zaxis.set_zticklabels([])
7.去除背景板的顏色
white = (1.0, 1.0, 1.0, 0.0)
ax.w_xaxis.set_pane_color(white)
ax.w_yaxis.set_pane_color(white)
8.去除線條的顏色
ax.w_xaxis.line.set_color(white)
ax.w_yaxis.line.set_color(white)
ax.w_zaxis.line.set_color(white)
最后,要顯示出來一定要plt.show()!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM