先给代码
地方显示图片
三个工具函数,间接前面有三行代码的示例。
import cv2import tkinter as tkdef GetScreenCenter(): root = tk.Tk() return root.winfo_screenwidth()//2,root.winfo_screenheight()//2def AdaptSize(img): # 视频、图片过大间接1/2 center_x, center_y = GetScreenCenter() img_h, img_w, _ = img.shape if img_h > center_y * 2 or img_w > center_x * 2: img = cv2.resize(img, (img_w // 2, img_h // 2)) return imgdef CentralShow(win_name,video): ret,img=video.read() center_x, center_y = GetScreenCenter() img=AdaptSize(img) img_h,img_w,_=img.shape t_x, t_y = (center_x - img_w // 2), (center_y - img_h // 2) cv2.imshow(win_name, img) cv2.moveWindow(win_name, t_x, t_y) cv2.waitKey(0)# example:win_name='centered image'img=cv2.imread('english.jpg')CentralShow(win_name,img)
地方显示视频
视频其实是多个图片一直循环,只需屡次读取视频图片即可
import cv2import tkinter as tkdef GetScreenCenter(): root = tk.Tk() return root.winfo_screenwidth()//2,root.winfo_screenheight()//2def AdaptSize(img): # 视频、图片过大间接1/2 center_x, center_y = GetScreenCenter() img_h, img_w, _ = img.shape if img_h > center_y * 2 or img_w > center_x * 2: img = cv2.resize(img, (img_w // 2, img_h // 2)) return imgdef CentralShow(win_name,video): ret,img=video.read() center_x, center_y = GetScreenCenter() img=AdaptSize(img) img_h,img_w,_=img.shape t_x, t_y = (center_x - img_w // 2), (center_y - img_h // 2) cv2.imshow(win_name, img) cv2.moveWindow(win_name, t_x, t_y)def ShowVideo(video): while True: ret, imgsrc = video.read() if imgsrc is None: break imgsrc = AdaptSize(imgsrc) cv2.imshow(win_name, imgsrc) if cv2.waitKey(20) & 0xFF == ord('q'): break video.release() cv2.destroyAllWindows()# eg:win_name='centered video'video = cv2.VideoCapture('1604400296582.mp4')# 先第一次确定显示的地位CentralShow(win_name,video)# 整个视频放映(无声放映)ShowVideo(video)
代码一些解释
实现思路
- 获取整个屏幕width, height,找到中心点
- 失去图片的长宽,而后通过中心点,计算显示图片窗口的左上角点的地位。
- 显示图片
利用opencv的窗口的特点
我应用moveWindow这个函数,意思是把窗口挪动到其余中央。
opencv的窗口显示有个特点,只有上一次move到这个中央显示,下一次也会在这个中央显示,没有个指定显示中央的函数。
所以我的办法是,先在轻易中央显示,而后move到指定中央。而后之后的都会在那个中央显示了。