Python 基于 OpenCV 視覺圖像處理實(shí)戰(zhàn) 之 OpenCV 簡(jiǎn)單視頻處理實(shí)戰(zhàn)案例 之十一 簡(jiǎn)單給視頻添加水印圖片效果
目錄
Python 基于 OpenCV 視覺圖像處理實(shí)戰(zhàn) 之 OpenCV 簡(jiǎn)單視頻處理實(shí)戰(zhàn)案例 之十一 簡(jiǎn)單給視頻添加水印圖片效果
一、簡(jiǎn)單介紹
二、簡(jiǎn)單給視頻添加水印圖片效果實(shí)現(xiàn)原理
三、簡(jiǎn)單給視頻添加水印圖片效果案例實(shí)現(xiàn)簡(jiǎn)單步驟
四、注意事項(xiàng)
一、簡(jiǎn)單介紹
Python是一種跨平臺(tái)的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。是一種面向?qū)ο蟮膭?dòng)態(tài)類型語(yǔ)言,最初被設(shè)計(jì)用于編寫自動(dòng)化腳本(shell),隨著版本的不斷更新和語(yǔ)言新功能的添加,越多被用于獨(dú)立的、大型項(xiàng)目的開發(fā)。Python是一種解釋型腳本語(yǔ)言,可以應(yīng)用于以下領(lǐng)域: Web 和 Internet開發(fā)、科學(xué)計(jì)算和統(tǒng)計(jì)、人工智能、教育、桌面界面開發(fā)、軟件開發(fā)、后端開發(fā)、網(wǎng)絡(luò)爬蟲。
這里使用 Python? 基于 OpenCV 進(jìn)行視覺圖像處理,......
二、簡(jiǎn)單給視頻添加水印圖片效果實(shí)現(xiàn)原理
視頻水印是指在視頻內(nèi)容中添加圖像、文字或其他標(biāo)識(shí)符的技術(shù),以表明視頻的所有權(quán)、來(lái)源、版權(quán)信息或其他相關(guān)信息。視頻水印可以是透明的或半透明的,通常位于視頻畫面的角落或其他不影響主要內(nèi)容的位置。視頻水印可以用于保護(hù)視頻內(nèi)容的版權(quán),防止未經(jīng)授權(quán)的復(fù)制和使用,以及增加視頻的專業(yè)性和可識(shí)別性。
實(shí)現(xiàn)原理:
- 打開輸入視頻文件,并獲取其每一幀的大小。
- 打開水印圖像文件,并獲取其大小。
- 遍歷視頻的每一幀,將水印圖像疊加到視頻幀上。
- 根據(jù)指定的位置參數(shù)確定水印在視頻幀上的位置,并將水印圖像疊加到相應(yīng)的位置上。
- 將帶有水印的視頻幀寫入輸出視頻文件。
實(shí)現(xiàn)方法:
- 使用 OpenCV 的
VideoCapture
類打開輸入視頻文件,并讀取每一幀。- 使用 OpenCV 的
VideoWriter
類創(chuàng)建輸出視頻文件,并指定視頻編碼器、幀率和大小。- 使用 OpenCV 的
imread
函數(shù)讀取水印圖像。- 遍歷視頻的每一幀,在每一幀上疊加水印圖像。
- 根據(jù)指定的位置參數(shù)確定水印的位置,并將水印圖像疊加到視頻幀的相應(yīng)位置上。
- 使用 OpenCV 的
addWeighted
函數(shù)將水印圖像疊加到視頻幀上,實(shí)現(xiàn)透明度疊加效果。- 將帶有水印的視頻幀寫入輸出視頻文件。
涉及了一些關(guān)鍵函數(shù):
cv2.VideoCapture(): 用于打開視頻文件并創(chuàng)建一個(gè)視頻捕獲對(duì)象。在這里,它被用于打開輸入視頻文件并創(chuàng)建一個(gè)用于讀取幀的視頻捕獲對(duì)象。
cap.isOpened(): 用于檢查視頻是否成功打開。在這里,它被用于檢查輸入視頻文件是否成功打開。
cap.read(): 用于讀取視頻的下一幀。在這里,它被用于循環(huán)遍歷視頻的每一幀并讀取幀內(nèi)容。
cv2.VideoWriter(): 用于創(chuàng)建一個(gè)視頻寫入對(duì)象,可以將幀寫入視頻文件。在這里,它被用于創(chuàng)建一個(gè)用于寫入幀的視頻寫入對(duì)象。
cv2.imread(): 用于讀取圖像文件。在這里,它被用于讀取水印圖像文件。
cv2.imwrite(): 用于將圖像寫入文件。雖然在這里沒(méi)有直接使用,但可以用它來(lái)保存添加水印后的幀。
cv2.putText(): 用于向圖像中添加文字。在這里,雖然沒(méi)有直接使用,但可以用它來(lái)添加文字水印。
cv2.addWeighted(): 用于將兩個(gè)圖像進(jìn)行加權(quán)疊加。在這里,它被用于將水印圖像疊加到視頻幀上。
cap.release(): 用于釋放視頻捕獲對(duì)象的資源。
out.release(): 用于釋放視頻寫入對(duì)象的資源。
cv2.destroyAllWindows(): 用于關(guān)閉所有窗口,通常在程序結(jié)束時(shí)調(diào)用。
三、簡(jiǎn)單給視頻添加水印圖片效果案例實(shí)現(xiàn)簡(jiǎn)單步驟
1、編寫代碼
2、運(yùn)行效果
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-857540.html
3、具體代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857540.html
"""
簡(jiǎn)單給視頻添加水印圖片效果
1、打開輸入視頻文件,并獲取其每一幀的大小。
2、打開水印圖像文件,并獲取其大小。
3、遍歷視頻的每一幀,將水印圖像疊加到視頻幀上。
4、根據(jù)指定的位置參數(shù)確定水印在視頻幀上的位置,并將水印圖像疊加到相應(yīng)的位置上。
5、將帶有水印的視頻幀寫入輸出視頻文件。
"""
import cv2
import os
def add_watermark_to_video(input_video_path, output_video_path, watermark_image_path, alpha=1.0,
position='bottom-right'):
"""
簡(jiǎn)單給視頻添加水印圖片效果
:param input_video_path: 原視頻路徑
:param output_video_path: 添加水印后保存視頻路徑
:param watermark_image_path: 水印圖片路徑
:param alpha: 控制水印整體透明度的參數(shù),范圍為 0 到 1
:param position: 控制水印位置的參數(shù),可選值包括 'top-left', 'top-right', 'bottom-left', 'center', 'bottom-right'
:return:
"""
# 檢查輸入視頻文件是否存在
if not os.path.isfile(input_video_path):
print("Error: Input video file does not exist.")
return
# 檢查水印圖像文件是否存在
if not os.path.isfile(watermark_image_path):
print("Error: Watermark image file does not exist.")
return
# 打開視頻文件
cap = cv2.VideoCapture(input_video_path)
# 檢查視頻是否成功打開
if not cap.isOpened():
print("Error: Failed to open input video.")
return
# 獲取視頻的寬度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 創(chuàng)建VideoWriter對(duì)象用于寫入輸出視頻
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_video_path, fourcc, 30.0, (width, height))
# 讀取水印圖像
watermark = cv2.imread(watermark_image_path, cv2.IMREAD_UNCHANGED)
# 檢查水印圖像是否成功讀取
if watermark is None:
print("Error: Failed to read watermark image.")
return
# 檢查水印圖像的透明度通道是否存在
if watermark.shape[2] < 4:
print("Error: Watermark image does not have an alpha channel.")
return
# 循環(huán)遍歷視頻的每一幀
while True:
ret, frame = cap.read()
if not ret:
break
# 將水印疊加到當(dāng)前幀上
overlay = frame.copy()
h, w = watermark.shape[:2]
# 根據(jù)位置參數(shù)確定水印的位置
if position == 'top-left':
x_offset, y_offset = 10, 10
elif position == 'top-right':
x_offset, y_offset = width - w - 10, 10
elif position == 'bottom-left':
x_offset, y_offset = 10, height - h - 10
elif position == 'center':
x_offset, y_offset = (width - w) // 2, (height - h) // 2
else: # 默認(rèn)為 'bottom-right'
x_offset, y_offset = width - w - 10, height - h - 10
for c in range(0, 3):
overlay[y_offset:y_offset + h, x_offset:x_offset + w, c] = \
watermark[:, :, c] * (watermark[:, :, 3] / 255.0 * alpha) + frame[y_offset:y_offset + h,
x_offset:x_offset + w, c] * (
1.0 - watermark[:, :, 3] / 255.0 * alpha)
# 將幀寫入輸出視頻
out.write(overlay)
# 釋放資源
cap.release()
out.release()
cv2.destroyAllWindows()
def main():
# 調(diào)用函數(shù)并指定輸入和輸出視頻文件路徑以及水印圖像路徑
input_video_path = "Videos/CatRun.mp4"
output_video_path = "Videos/CatRun_Wartermark.mp4"
watermark_image_path = "Images/Watermark.png"
alpha = 0.5 # 控制水印整體透明度的參數(shù),范圍為 0 到 1
position = 'top-right' # 控制水印位置的參數(shù),可選值包括 'top-left', 'top-right', 'bottom-left', 'center', 'bottom-right'
# 執(zhí)行函數(shù)
add_watermark_to_video(input_video_path, output_video_path, watermark_image_path, alpha, position)
if __name__ == "__main__":
main()
四、注意事項(xiàng)
- 參數(shù)安全性:對(duì)于輸入的參數(shù),需要進(jìn)行安全校驗(yàn),以確保輸入的參數(shù)值在有效范圍內(nèi),避免出現(xiàn)錯(cuò)誤。
- 圖像大小匹配:確保水印圖像的大小與視頻幀的大小匹配,否則可能導(dǎo)致疊加時(shí)的錯(cuò)誤。
- 透明度處理:根據(jù)水印圖像的透明度信息,合理處理水印圖像與視頻幀的疊加透明度,以保持水印的透明效果。
- 位置處理:根據(jù)指定的位置參數(shù),確保水印圖像疊加到視頻幀的正確位置上,避免覆蓋重要信息或者顯示不完整。
- 資源釋放:在處理完所有幀之后,及時(shí)釋放視頻讀取和寫入的資源,以避免內(nèi)存泄漏或資源浪費(fèi)。
到了這里,關(guān)于Python 基于 OpenCV 視覺圖像處理實(shí)戰(zhàn) 之 OpenCV 簡(jiǎn)單視頻處理實(shí)戰(zhàn)案例 之十一 簡(jiǎn)單給視頻添加水印圖片效果的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!