有人要求我為一個瘋狂的想法編碼。 我們希望有一個螢屏,能夠使用RGB格式和每一個可用的像素來顯示它所能產生的每一個可能的影像。 當然,我們明白這樣的代碼需要數百萬年的時間來運行(甚至更多),但這仍然是我們想要做的。 我有一些作業得很好的東西,唯一的問題是繪制影像的速度真的很慢......
我目前使用的是matratch,它是一個很好的工具。
我目前正在使用matplotlib,我愿意為了速度而嘗試其他工具,但我必須承認,我對其他工具并不熟悉,而且我經常發現檔案難以理解(例如glumpy)
。以下是我的代碼:
import numpy as np
import matplotlib.pyplot as plt
import time
import itertools
from PyQt5 import QtWidgets
plt.ion()
import ctypes
# Getting the screensize 獲得螢屏尺寸。
user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
fig = plt.figure()
#To remove toolbar from figure[/span
try:
win = fig.canvas.manager.window
except AttributeError:
win = fig.canvas.window()
toolbar = win.findChild(QtWidgets.QToolBar) #same[/span
toolbar.setVisible(False) #same[/span
fig.canvas.manager.full_screen_toggle() #以全屏方式顯示結果。
#要洗掉軸和圖之間的空白。
ax = fig.add_axes([0,0,1,1] ) #position: left, bottom, width, height1]
initial_image = np.zeros((pixel_x,pixel_y,3).astype(np.uint8)
image = ax.imshow(initial_image, animated = True)
ch = ax.get_children()
fig.canvas.draw()
# itertools讓我能夠非常有效地迭代所有可能的影像。
for x in itertools.product(np. arange(0,256,step,dtype = "uint8"), repeat = pixel_y*pixel_x*3)。)
x = np.fromiter(x,dtype = np.uint8) # I read that np.fromiter is quicker than np.array.
x = x.reshape(pixel_x,pixel_y,3) # 把所有東西放回影像中合適。
# 格式
ch[-2].set_data(x) # 我盡量不重繪整個圖形,只改變這個。
ax.draw_artist(ch[-2]) # 我重新繪制藝術家。
fig.canvas.blit(fig.bbox)# 在網上看到,這樣做比較快。
fig.canvas.flush_events()#同...
j =1
if j % 10 == 0:
print(f'{j/(time.time() - t):.2f} 每秒迭代次數)
所以我發現在itertools.product上的迭代相對較快:這部分可以快到每秒鐘40-45次迭代。使用np.fromiter將itertools的輸出轉換為numpy陣列,這個程序會慢很多:下降到大約每秒25次迭代。 將結果重塑為一個合適的影像格式,似乎并沒有減慢任何速度。 最后,當我用set_data方法和所有的東西包括所有的繪圖時,它減慢到每秒5-6次,這真的很慢...
如果你對我如何使這一程序更有效率有任何見解,請告訴我!我將非常感激。 這將是非常感激的。謝謝你
uj5u.com熱心網友回復:
謹慎使用matplotlib
如果有人使用matplotlib進行成像,請停止閱讀
對于顯示視頻,使用openCV。對于顯示影像,使用opencv/Pillow,除非你不想在影像旁邊顯示任何額外的東西,如軸
對于顯示視頻,使用openCV。
花更多時間思考你正在做的事情,因為你正在做的事情真的不值得做。
使用matpline的方法來計算。
OPENCV的實施(333-500 FPS)
import numpy as np
import time
import itertools
import cv2
步驟 = 1
pixel_x, pixel_y = [3, 3]
initial_image = np.zeros((pixel_x, pixel_y, 3).astype(np.uint8)
import時間
for x in itertools.product(
np.range(0, 256, steps, dtype="uint8"), repeat=pixel_y * pixel_x * 3)
):
s = time.time()
x = np.fromiter(x, dtype=np.uint8)
x = x.reshape(pixel_x, pixel_y, 3)
cv2.imshow("Frame", x)
if cv2.waitKey(1) & 0xFF == ord("q")。
break: break.
print("FPS: ", 1 / (time.time() - s) )
cv2.destroyAllWindows()
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/328941.html
標籤:
