Opencv-Python OSD字符叠加

概述

本程序主要实现将视频中的每个像素转换成字符颜色 ,并显示字符,主要用到opencv和PIL,采用opencv获取 每个像素的RGB颜色值及视频显示,通过PIL进行字符叠加输出。 由于计算量大,运行卡顿,看别人的做法是先处理并存 储,然后再播放就比较流畅了。

代码

# coding=utf-8
# 中文乱码处理

import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import time

cap = cv.VideoCapture("../录像13.avi")
#视频较大,先读1000帧,跳过片头
for i in range(1000):
    ret, src = cap.read()
#创建空白图像
m3 = np.ones([1000,1000,3], np.uint8)
h, w, ch = m3.shape
#主循环
while 1:
    #获取开始时间
    start = time.time()
    #for row1 in range(1000):
    #    for col1 in range(1000):
    #        m3[row1, col1] = [200, 200, 200]
    #转换对象类型
    img = Image.fromarray(cv.cvtColor(m3, cv.COLOR_BGR2RGB))
    #设置字体和画布
    draw = ImageDraw.Draw(img)
    fontText = ImageFont.truetype("font/simsun.ttc", 20, encoding="utf-8")
    #读取视频中的一帧图像
    ret, src = cap.read()
    #用opencv将视频缩放到50x50大小
    src = cv.resize(src, (50, 50))
    h, w, ch = src.shape
    #像素遍历
    for row in range(h):
        for col in range(w):
            b, g, r = src[col, row]
            if (row%5) == 0:
                draw.text((20 * row, 20 * col), "雪", (r,g,b), font=fontText)
            elif (row%5) == 1:
                draw.text((20 * row, 20 * col), "山", (r,g,b), font=fontText)
            elif (row % 5) == 2:
                draw.text((20 * row, 20 * col), "飞", (r,g,b), font=fontText)
            elif (row % 5) == 3:
                draw.text((20 * row, 20 * col), "狐", (r,g,b), font=fontText)
            else:
                draw.text((20 * row, 20 * col), "~", (r,g,b), font=fontText)
    #转换对象类型
    m3 = cv.cvtColor(np.asarray(img), cv.COLOR_RGB2BGR)
    #显示图像
    cv.imshow("src", src)
    cv.imshow("capture", m3)
    #通过按q键退出该循环
    if cv.waitKey(100) & 0xFF == ord('q'):
        break
    #获取结束时间
    end = time.time()
    print("每帧计算耗时: ",end-start)
cap.release()
cv.destroyAllWindows()

效果(实际是视频播放,只是计算耗时长,一帧一帧播放很慢):
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值