作者|PRATEEK JOSHI
編譯|VK
來源|Analytics Vidhya
概述
-
在運動物體后面添加影像是一個典型的計算機視覺專案
-
了解如何使用傳統的計算機視覺技術在視頻中添加logo
介紹
我的一位同事向我提出了一個挑戰——建立一個計算機視覺模型,可以在視頻中插入任何影像,而不會扭曲移動的物體,
如你所想,這是一個非常有趣的專案,
眾所周知,處理視頻是很困難的,因為它們是動態的,與影像不同,我們沒有可以輕易識別和跟蹤的靜態物件,復雜性水平上升了好幾個層次——這就需要我們對影像處理技術和計算機視覺技術的把握,

我決定在背景上加個logo,我稍后將詳細說明的挑戰是,在任何給定視頻中插入一個不會妨礙物件動態特性的logo,
我使用Python和OpenCV構建了這個計算機視覺系統,并在本文中分享了我的方法,
目錄
-
理解問題陳述
-
獲取此專案的資料
-
為我們的計算機視覺專案制定藍圖
-
在Python中實作這項技術——讓我們添加logo!
理解問題陳述
這將是一個非常罕見的計算機視覺使用案例,我們將在視頻中嵌入一個logo,現在你一定在想-那有什么大不了的?我們可以簡單地把標志貼在視頻上,對吧?
然而,這個標志可能只是隱藏了一些有趣的動作在視頻中,如果標志妨礙了前面的移動物體怎么辦?這會看起來很low,
因此,我們必須弄清楚如何在背景中的某個地方添加logo,這樣就不會阻止視頻中正在進行的主要操作,
下面的視頻-左半部分是原始視頻,右半部分的logo出現在舞者身后的墻上:
視頻:https://youtu.be/L9KsuvO0VMs
這是我們將在本文中實作的想法,
獲取此專案的資料
我從pexels.com網站,一個免費的股票視頻網站,如前所述,我們的目標是在視頻中放置一個標志,使其出現在某個移動物件的后面,
所以,目前,我們將使用OpenCV本身的標志,你可以使用任何你想要的標志(也許你最喜歡的運動隊?),

你可以從這里下載視頻和logo,
https://drive.google.com/file/d/1mXJtJOMTZYm-W6rQavdclbBUEuj3JL4v/view?usp=sharing
為我們的計算機視覺專案制定藍圖
在實施這個專案之前,我們先了解一下這個方法,要執行此任務,我們將借助影像掩碼,讓我給你看一些插圖來了解這項技術,
假設我們要在影像(圖2)中放置一個矩形(圖1),使第二個影像中的圓出現在矩形的頂部:

所以,期望的結果應該是這樣的:

然而,這并不是那么簡單,當我們從圖1中選取矩形并將其插入圖2中時,它將出現在粉色圓圈的頂部:

這不是我們想要的,圓圈應該在矩形的前面,所以,讓我們了解如何解決這個問題,
這些影像本質上是陣列,這些陣列的值是像素值,每種顏色都有自己的像素值,
因此,我們可以將矩形的像素值設定為1,在這里它應該與圓重疊(在圖5中),同時保持矩形的其余像素值不變,
在圖6中,藍色虛線包圍的區域是我們放置矩形的區域,讓我們用R來表示這個區域,我們也將R的所有像素值設定為1,但是,我們將保持整個粉色圓圈的像素值不變:

我們的下一步是將矩形的像素值與R的像素值相乘,因為任何數字乘以1都會得到該數字本身,所以所有R的像素值都將被矩形的像素替換,
類似地,矩形的像素值1將被圖6的像素替換,最終的結果是這樣的:

這是我們將要使用的技術,將OpenCV標志嵌入到視頻中背后的原理,我們來吧!
在Python中實作這項技術
你可以使用Jupyter筆記本或任何你選擇的IDE,然后繼續,我們將首先匯入必要的庫,
匯入庫
import cv2
import re
import os
import random
import numpy as np
import matplotlib.pyplot as plt
from os.path import isfile, join
注意:本教程使用的OpenCV庫版本是4.0.0,
加載影像
接下來,我們將指定保存logo和視頻的作業目錄的路徑,請注意,你應該在下面的代碼片段中指定“path”:
# 指定作業目錄的路徑
path = ".../"
# 讀取logo影像
logo = cv2.imread(path+"opencv_logo.png")
# 閱讀視頻的第一幀
cap = cv2.VideoCapture(path+"Pexels Videos 2675513.mp4")
ret, frame = cap.read()
所以,我們已經加載了logo影像和視頻的第一幀,現在讓我們看看這些影像或陣列的形狀:
logo.shape, frame.shape
輸出:((240, 195, 3), (1080, 1920, 3))
兩個輸出都是三維的,第一個維度是影像的高度,第二個維度是影像的寬度,第三個維度是影像中的通道數,即藍色、綠色和紅色,
現在,讓我們繪制并查看logo和視頻的第一幀:
plt.imshow(logo)
plt.show()

plt.imshow(cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))
plt.show()

影像掩碼技術
框架尺寸比logo大得多,因此,我們可以把logo放在許多地方,
然而,把logo放在畫面的中心對我來說似乎是完美的,因為大部分的動作都會發生在視頻中的那個區域,因此,我們將把logo放入框架中,如下所示:

不用擔心標志中的黑色背景,我們將在稍后的代碼中將黑色區域中的像素值設定為1,現在我們要解決的問題是處理移動物體出現在我們放置標志的同一區域,
如前所述,我們需要使logo允許自己被移動物件遮擋,
現在,我們將在其中放置logo的區域具有廣泛的像素值,理想情況下,此區域中的所有像素值都應相同,那我們怎么做呢?

我們必須使綠色虛線框包圍的墻像素具有相同的值,我們可以借助HSV(色調、飽和度、值)顏色空間來完成此操作:

我們的影像是在RGB色彩空間,我們將把它轉換成HSV影像,下圖是HSV版本:

下一步是僅查找綠色虛線框內零件的HSV值范圍,結果顯示框中的大多數像素的范圍從[6,10,68]到[30,36,122],它們分別是HSV的上下范圍,
現在使用這個HSV值范圍,我們可以創建一個二進制掩碼,此掩碼只是像素值為0或255的影像,因此,在HSV值的上下范圍內的像素將等于255,其余像素將為0,
下面是根據HSV影像準備的掩碼,黃色區域中的所有像素的像素值為255,其余像素值為0:

現在,我們可以根據需要輕松地將綠色虛線框內的像素值設定為1,讓我們回到代碼:
# HSV的范圍
lower = np.array([6,10,68])
upper = np.array([30,36,122])
# 為影像創建核
kernel = np.ones((3,3),np.uint8)
# 每次運行以下while回圈時,執行下面的兩行
cap = cv2.VideoCapture(path+"Pexels Videos 2675513.mp4")
cnt = 0
# 回圈加載、預處理和顯示幀
while(True):
ret, f = cap.read()
# 提取我們將放置logo的區域
# 此區域的尺寸應與logo的尺寸相匹配
mini_frame = f[500:740,875:1070,:]
# 創建 HSV 影像
hsv = cv2.cvtColor(f, cv2.COLOR_BGR2HSV)
# 創建掩碼
mask = cv2.inRange(hsv, lower, upper)
dil = cv2.dilate(mask,kernel,iterations = 5)
# 創建3個通道
mini_dil = np.zeros_like(mini_frame)
mini_dil[:,:,0] = dil[500:740,875:1070]
mini_dil[:,:,1] = dil[500:740,875:1070]
mini_dil[:,:,2] = dil[500:740,875:1070]
# 復制logo影像
logo_copy = logo.copy()
# 當掩碼的像素值為0時,將像素值設定為1
logo_copy[mini_dil == 0] = 1
# 將標識的像素值設定為1,其中標識的像素值為0
logo_copy[logo == 0] = 1
# 當logo的像素值不為1時,將像素值設定為1
mini_frame[logo_copy != 1] = 1
# 合并影像(陣列乘法)
mini_frame = mini_frame*logo_copy
# 在框架中插入logo
f[500:740,875:1070,:] = mini_frame
# 調整框架的大小(可選)
f = cv2.resize(f, (480, 270), interpolation = cv2.INTER_AREA)
# 顯示幀
cv2.imshow('frame', f)
# 保存幀
# cv2.imwrite(path+'frames/'+str(cnt)+'.png',f)
cnt+= 1
if cv2.waitKey(20) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
上面的代碼片段將從視頻中加載幀,對其進行預處理,并創建HSV影像和掩碼,最后將logo插入到視頻中,你完成了!
結尾
在本文中,我們介紹了一個非常有趣的計算機視覺用例,并從零開始實作它,在此程序中,我們還學習了如何使用影像陣列以及如何從這些陣列創建掩碼,
當你處理其他的計算機視覺任務時,這會對你有所幫助,
原文鏈接:https://www.analyticsvidhya.com/blog/2020/06/deep-learning-project-image-object-opencv/
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/6842.html
標籤:其他
上一篇:DAX教程:籃子分析2.0
