我正在使用python
opencv
来做一些视频相关的工作。我还在计算 FPS 并将其显示在 cv2 窗口的左上角。现在,我不想将其显示在左上角,而是将其显示在窗口标题上。下面是代码:
import cv2
import datetime
import imutils
def GetCoord(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print("X: {} | Y: {}".format(x, y))
winName = "My Project"
cv2.namedWindow(winName)
cv2.setMouseCallback(winName, GetCoord)
cap = cv2.VideoCapture(0)
fps_start_time = datetime.datetime.now()
fps = 0
total_frames = 0
while True:
ret, frame = cap.read()
frame = imutils.resize(frame, width=800)
total_frames = total_frames + 1
fps_end_time = datetime.datetime.now()
time_diff = fps_end_time - fps_start_time
if time_diff.seconds == 0:
fps = 0.0
else:
fps = (total_frames / time_diff.seconds)
fps_text = "FPS: {:.2f}".format(fps)
cv2.putText(frame, fps_text, (5, 30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1)
cv2.imshow(winName, frame)
key = cv2.waitKey(1)
if key == ord('q'):
break
cv2.destroyAllWindows()
我不想将其显示在左上角,而是想做如下操作:
cv2.imshow(winName + " FPS: {}".format(fps_text), frame)
但是这样做,应用程序的表现非常奇怪,并且不断打开一个新窗口。有没有办法实现这个目标?
最佳答案
问题的原因:
opencv 中的每个窗口都有一个唯一的名称。当您调用 cv2.namedWindow
时,或者当您使用新名称调用 cv2.imshow
时,都会使用此名称创建窗口。
通过使用:
cv2.imshow(winName + " FPS: {}".format(fps_text), frame)
每次 fps_text
与之前的不同时,您实际上都会创建新窗口。
解决方案:
每个 opencv 窗口还有一个 title 属性。默认情况下,窗口标题是窗口唯一名称,但这是两个不同的属性。
您可以使用cv2.setWindowTitle
修改标题:
fps_text = "{:.2f}".format(fps)
winTitle = winName + " FPS: {}".format(fps_text)
cv2.setWindowTitle(winName, winTitle)
请注意窗口唯一名称不会更改。
关于python-3.x - 如何在Python中动态更新cv2窗口标题的FPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73687426/