日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

人像抠图 + OpenGL ES

發(fā)布時(shí)間:2024/1/1 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 人像抠图 + OpenGL ES 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OpenGL ES 利用摳圖算法實(shí)現(xiàn)人像留色

人像留色的原理

現(xiàn)在人像分割技術(shù)就像當(dāng)初的人臉檢測(cè)算法一樣,稱為廣泛使用的基礎(chǔ)算法。

今天本文介紹的人像留色其實(shí)就是三年前某 AI 巨頭利用 video 分割技術(shù)展示的應(yīng)用場(chǎng)景:人體區(qū)域保留彩色,人體區(qū)域之外灰度化。所以人像留色的關(guān)鍵技術(shù)在于高精度高性能的分割算法。

首先利用分割算法獲取到人像的 mask 圖(灰度圖),其中人像區(qū)域的灰度值大于 0 ,非人像區(qū)域的灰度值等于 0 。在 shader 中,首先對(duì) mask 圖采樣判斷采樣點(diǎn)是否位于人像區(qū)域,然后分別進(jìn)行不同的處理。

獲取人像 mask 圖

那么如何獲取人像 mask 圖?Github 上已經(jīng)有很多大神開(kāi)源了相關(guān)的分割或者摳圖算法。

這里推薦 3 個(gè)比較受歡迎的開(kāi)源項(xiàng)目

Multi-Human-Parsing

Multi-Human-Parsing 的優(yōu)勢(shì)在于支持多人不同部位的分割,同時(shí)支持目標(biāo)檢測(cè)和人體部位分割。

Multi-Human-Parsing 將人群場(chǎng)景圖像劃分為語(yǔ)義一致的屬于身體部位或衣服物品的區(qū)域,從而為圖像中的每個(gè)像素分配一個(gè)語(yǔ)義部位標(biāo)簽,以及它所屬的身份。

有很多應(yīng)用場(chǎng)景,如虛擬現(xiàn)實(shí)、視頻監(jiān)控、群體行為分析等。 Multi-Human-Parsing 的分割精度對(duì)于人體關(guān)鍵點(diǎn)檢測(cè)其實(shí)夠用了。

項(xiàng)目地址:?https://github.com/ZhaoJ9014/Multi-Human-Parsing

BackgroundMattingV2

大名鼎鼎的 BackgroundMattingV2 算法,這也是本文所使用的摳圖算法,主要特點(diǎn)就是實(shí)時(shí)、高分辨率、高精度的分割(Background Matting),項(xiàng)目免費(fèi)可商用。

但是要在移動(dòng)端落地的話,性能將會(huì)是很大的瓶頸,需要進(jìn)行大量的算法優(yōu)化,這也是目前大部分 AI 算法面臨的問(wèn)題:如何將 AI 算法落地到低算力平臺(tái)。

項(xiàng)目地址:?https://github.com/PeterL1n/BackgroundMattingV2

TensorFlow Lite

TensorFlow Lite 是針對(duì)移動(dòng)端的開(kāi)源機(jī)器學(xué)習(xí)框架,支持 Android 和 iOS,提供了豐富的算法模型,包括圖像分割、目標(biāo)檢測(cè)、圖像分類、超分等模型。

其中分割模型支持的場(chǎng)景比較豐富,包括人體、寵物和物體等。

val labelsArrays = arrayOf("background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus","car", "cat", "chair", "cow", "dining table", "dog", "horse", "motorbike","person", "potted plant", "sheep", "sofa", "train", "tv" )

TensorFlow Lite 所提供的分割模型,使用 GPU 的話,單張 2K 的圖處理時(shí)間在幾百毫秒,基本上做不了 video 處理,另外分割精度也是 demo 級(jí)別的。

項(xiàng)目地址:?https://github.com/tensorflow/examples/tree/master/lite/examples/image_segmentation

人像留色的實(shí)現(xiàn)

用于實(shí)現(xiàn)人像留色的簡(jiǎn)單 shader :

#version 300 es precision mediump float; in vec2 v_texCoord; layout(location = 0) out vec4 outColor; uniform sampler2D u_texture0;//rgba uniform sampler2D u_texture1;//人像灰度圖 uniform int u_renderType; uniform float u_offset; void main() {float gray = texture(u_texture1, v_texCoord).r;//對(duì) mask 進(jìn)行采樣vec4 rgba = texture(u_texture0, v_texCoord);if(gray > 0.01) {outColor = rgba;}else{float Y = 0.299 * rgba.r + 0.587 * rgba.g + 0.114 * rgba.b;//RGB 灰度化vec4 grayColor = vec4(vec3(Y), 1.0);outColor = mix(grayColor, rgba, u_offset);//混合漸變} }

shader 中首先對(duì) mask 采樣,然后判斷采樣點(diǎn)是否位于人像區(qū)域(灰度值是否大于 0 ),若采樣點(diǎn)位于人像區(qū)域外,對(duì)顏色進(jìn)行灰度化。

另外需要注意 OpenGL 訪問(wèn)的圖像內(nèi)存默認(rèn)是 4 字節(jié)對(duì)齊,這樣灰度 Mask 圖的寬度不是 4 的整數(shù)倍的話,會(huì)有花屏現(xiàn)象,這里需要取消對(duì)齊設(shè)置:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_GrayTexId); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_GrayImage.width, m_GrayImage.height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_GrayImage.ppPlane[0]); glBindTexture(GL_TEXTURE_2D, GL_NONE);

完整實(shí)現(xiàn)代碼見(jiàn)項(xiàng)目:?https://github.com/githubhaohao

總結(jié)

以上是生活随笔為你收集整理的人像抠图 + OpenGL ES的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。