在循环中删除直方图的水平线
Remove horizontal lines for histogram in a loop
我有一个显示视频并显示其灰度直方图的代码,我想添加 2 条水平线:一条用于直方图的实际最大值,一条用于最后的最大值。
因此,我尝试绘制 3 条 hlines:一条红色表示实际最大值,一条绿色表示最后一条,第三条白色表示删除一条我不再需要的线,因为已找到新的最大值。但是第三行没有达到我的预期,旧的最大行仍然可见,看起来颜色组合,因为行是浅绿色,我不知道如何删除它们。
也许有更好的方法可以做我想做的事,但我不知道。
import cv2
import matplotlib.pyplot as plt
import numpy as np
import time
video = cv2.VideoCapture('output.avi')
if (video.isOpened()== False):
print("Error opening video file")
max_old = 0
max_med = 0
x = np.linspace(0, 255, 256)
y = np.linspace(0.1, 100000, 256)
plt.ion()
#FPS variables
prev_frame_time = 0
new_frame_time = 0
#plt.subplots() is a function that returns a tuple containing a figure and axes object(s)
figure, ax = plt.subplots(1, 1, figsize=(10, 8))
line1, = ax.plot(x, y)
ax.set_yscale('log')
"""ax.autoscale()"""
while(video.isOpened()):
ret, image = video.read()
if ret == True:
gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
smaller_image = cv2.resize(gris,(640,480))
#FPS
font = cv2.FONT_HERSHEY_SIMPLEX #Police du texte
new_frame_time = time.time()
fps = 1/(new_frame_time - prev_frame_time)
prev_frame_time = new_frame_time
fps = int(fps)
fps = str(fps)
cv2.putText(smaller_image, fps, (7, 70), font, 3, (100, 255, 0), 3, cv2.LINE_AA)
cv2.imshow('Image', smaller_image)
histogram = cv2.calcHist([smaller_image], [0], None, [256], [0, 256])
line1.set_ydata(histogram)
max_new = np.amax(histogram[150:256])
if max_new > max_med :
plt.hlines(max_old, 0, 255, 'w')
plt.hlines(max_med, 0, 255, 'g')
plt.hlines(max_new, 0, 255, 'r')
max_old = max_med
max_med = max_new
figure.canvas.draw()
figure.canvas.flush_events()
time.sleep(0.001)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
else :
break
plt.ioff()
video.release()
cv2.destroyAllWindows()
plt.close('all')
您可以通过将 set_visible 属性设置为 false 来隐藏这些行。
redline=plt.hlines(max_new, 0, 255, 'r')
....
redline.set_visible(False)
正如@tmdavison 提到的那样,通过 redline.remove()
删除它们
我有一个显示视频并显示其灰度直方图的代码,我想添加 2 条水平线:一条用于直方图的实际最大值,一条用于最后的最大值。 因此,我尝试绘制 3 条 hlines:一条红色表示实际最大值,一条绿色表示最后一条,第三条白色表示删除一条我不再需要的线,因为已找到新的最大值。但是第三行没有达到我的预期,旧的最大行仍然可见,看起来颜色组合,因为行是浅绿色,我不知道如何删除它们。
也许有更好的方法可以做我想做的事,但我不知道。
import cv2
import matplotlib.pyplot as plt
import numpy as np
import time
video = cv2.VideoCapture('output.avi')
if (video.isOpened()== False):
print("Error opening video file")
max_old = 0
max_med = 0
x = np.linspace(0, 255, 256)
y = np.linspace(0.1, 100000, 256)
plt.ion()
#FPS variables
prev_frame_time = 0
new_frame_time = 0
#plt.subplots() is a function that returns a tuple containing a figure and axes object(s)
figure, ax = plt.subplots(1, 1, figsize=(10, 8))
line1, = ax.plot(x, y)
ax.set_yscale('log')
"""ax.autoscale()"""
while(video.isOpened()):
ret, image = video.read()
if ret == True:
gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
smaller_image = cv2.resize(gris,(640,480))
#FPS
font = cv2.FONT_HERSHEY_SIMPLEX #Police du texte
new_frame_time = time.time()
fps = 1/(new_frame_time - prev_frame_time)
prev_frame_time = new_frame_time
fps = int(fps)
fps = str(fps)
cv2.putText(smaller_image, fps, (7, 70), font, 3, (100, 255, 0), 3, cv2.LINE_AA)
cv2.imshow('Image', smaller_image)
histogram = cv2.calcHist([smaller_image], [0], None, [256], [0, 256])
line1.set_ydata(histogram)
max_new = np.amax(histogram[150:256])
if max_new > max_med :
plt.hlines(max_old, 0, 255, 'w')
plt.hlines(max_med, 0, 255, 'g')
plt.hlines(max_new, 0, 255, 'r')
max_old = max_med
max_med = max_new
figure.canvas.draw()
figure.canvas.flush_events()
time.sleep(0.001)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
else :
break
plt.ioff()
video.release()
cv2.destroyAllWindows()
plt.close('all')
您可以通过将 set_visible 属性设置为 false 来隐藏这些行。
redline=plt.hlines(max_new, 0, 255, 'r')
....
redline.set_visible(False)
正如@tmdavison 提到的那样,通过 redline.remove()
删除它们