OpenCV给图像加文字生成视频时背景未重置、文字重叠问题咨询
问题根因
cv2.imread()返回的图像是Numpy数组格式,在Python中直接执行frame_img = bg_img属于引用赋值,并没有生成新的独立图像副本,两个变量指向内存中同一块图像数据。
因此你调用cv2.putText()在frame_img上绘制文字时,实际修改的是原始的bg_img背景图数据,循环到下一帧时拿到的bg_img已经是上一轮画过文字的版本,自然就出现了文字层层叠加的效果。
而你每次循环重新读取背景图的写法,相当于每次都从磁盘加载原始的干净背景,所以不会有叠加问题,但会产生不必要的磁盘IO开销。
修复方案
只需要在每次重置帧时,调用Numpy数组的copy()方法生成原始背景的独立副本即可,无需重复读取磁盘文件:
bg_img = cv2.imread('background_image.jpg') for frame_num in range(n_frames): print(f'Frame: {frame_num}') frame_img = bg_img.copy() # 生成背景的独立副本,修改不会影响原bg_img for gxi in range(gxn): for gyi in range(gyn): txt = str(int(np_vec[frame_num,gyi,gxi,feature_index])) loc = (int((gxi+0.4)*gxd),int((gyi+0.7)*gyd)) cv2.putText(frame_img, txt, loc, font, fontScale, font_color, text_thickness, cv2.LINE_AA) vidout.write(frame_img.astype(np.uint8)) vidout.release()
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

