Python如何生成字符视频
本篇内容介绍了“Python如何生成字符视频”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、前言在之前也写过生成字符视频的文章,但是使用的是命令行窗口输出,效果不是很好,而且存在卡顿的情况。于是我打算直接生成一个mp4的字符视频。大致思路和之前一样:Python20行代码实现视频字符化。
二、OpenCV的操作图像我们先来看一些基本操作。首先我们需要安装OpenCV,执行下面语句:
pipinstallopencv-python
之后就可以使用了。
2.1、读取和显示我们直接看代码:
importcv2#读取图片img=cv2.imread("1.jpg")#显示图片cv2.imshow("img",img)cv2.waitKey()cv2.destroyAllWindows()
其中waitKey是等待输入的函数,因为imshow之后显示一瞬间,所以我们需要调用它。而destroyAllWindows是释放窗口。
2.2、灰度转换灰度转换就是将图片转换成黑白图片(灰色),这样可以方便我们处理像素。代码如下:
importcv2img=cv2.imread("1.jpg")#灰度转换gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
我们还可以直接以灰度形式读入:
importcv2#以灰度形式读入img=cv2.imread("1.jpg",0)2.4、获取图片尺寸并修改尺寸
我们直接看代码:
importcv2img=cv2.imread("1.jpg",0)#获取图片的高宽h,w=img.shape#缩放图片res=cv2.resize(img,(w//2,h//2))
因为img的shape属性是一个元组,所以我们可以直接自动拆包。
然后调用cv2.resize函数,第一个参数传入图片,第二个参数传入修改后的尺寸。
2.5、绘制文字绘制文字我们需要调用cv2.putText函数,代码如下:
importcv2img=cv2.imread('1.jpg')#绘制文字cv2.putText(#背绘制的图片img,#要绘制的文字'Hello',#文字左下角的坐标(100,500),#字体cv2.FONT_HERSHEY_SIMPLEX,#字体大小缩放20,#文字颜色(0,0,0),#文字粗细10)
我们只需要注意这些参数就好了。
2.6、读取视频读取视频的操作一般是通用的,代码如下:
importcv2#读取视频cap=cv2.VideoCapture('1.mp4')#获取视频的帧率fps=cap.get(cv2.CAP_PROP_FPS)#循环读取图片的每一帧whileTrue:#读取下一帧ret,frame=cap.read()ifnotret:breakelse:passcap.release()
上面我们获取的视频的帧,在写入视频的时候我们需要用到。
2.7、写入视频写入视频的操作也是常规代码:
importcv2fourcc=cv2.VideoWriter_fourcc(*'mp4v')writer=cv2.VideoWriter('11.mp4',fourcc,fps,(w,h))#写入视频writer.write(frame)***write.release()
有了这些知识,我们就可以开始下一步工作了。
三、像素映射成字符对于只有一个通道的图片,我们可以把它当成一个矩形,这个矩形最小单位就是一个像素。而字符化的过程就是用字符替代像素点的过程。所以我们要遍历图像的每个像素点,但是我们应该用什么字符取代呢?
我们颜色有一个参照表,而opencv将这个参数表切割成256份,代表不同的程度,我们也可以做一个参照表,不过表中的内容不是颜色,而是字符。
下面就是我们像素转字符的代码:
defpixel2char(pixel):char_list="@#$%&erytuioplkszxcv=+---."index=int(pixel/256*len(char_list))returnchar_list[index]
这个字符表是可以自己定义的。
四、生成字符图片现在我们只需要将像素逐个转换成字符就好了,代码如下:
defget_char_img(img,scale=4,font_size=5):#调整图片大小h,w=img.shapere_im=cv2.resize(img,(w//scale,h//scale))#创建一张图片用来填充字符char_img=np.ones((h//scale*font_size,w//scale*font_size),dtype=np.uint8)*255font=cv2.FONT_HERSHEY_SIMPLEX#遍历图片像素foryinrange(0,re_im.shape[0]):forxinrange(0,re_im.shape[1]):char_pixel=pixel2char(re_im[y][x])cv2.putText(char_img,char_pixel,(x*font_size,y*font_size),font,0.5,(0,0,0))returnchar_img
这里我们使用了一个np.ones函数,它的作用我们理解为生成一个黑色图片。
生成的尺寸我们先除了scale,如何再乘font_size。scale是原图的缩小程度,因为像素有很多,所以我们需要先把图片缩小。而为了让我们的字体显示更清楚,我们需要把生成的字符图片放大。
因此需要注意,虽然我们生成的图片看起来单调,但是当font_size设置为5时,得到的图片已经比较大了。因此当你生成长时间的视频时,会花费比较多的时间,生成的视频也比较大。
我们来测试一下上面的函数:
importcv2importnumpyasnpdefpixel2char(pixel):char_list="@#$%&erytuioplkszxcv=+---."index=int(pixel/256*len(char_list))returnchar_list[index]defget_char_img(img,scale=4,font_size=5):#调整图片大小h,w=img.shapere_im=cv2.resize(img,(w//scale,h//scale))#创建一张图片用来填充字符char_img=np.ones((h//scale*font_size,w//scale*font_size),dtype=np.uint8)*255font=cv2.FONT_HERSHEY_SIMPLEX#遍历图片像素foryinrange(0,re_im.shape[0]):forxinrange(0,re_im.shape[1]):char_pixel=pixel2char(re_im[y][x])cv2.putText(char_img,char_pixel,(x*font_size,y*font_size),font,0.5,(0,0,0))returnchar_imgif__name__=='__main__':img=cv2.imread('dl.jpg',0)res=get_char_img(img)cv2.imwrite('d.jpg',res)五、生成字符视频
有了上面的代码,我们就可以对整个视频进行转换了。将视频转换成字符视频的代码如下:
defgenerate(input_video,output_video):#1、读取视频cap=cv2.VideoCapture(input_video)#2、获取视频帧率fps=cap.get(cv2.CAP_PROP_FPS)#读取第一帧,获取转换成字符后的图片的尺寸ret,frame=cap.read()char_img=get_char_img(cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY),4)#创建一个VideoWriter,用于保存视频fourcc=cv2.VideoWriter_fourcc(*'mp4v')writer=cv2.VideoWriter(output_video,fourcc,fps,(char_img.shape[1],char_img.shape[0]))whileret:#读取视频的当前帧,如果没有则跳出循环ret,frame=cap.read()ifnotret:break#将当前帧转换成字符图gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)char_img=get_char_img(gray,4)#转换成BGR模式,便于写入视频char_img=cv2.cvtColor(char_img,cv2.COLOR_GRAY2BGR)writer.write(char_img)writer.release()
完整代码如下:
importcv2importnumpyasnpdefpixel2char(pixel):char_list="@#$%&erytuioplkszxcv=+---."index=int(pixel/256*len(char_list))returnchar_list[index]defget_char_img(img,scale=4,font_size=5):#调整图片大小h,w=img.shapere_im=cv2.resize(img,(w//scale,h//scale))#创建一张图片用来填充字符char_img=np.ones((h//scale*font_size,w//scale*font_size),dtype=np.uint8)*255font=cv2.FONT_HERSHEY_SIMPLEX#遍历图片像素foryinrange(0,re_im.shape[0]):forxinrange(0,re_im.shape[1]):char_pixel=pixel2char(re_im[y][x])cv2.putText(char_img,char_pixel,(x*font_size,y*font_size),font,0.5,(0,0,0))returnchar_imgdefgenerate(input_video,output_video):#1、读取视频cap=cv2.VideoCapture(input_video)#2、获取视频帧率fps=cap.get(cv2.CAP_PROP_FPS)#读取第一帧,获取转换成字符后的图片的尺寸ret,frame=cap.read()char_img=get_char_img(cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY),4)#创建一个VideoWriter,用于保存视频fourcc=cv2.VideoWriter_fourcc(*'mp4v')writer=cv2.VideoWriter(output_video,fourcc,fps,(char_img.shape[1],char_img.shape[0]))whileret:#读取视频的当前帧,如果没有则跳出循环ret,frame=cap.read()ifnotret:break#将当前帧转换成字符图gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)char_img=get_char_img(gray,4)#转换成BGR模式,便于写入视频char_img=cv2.cvtColor(char_img,cv2.COLOR_GRAY2BGR)writer.write(char_img)writer.release()if__name__=='__main__':generate('in.mp4','out.mp4')
我们只需要修改generate的参数就好了。
“Python如何生成字符视频”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。