1. 程式人生 > >Python結合OpenCV視訊處理、逐幀修改圖片

Python結合OpenCV視訊處理、逐幀修改圖片

前言

2015年7月畢業至今,已有三年半時間了。這麼長的時間裡,非常感激CSDN、部落格園、簡書等眾多平臺及眾多作者提供了無數的幫助。這篇文章是我的第一篇文章,一方面希望能總結、沉澱一些知識,另一方面,也希望從今天開始,能或多或少地幫助一些有需要的朋友。

背景

OpenCV中,讀取視訊用到的是:VideoCapture,寫入視訊用到的是:VideoWriter。
在一次視訊閃屏測試中,客戶給我們反饋閃屏出現卡頓、丟幀、甚至是倒計時未結束,視訊就已經結束了的情況。測試的視訊,就是一個普普通通的視訊而已,從肉眼看,除了能人為感知有些卡頓之外,我們沒有更多的資訊能夠知道到底哪個環節出現了問題。於是,我便想到了,在視訊裡面插入一些資訊,就可以更詳細地知道,視訊閃屏哪個環節出現了問題。整理的一下,需要用到的資訊有:FPS、總幀數、當前播放到第幾幀、該幀是視訊中的第幾秒。

讀取視訊並獲取相關資訊

video = cv2.VideoCapture("test.mp4")
fps = video.get(cv2.CAP_PROP_FPS)
frameCount = video.get(cv2.CAP_PROP_FRAME_COUNT)
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))

VideoCapture中傳入的是視訊路徑,可以是絕對路徑,也可以是相對路徑,test.mp4 這個視訊與python指令碼放在同一目錄,因此用相對路徑即可。
獲取到video物件之後,可以用過get方法,獲取視訊相關的資訊:
cv2.CAP_PROP_FPS:視訊幀率
cv2.CAP_PROP_FRAME_COUNT:視訊總幀數
cv2.CAP_PROP_FRAME_WIDTH:視訊寬度
cv2.CAP_PROP_FRAME_HEIGHT:視訊高度
更多視訊相關資訊,可以參考如下:

https://docs.opencv.org/3.2.0/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d

逐幀讀取視訊

success, frame = video.read() 

第一個返回值的是讀取視訊成功與否,第二個返回值是視訊當前幀,讀完後視訊會迭代到下一幀,下載再調read方法的時候,就可以把下一幀讀出。因此,用while迴圈,即可把視訊逐幀讀出:

success, frame = video.read() 
while success:
	success, frame = video.read()

重寫視訊

videoWriter = cv2.VideoWriter('trans.mp4', cv2.VideoWriter_fourcc(*'MP4V'), fps, size) 

第一個引數:視訊輸出地址
第二個引數:視訊編碼格式
第三個引數:視訊幀率
第四個引數:視訊大小資訊
videoWriter.write(frame),傳入視訊幀,就可以寫視訊了
其中,對寫入的frame,需要加入我們的一些除錯資訊。前面用read函式讀進來的frame是Mat型別,因此,可以直接在上面編輯即可。

cv2.putText(frame, 'fps: 24', (0,200), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,255,255), 5)

第一個引數:Mat類,即要修改的圖片
第二個引數:字串,要寫在圖片中的資訊
第三個引數:座標,(0,0)為圖片左上角
第四個引數:字型,具體可以參考下表格
第五個引數:字型大小倍數,與基本字型大小對比
第六個引數:字型顏色
第七個引數:字型筆畫厚度
更多字型資訊可以參考:
https://docs.opencv.org/trunk/d6/d6e/group__imgproc__draw.html#gga0f9314ea6e35f99bb23f29567fc16e11afff8b973668df2e4028dddc5274310c9

完整程式碼

# -*- coding: UTF-8 -*-
import cv2

video = cv2.VideoCapture("test.mp4")
fps = video.get(cv2.CAP_PROP_FPS)
frameCount = video.get(cv2.CAP_PROP_FRAME_COUNT)
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))

videoWriter = cv2.VideoWriter('trans.mp4', cv2.VideoWriter_fourcc(*'MP4V'), fps, size)  
success, frame = video.read()  
index = 1
while success :  
	cv2.putText(frame, 'fps: ' + str(fps), (0, 200), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,0,255), 5)
	cv2.putText(frame, 'count: ' + str(frameCount), (0, 300), cv2.FONT_HERSHEY_SIMPLEX,2, (255,0,255), 5)
	cv2.putText(frame, 'frame: ' + str(index), (0, 400), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,0,255), 5)
	cv2.putText(frame, 'time: ' + str(round(index / 24.0, 2)) + "s", (0,500), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,0,255), 5)
	cv2.imshow("new video", frame)
	cv2.waitKey(1000 / int(fps))
	videoWriter.write(frame)
	success, frame = video.read()
	index += 1

video.release()


效果

在這裡插入圖片描述