[VR] VR視頻類型識別?

目前通過圖像識別的方式區分視頻類型,並已完成應用層的實現,識別率很高

優點:

1.不用修改系統的MediaScanner 所以不用升級系統

2.視頻文件中一般隻有mp4文件有metadata 其中box和uuid之類的特征標識並沒有標準行業規范 所以通過圖像識別的方式 沒有文件格式和視頻編解碼的限制

缺點:

1.比獲取視頻文件特征標識的方式速度慢

1.對一個視頻 根據播放時長平均取若幹幀圖像 根據每幀圖像識別後 返回的類型 做加權 最後權值大於40% 則為該類型

2.判斷流程:

先判斷左右眼3d  — true — 返回3d類型 — false — 

判斷上下眼3d — true — 返回3d類型— false — 

判斷全景 — true — 返回全景— false — 返回2d

3.判斷左右眼3d:取圖像最中間一列像素 作為基準線 判斷該列和其右邊一列是否有連續性 如果不連續 則為左右眼3d

但很多3d視頻左右眼寬度不相等 所以一次判斷不是 還需要多判斷幾次 即左右各移動兩次 每次移動一列

4.判斷上下眼3d:取圖像最中間一行像素 作為基準線 判斷該行和其下面一行是否有連續性 如果不連續 則為上下眼3d

但很多3d視頻上下眼高度不相等 所以一次判斷不是 還需要多判斷幾次 即上下各移動兩次 每次移動一行

5.判斷全景視頻:由於全景視頻是360度的 所以圖像最左邊一列《第0列》和最右邊一列《第n-1列》 必然可以連接起來 所以判斷這兩列是否有連續性 如果連續 則為全景視頻

1.視頻取幀速度慢 取一幀需要幾百毫秒 所以性能瓶頸不在算法的時間復雜度 而是調用系統函數取視頻幀慢

2.加權閥值40% 不合適 如果取兩幀 則權重閥值為0了 至少應為50% 取幀的數量會影響耗時

3.如果視頻有片頭或片尾 比如黑色畫面 顯示演員列表之類的 對於圖像判斷連續性及加權結果 有很大影響

4.無論左右眼還是上下眼3d 很多視頻 中間會有間隙或黑線 視頻分辨率越高則間隙或黑線所占像素的行列越多 所以僅僅移動像素行列兩次 是沒用的

5.視頻畫面很暗 則對判斷像素的連續性 有影響

1.跳過視頻時長的前後10%的時間段 認為是片頭或片尾 對視頻中間的時間段取幀

2.取10幀或者取1幀 其實大部分情況下 在圖像上的特征沒有區別 3d視頻左右或上下有對稱性 全景最左和最右可以連接起來 所以隻取1幀 不考慮加權 耗時減少一個量級

3.在不影響識別結果的情況下 對原始的視頻幀圖像進行等比例壓縮 減少實時的內存占用 更少的像素判斷次數 耗時減少

4.每個視頻文件 不用每次應用啟動都進行識別 可以緩存文件的hash值和視頻類型的識別結果 後面啟動不需要再識別之前已經識別過的視頻文件 隻需讀取緩存過的識別結果

5.判斷左右眼3d改為: 取左右眼各自區域圖像的最中間一列像素 判斷兩列像素是否有連續性 如果連續 即說明圖像對稱 則為左右眼3d 但很多3d視頻左右眼寬度不相等 所以一次判斷不是 還需要多判斷幾次 即右眼區域圖像左右各移動兩次 每次移動一列 這樣就不需要判斷取圖像中間列 即不存在有黑線和間隙的問題

6.判斷上下眼3d改為: 取上下眼各自區域圖像的最中間一行像素 判斷兩行像素是否有連續性 如果連續 即說明圖像對稱 則為上下眼3d 但很多3d視頻上下眼高度不相等 所以一次判斷不是 還需要多判斷幾次 即下眼區域圖像上下各移動兩次 每次移動一行 這樣就不需要判斷取圖像最中間行 即不存在有黑線和間隙的問題

1.視頻畫面很暗 則對判斷像素的連續性 有影響

2.經測試 調用系統函數對視頻取幀 在樂視X2和S2的安卓6.0以上 存在兼容性問題

1.不用系統函數對視頻取幀 改用第三方FFMPEG編解碼庫 並將其中取幀的部分提取出來 提高取幀速度

Q : 如何判斷兩列《行》像素連續性或相似性

A : 

1.依次取出該列《行》的像素顏色值 對顏色值做位運算《要考慮各通道占位ARGB8888、RGB565、RGB444》 取出RGB三通道的值 兩列《行》相同索引像素的RGB值分別求均值《兩列或行差值的絕對值累加求和/該列或行的像素數》 取RGB三通道中的最大均值

2.同上 再對RGB三通道分別求方差《《 兩列或行差值的絕對值-兩列或行的均值》的平方的累加求和/該列或行的像素數》 取RGB三通道中的最大方差

3.求出的最大均值或最大方差 若超過閥值 則說明無連續性或低相似性