先给代码

中央显示图片

三个工具函数,直接后面有三行代码的示例。

import cv2
import tkinter as tk



def GetScreenCenter():
    root = tk.Tk()
    return root.winfo_screenwidth()//2,root.winfo_screenheight()//2

def 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 img

def 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 cv2
import tkinter as tk

def GetScreenCenter():
    root = tk.Tk()
    return root.winfo_screenwidth()//2,root.winfo_screenheight()//2

def 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 img

def 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)

代码一些解释

实现思路

  1. 获取整个屏幕width, height,找到中心点
  2. 得到图片的长宽,然后通过中心点,计算显示图片窗口的左上角点的位置。
  3. 显示图片

利用opencv的窗口的特点

我使用moveWindow这个函数,意思是把窗口移动到其他地方。
opencv的窗口显示有个特点,只要上一次move到这个地方显示,下一次也会在这个地方显示,没有个指定显示地方的函数。
所以我的方法是,先在随便地方显示,然后move到指定地方。然后之后的都会在那个地方显示了。


Yonggie
95 声望4 粉丝