訂閱
糾錯
加入自媒體

使用計算機視覺反轉(zhuǎn)視頻

介紹

在本文中,我們將使用[計算機視覺技術(shù)開發(fā)一個應(yīng)用程序,該應(yīng)用程序?qū)⒎崔D(zhuǎn)視頻,并且我們將能夠?qū)⒎崔D(zhuǎn)的視頻保存在我們的本地系統(tǒng)中。在此應(yīng)用程序中,我們還可以更改其質(zhì)量,例如 360/720p。

因此,讓我們首先了解構(gòu)建這個應(yīng)用程序需要做什么。

構(gòu)建此應(yīng)用程序的步驟

本節(jié)將討論構(gòu)建此應(yīng)用程序需要完成的步驟。在這里,我們將設(shè)置模板并在整個教程中遵循此方法。

導(dǎo)入 cv2 庫:這是一個非常簡單的工作, cv2即 Python 的計算機視覺庫。

閱讀/捕捉視頻:然后,我們將閱讀我們想要反轉(zhuǎn)的視頻。

使用幀:在本節(jié)中,我們將使用視頻的幀來獲得處理速度,即每秒幀數(shù)和幀數(shù)。

高度和寬度:在這里,我們將簡單地提取我們已閱讀的視頻的高度和寬度,以便我們可以之后的重新縮放部分中使用它。

重新縮放和設(shè)置輸出視頻的類型:現(xiàn)在,在這一部分中,我們將簡單地將視頻重新縮放到一定的大小,并設(shè)置最后要保存的視頻類型。

循環(huán)所有內(nèi)容:最后,我們將所有內(nèi)容都放入與幀相關(guān)的一些條件的循環(huán)中,并且我們都準備好反轉(zhuǎn)我們的視頻。

原始視頻

在進行編碼部分之前,我們應(yīng)該知道我們的原始視頻是什么樣子的!這樣在查看結(jié)果的同時,我們可以輕松地比較它們。

本文選擇的視頻是來自 YouTube 的 ens pack 開場視頻,在本文中,我們將只處理這個視頻,并使用計算機視覺技術(shù)將其反轉(zhuǎn)。

導(dǎo)入庫

這里我們只導(dǎo)入計算機視覺庫,即cv2。

import cv2

閱讀視頻實例

這里是我們閱讀視頻的步驟。首先,讓我們看一下代碼,然后我們將討論它。

cap = cv2.VideoCapture('sample2.mp4')

我們使用 cv2 的Video Capture 函數(shù)來讀取視頻。為此,我們用引號括起來的參數(shù)中傳遞視頻的路徑;請記住一件事,如果視頻位于同一文件夾中,則不需要使用完整路徑;使用帶有擴展名的視頻名稱。

使用框架

在這個部分中,我們將獲取視頻所擁有的總幀數(shù),為此,我們將使用FRAME COUNT對象

frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)

因此,在這里,可以在分解函數(shù)名稱的同時輕松解碼函數(shù):

CAP:CapturePROP:PropertyFRAME_COUNT:總幀數(shù)

但是我們是否使用最有效的方法來獲取每秒的總幀數(shù)?

簡單的答案是:“是的!”

原因:如果我們使用循環(huán)來計數(shù)幀并每次遞增計數(shù)器,那么由于處理時間的原因,這對開發(fā)人員和 CPU 來說都是一個耗費精力的過程,但如果我們使用內(nèi)置方法,那么我們就可以解決這兩個問題。

因此,就在我們現(xiàn)在獲取視頻的總幀數(shù)之前,我們將嘗試獲取每秒幀數(shù) (FPS)。

fps = cap.get(cv2.CAP_PROP_FPS)

如果你有計算總幀數(shù)的概念,這將非常容易理解。如果我們分解計算FPS的內(nèi)置函數(shù),那么我們可以看到以下縮寫:

· CAP: Capture

· PROP: Property

· FPS: Frames per second

獲取視頻的高度和寬度

在這里,我們將計算視頻的高度和寬度,以便我們可以根據(jù)自己的喜好重新縮放輸出視頻。

height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)

高度:我們這里使用的內(nèi)置函數(shù)是CAP_PROP_FRAME_HEIGHT,在這里我們可以看到FRAME_HEIGHT會得到每一幀的高度,即完整

頻的高度。寬度:同樣,F(xiàn)RAME_WIDTH 將用于查找視頻的寬度。啟動視頻的輸出寫入器

現(xiàn)在我們將首先使用Video Writer, fourcc方法,將 4 個字符的代碼賦予輸出視頻以根據(jù)我們的需要壓縮幀。

這里我們使用“MJPG”字符代碼來壓縮幀。它也被稱為視頻編解碼器,我們有多種視頻編解碼器,如果我們想查看參數(shù)列表,我們可以將其作為參數(shù)傳遞給函數(shù),然后可以在 FOURCC 頁面上找到。

注意:我們使用的是 MJPG 字符代碼,即 motion-jpeg 編解碼器。

然后我們簡單地將輸出視頻重新縮放到它們的一半比例,即高度和寬度都減少到 50%。

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

out = cv2.VideoWriter('reversed2.a(chǎn)vi', fourcc,fps ,(int(width*0.5), int(height*0.5)))

讓我們打印一些結(jié)果

1. 總幀數(shù)

2. 處理期間的每秒幀數(shù)。

print("No. of frames are : {}".format(frames))

print("FPS is :{}".format(fps))

輸出:

No. of frames are : 488.0

FPS is :25.0

在這里,我們將檢索索引,即視頻最后一幀的位置。

frame_index = frames-1

最后一步

讓我們將所有內(nèi)容放在一個循環(huán)中以獲得結(jié)果;在這里,我們將循環(huán)執(zhí)行之前已經(jīng)完成的所有操作,然后將視頻保存在我們的本地系統(tǒng)中

if(cap.isOpened()):

  while(frame_index。0):

      cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)

      ret, frame = cap.read()

      frame = cv2.resize(frame,(int(width*0.5), int(height*0.5)))

      out.write(frame)

      frame_index = frame_index-1

      if(frame_index%100==0):

         print(frame_index)

out.release()

cap.release()

cv2.destroyAllWindows()

輸出:

400.0

300.0

200.0

100.0

0.0

代碼分解:

1. 我們先借助opens() 函數(shù)檢查一下視頻的實例是否準備好了

2. 然后我們將使用幀索引讀取幀直到視頻結(jié)束

3. 現(xiàn)在,由于我們想要獲得反向視頻,我們將當前幀的位置初始化為最后一幀。

4. 可選:現(xiàn)在,如果我們想看實時反向視頻,我們可以使用 cv2.imshow('name', frame),但是,

5. 如果我們想在本地系統(tǒng)中下載(寫入)視頻,那么我們將使用 write 方法,并且在每一步之后,我們將簡單地減少幀索引。

6. 最后一步是打印幀值(這只是為了檢查進度),然后釋放實例并銷毀窗口。

輸出:

因此,在這里我們可以看到,在我們之前所做的所有計算機視覺操作的幫助下,原始視頻已成功反轉(zhuǎn)。

結(jié)論

我們已經(jīng)涵蓋了我們之前討論過的所有步驟,現(xiàn)在我們已經(jīng)編寫(下載)了我們的反轉(zhuǎn)視頻,你可以在上面的 YouTube 視頻鏈接中看到。

現(xiàn)在讓我們總結(jié)一下到目前為止我們學(xué)到的東西。

1. 本文的第一個要點是,我們學(xué)習(xí)了如何 在本地和實時視頻中使用幀。

2. 我們還學(xué)習(xí)了使用內(nèi)置函數(shù)獲取視頻幀及其處理時間的最佳方法。

3. 然后在預(yù)處理后編寫視頻的同時,我們還注意到一個簡單的變換可以給我們正確的輸出(這里是反向視頻)。

       原文標題 : 使用計算機視覺反轉(zhuǎn)視頻

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號