日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

编程去除背景绿幕抠图,基于.NET+OpenCVSharp

發(fā)布時(shí)間:2023/12/4 asp.net 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编程去除背景绿幕抠图,基于.NET+OpenCVSharp 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要:本文介紹了一種使用OpenCVSharp對(duì)攝像頭中的綠幕視頻進(jìn)行實(shí)時(shí)“摳人像、替換背景”的方式,對(duì)于項(xiàng)目中的算法進(jìn)行了分析。本文中給出了簡(jiǎn)化OpenCVSharp中Mat、MatExpr等托管資源釋放的方法。本文還介紹了“高效攝像頭播放控件”以及和OpenCVSharp的性能優(yōu)化技術(shù),包括高效讀寫Mat數(shù)據(jù)、如何避免效率低的代碼等。

?

一、為什么自己開發(fā)實(shí)時(shí)摳圖軟件

由于工作的需要,我需要一個(gè)能夠?qū)τ跀z像頭中的人像進(jìn)行實(shí)時(shí)地“扣除背景、替換背景,并且把替換背景后的圖片顯示到窗口中”的功能。很多會(huì)議直播軟件都有類似的功能,比如Zoom、微軟Teams等都有人像摳圖功能,但是他們的這些功能都只局限于在它們的軟件內(nèi)使用。我又試用了幾個(gè)軟件,包括XSplit Vcam、抖音直播伴侶、OBS,他們的功能都做的很優(yōu)秀,包括很多都還有不需要綠幕的智能摳圖的功能,非常強(qiáng)大,但是他們都無法滿足我的特殊要求。所以我需要自己開發(fā)這樣一款軟件。

典型的人像摳圖需要在被摳圖的物體之后放上綠幕,然后再通過程序把綠幕扣除掉,這樣人像就被保留下來了,再把摳出來的人像繪制到新的背景圖上即可。很多影視制作都是用類似這樣的原理制作出來的。如圖 1所示?[1]。

圖 1

只要環(huán)境光線調(diào)整好了,通過綠幕進(jìn)行摳圖是非常準(zhǔn)確的,不過這種方式的缺點(diǎn)就是對(duì)于場(chǎng)地的布置要求非常高。所以現(xiàn)在流行“無綠幕摳圖”的功能,也就是用人工智能的方法智能識(shí)別前景人像和背景,然后智能的把前景人像識(shí)別出來。XSplit Vcam有這個(gè)功能,而且可以把摳圖的結(jié)果再模擬成一個(gè)虛擬攝像頭進(jìn)行輸出,屬于民用領(lǐng)域中比較強(qiáng)悍的一款軟件,但是如果背景比較復(fù)雜的話,XSplit Vcam移除背景的效果仍然不理想。我個(gè)人在計(jì)算機(jī)視覺方面,特別是結(jié)合人工智能進(jìn)行圖像的智能處理方面,研究很淺,我不認(rèn)為在時(shí)間有限的情況下,能寫出來一個(gè)比Vcam還要強(qiáng)大的軟件,因此我決定仍然用傳統(tǒng)的綠幕形式來實(shí)現(xiàn)我想要的功能,畢竟只要花幾十塊錢買一塊綠幕即可。

在開始講解實(shí)現(xiàn)代碼之前,先展示一下軟件的運(yùn)行效果。圖 2是相機(jī)采集的原始圖像,可以看到背后是一張綠幕,而圖 3則是軟件運(yùn)行后的效果,而且是實(shí)時(shí)摳圖的,目前可以做到大約20FPS(一秒鐘約20幀)。

圖 2沒有摳綠幕

圖 3摳人像、替換背景

?

二、軟件架構(gòu)

軟件使用了OpenCV,它是一個(gè)非常成熟、功能豐富的計(jì)算機(jī)視覺庫。OpenCV支持C/C++、Python、.NET、Java等主流的編程語言。在互聯(lián)網(wǎng)上,使用Python進(jìn)行OpenCV開發(fā)的資料最多。由于個(gè)人不是很喜歡Python的語法,所以這個(gè)軟件我使用C#語言在.NET 5平臺(tái)上進(jìn)行開發(fā)。由于OpenCV在各個(gè)編程語言上用法大同小異,因此這里用C#實(shí)現(xiàn)的代碼改用其他編程語言也非常容易。

.NET平臺(tái)下,有兩個(gè)OpenCV的綁定庫:OpenCVSharp和Emgu CV。由于OpenCVSharp沒有商業(yè)使用限制,因此我這里使用OpenCVSharp。不過,即使您使用的是Emgu CV,這篇文章里的代碼也是簡(jiǎn)單修改后就可以應(yīng)用到Emgu CV中。

?

三、如何獲得源代碼

由于摳綠幕替換背景的功能只是我的軟件的一個(gè)模塊,整個(gè)軟件暫時(shí)不方便開源,所以我把摳綠幕替換背景這部分核心代碼功能剝離到一個(gè)單獨(dú)的開源項(xiàng)目中。

項(xiàng)目開源地址:https://github.com/yangzhongke/Zack.OpenCVSharp.Ext

?代碼中的“GreenScreenRemovalDemo.cs”就是最核心的代碼,也可以在項(xiàng)目頁面底部的【GreenScreenRemovalDemo】中下載各個(gè)操作系統(tǒng)下的可執(zhí)行文件,其中的GreenScreenRemovalDemo就是主程序。

以Windows為例,運(yùn)行GreenScreenRemovalDemo.exe,就會(huì)出現(xiàn)如圖 4所示的控制臺(tái)

圖 4選擇用演示視頻還是攝像頭

?

如果輸入v,就會(huì)自動(dòng)播放一個(gè)內(nèi)置的monster.mp4綠幕視頻文件?[2],供沒有綠幕環(huán)境的朋友進(jìn)行體驗(yàn),程序會(huì)從視頻文件中將綠幕剔除掉替換為自定義背景文件bg.png。如果在圖 4這一步輸入數(shù)字,則會(huì)從指定編號(hào)的網(wǎng)絡(luò)攝像頭中讀取畫面進(jìn)行摳圖,如果您的計(jì)算機(jī)中只有一個(gè)攝像頭,那么輸入0即可。體驗(yàn)完畢,在圖形窗口內(nèi)按任意鍵就會(huì)退出程序。

?

如下的圖 5、圖 6和圖 7分辨就是綠幕視頻、背景圖以及合成圖。

圖 5綠幕視頻monster.mp4

?

圖 6背景圖bg.png(新西蘭的伊甸山)

?

圖 7替換背景后的合成圖

?

四、核心原理

圖 8原始幀圖片

?

圖 8是從攝像頭獲取的一幀原始圖片。首先,調(diào)用我編寫的RenderGreenScreenMask(src, matMask)方法,把原始幀src轉(zhuǎn)換為一張黑白圖matMask做為遮罩。matMast中,綠色部分渲染為黑色,其他部分渲染為白色,如圖 9。

RenderGreenScreenMask方法的主要代碼如下?[3]:

private unsafe void RenderGreenScreenMask(Mat src,Mat matMask)

{

?????? int rows= src.Rows;

?????? int cols= src.Cols;

?????? for (intx = 0; x < rows; x++)

?????? {

????????????? Vec3b*srcRow = (Vec3b*)src.Ptr(x);

????????????? byte*maskRow = (byte*)matMask.Ptr(x);

????????????? for(int y = 0; y < cols; y++)

????????????? {

???????????????????? varpData = srcRow + y;

???????????????????? byteblue = pData->Item0;

???????????????????? bytegreen = pData->Item1;

???????????????????? bytered = pData->Item2;

???????????????????? bytemax = Math.Max(red, Math.Max(blue, green));

???????????????????? //ifthis pixel is some green, render the pixel with the same position on matMask asblack

???????????????????? if(green == max && green > 30)

???????????????????? {

??????????????????????????? *(maskRow+ y) = 0;

???????????????????? }

???????????????????? else

???????????????????? {

??????????????????????????? *(maskRow+ y) = 255;//render as white

???????????????????? }

????????????? }

?????? }

}

為了加速圖片的像素點(diǎn)訪問,這里使用指針來操作。C#中可以使用指針操作內(nèi)存,這樣可以大大加速程序的運(yùn)行效率。因?yàn)榄h(huán)境光照的影響,背景綠幕中的各個(gè)點(diǎn)顏色并不完全相同,所以這里使用像素點(diǎn)的green == max (blue,green,red)&& green > 30是否為true來判斷一個(gè)點(diǎn)是否是綠色,30是一個(gè)閾值,可以根據(jù)情況來調(diào)節(jié)識(shí)別效果,這個(gè)閾值選的越大,被認(rèn)為是綠色的范圍越窄。

?

圖 9去掉綠色

?

接下來,調(diào)用OpenCV的FindContoursAsArray()方法找到 圖 9中的若干個(gè)輪廓信息。為了去掉一些綠幕中的褶皺或者光線問題造成的小面積干擾,對(duì)于找到的輪廓信息,需要?jiǎng)h除掉面積較小的輪廓,只保留面積較大的輪廓。使用C#中的LINQ操作可以輕松的完成這個(gè)篩選,代碼如下:

var contoursExternalForeground =Cv2.FindContoursAsArray(matMask, RetrievalModes.External, ContourApproximationModes.ApproxNone)

?????? .Select(c=> new { contour = c, Area = (int)Cv2.ContourArea(c) })

?????? .Where(c=> c.Area >= minBlockArea)

?????? .OrderByDescending(c=> c.Area).Take(5).Select(c => c.contour);

?

這里的minBlockArea代表設(shè)定的一個(gè)“最小允許輪廓區(qū)域的面積”。

接下來新建一個(gè)空的黑色Mat,名字為matMaskForeground,然后把上面得到的大輪廓區(qū)域繪制到這個(gè)matMaskForeground中,并且內(nèi)部填充為白色,代碼如下:

?

matMaskForeground.DrawContours(contoursExternalForeground,-1, new Scalar(255),

??????????????????????????? thickness:-1);

?

matMaskForeground對(duì)應(yīng)的圖片內(nèi)容如圖 10。這樣matMaskForeground中就只包含若干大面積輪廓了,其他小面積的干擾都被排除了。

?

圖 10找到最大幾個(gè)閉合區(qū)域,然后填充為白色

?

接下來,要把圖 9中的手臂、手、肩膀和脖子形成的那些大的鏤空區(qū)域摳出來。因此把圖 9和圖 10做“異或”操作,得到圖 11這樣的鏤空區(qū)域。

?

圖 11前兩張圖片做異或操作,得到身體內(nèi)部的鏤空區(qū)域

?

因?yàn)檠坨R中反射的屏幕中的綠光、或者衣服上的小的綠色可能會(huì)被識(shí)別為小的鏤空區(qū)域,,可以看到圖 11的右下角就有一些小白色區(qū)域,因此再次使用FindContoursAsArray、DrawContours把 圖 11中的小面積的區(qū)域排除掉。然后再把排除掉小面積輪廓的圖 11和圖 10做合并操作,就得到圖 12,就是一個(gè)白色部分為身體區(qū)域,而黑色部分為綠幕背景的的圖片。

圖12把小鏤空區(qū)域去掉,并和身體遮罩做合并

?

接下來使用圖 12做為遮罩對(duì)原始幀圖像圖 8進(jìn)行背景透明處理,得到圖 13, 這樣的圖片就是背景透明的圖片了。主要代碼如下:

public static void AddAlphaChannel(Mat src, Mat dst,Mat alpha)

{

?????? using(ResourceTracker t = new ResourceTracker())

?????? {

????????????? //splitis used for splitting the channels separately

????????????? varbgr = t.T(Cv2.Split(src));

????????????? varbgra = new[] { bgr[0], bgr[1], bgr[2], alpha };

????????????? Cv2.Merge(bgra,dst);

?????? }

}

?

其中src是原始幀圖像,dst是合并結(jié)果,而alpha則是圖 12這個(gè)透明遮罩。

最后把背景透明的圖 13繪制到我們自定義的背景圖上,就得到替換為背景圖的圖 14了。核心代碼如下:

publicunsafe static void DrawOverlay(Mat bg, Mat overlay)

{

?????? int colsOverlay = overlay.Cols;

?????? int rowsOverlay = overlay.Rows;

?

?????? for (int i = 0; i < rowsOverlay; i++)

?????? {

????????????? Vec3b* pBg = (Vec3b*)bg.Ptr(i);

????????????? Vec4b* pOverlay =(Vec4b*)overlay.Ptr(i);

????????????? for (int j = 0; j <colsOverlay; j++)

????????????? {

???????????????????? Vec3b* pointBg = pBg + j;

?????? ????????????? Vec4b*pointOverlay = pOverlay + j;

???????????????????? if (pointOverlay->Item3!= 0)

???????????????????? {

??????????????????????????? pointBg->Item0 =pointOverlay->Item0;

??????????????????????????? pointBg->Item1 =pointOverlay->Item1;

??????????????????????????? pointBg->Item2 =pointOverlay->Item2;

???????????????????? }

????????????? }

?????? }

}

?????? 其中參數(shù)bg就是原始幀圖像圖 8,而overlay則是背景透明的圖 13,經(jīng)過DrawOverlay方法繪制后,bg的內(nèi)容就變成了圖 14,然后就可以輸出到界面上了。

圖 13背景透明圖

?

圖 14最終結(jié)果

上面講述的核心代碼就位于GreenScreenRemovalDemo項(xiàng)目的ReplaceGreenScreenFilter類中。下面列出ReplaceGreenScreenFilter最主干的代碼:

class ReplaceGreenScreenFilter

{

?????? private byte _greenScale = 30;

?????? private double _minBlockPercent = 0.01;

?????? private Mat _backgroundImage;

?????? public void SetBackgroundImage(Mat backgroundImage)

?????? {

????????????? this._backgroundImage = backgroundImage;

?????? }

?

?????? private unsafe void RenderGreenScreenMask(Mat src, MatmatMask)

?????? {

????????????? int rows = src.Rows;

????????????? int cols = src.Cols;

????????????? for (int x = 0; x < rows; x++)

????????????? {

???????????????????? Vec3b* srcRow = (Vec3b*)src.Ptr(x);

???????????????????? byte* maskRow = (byte*)matMask.Ptr(x);

???????????????????? for (int y = 0; y < cols; y++)

???????????????????? {

??????????????????????????? var pData = srcRow + y;

??????????????????????????? byte blue = pData->Item0;

??????????????????????????? byte green = pData->Item1;

??????????????????????????? byte red = pData->Item2;

??????????????????????????? byte max = Math.Max(red, Math.Max(blue,green));

??????????????????????????? if (green == max && green >this._greenScale)

??????????????????????????? {

?????????????????????????????????? *(maskRow + y) = 0;

??????????????????????????? }

??????????????????????????? else

??????????????????????????? {

?????????????????????????????????? *(maskRow + y) = 255;//render aswhite

??????????????????????????? }

???????????????????? }

????????????? }

?????? }

?

?????? public void Apply(Mat src)

?????? {

????????????? using (ResourceTracker t = new ResourceTracker())

????????????? {

???????????????????? Size srcSize = src.Size();

???????????????????? Mat matMask = t.NewMat(srcSize, MatType.CV_8UC1,new Scalar(0));

???????????????????? RenderGreenScreenMask(src, matMask);

???????????????????? //the area is by integer instead of double, sothat it can improve the performance of comparision of areas

???????????????????? int minBlockArea = (int)(srcSize.Width *srcSize.Height * this.MinBlockPercent);

???????????????????? var contoursExternalForeground =Cv2.FindContoursAsArray(matMask, RetrievalModes.External,ContourApproximationModes.ApproxNone)

??????????????????????????? .Select(c => new { contour = c, Area =(int)Cv2.ContourArea(c) })

??????????????????????????? .Where(c => c.Area >= minBlockArea)

???????????????????? ?????? .OrderByDescending(c=> c.Area).Take(5).Select(c => c.contour);

?

???????????????????? //a new Mat used for rendering the selectedContours

???????????????????? var matMaskForeground = t.NewMat(srcSize,MatType.CV_8UC1, new Scalar(0));

???????????????????? //thickness: -1 means filling the inner space

???????????????????? matMaskForeground.DrawContours(contoursExternalForeground,-1, new Scalar(255),

??????????????????????????? thickness: -1);

???????????????????? //matInternalHollow is the inner Hollow parts ofbody part.

???????????????????? var matInternalHollow = t.NewMat(srcSize,MatType.CV_8UC1, new Scalar(0));

???????????????????? Cv2.BitwiseXor(matMaskForeground, matMask,matInternalHollow);

?

???????????????????? int minHollowArea = (int)(minBlockArea *0.01);//the lower size limitation of InternalHollow is less than minBlockArea,because InternalHollows are smaller

???????????????????? //find the Contours of Internal Hollow?

???????????????????? var contoursInternalHollow =Cv2.FindContoursAsArray(matInternalHollow, RetrievalModes.External,ContourApproximationModes.ApproxNone)

??????????????????????????? .Select(c => new { contour = c, Area =Cv2.ContourArea(c) })

??????????????????????????? .Where(c => c.Area >=minHollowArea)

??????????????????????????? .OrderByDescending(c =>c.Area).Take(10).Select(c => c.contour);

???????????????????? //draw hollows

???????????????????? foreach (var c in contoursInternalHollow)

???????????????????? {

??????????????????????????? matMaskForeground.FillConvexPoly(c, newScalar(0));

???????????????????? }

?

???????????????????? var element = t.T(Cv2.GetStructuringElement(MorphShapes.Cross,new Size(3, 3)));

???????????????????? //smooth the edge of matMaskForeground

???????????????????? Cv2.MorphologyEx(matMaskForeground,matMaskForeground, MorphTypes.Close,

??????????????????????????? element, iterations: 6);

?

???????????????????? var foreground = t.NewMat(src.Size(),MatType.CV_8UC4, new Scalar(0));

???????????????????? ZackCVHelper.AddAlphaChannel(src, foreground,matMaskForeground);

???????????????????? //resize the _backgroundImage to the same sizeof src

???????????????????? Cv2.Resize(_backgroundImage, src, src.Size());

???????????????????? //draw foreground(people) on the backgroundimage

???????????????????? ZackCVHelper.DrawOverlay(src, foreground);

????????????? }

?????? }

}

?

五、重要技術(shù)

受限于篇幅,這里不講解OpenCV的基礎(chǔ)知識(shí),這里只講解項(xiàng)目中的一些重點(diǎn)技術(shù)以及OpenCVSharp使用過程中的一些需要注意的事項(xiàng)。由于我也是剛接觸OpenCVSharp幾天時(shí)間,所以如果存在有問題的地方,請(qǐng)各位指正。

  • 簡(jiǎn)化OpenCVSharp對(duì)象的釋放

在OpenCVSharp中,Mat 和 MatExpr等類的對(duì)象擁有非托管資源,因此需要調(diào)用Dispose()方法手動(dòng)釋放。更糟糕的是,+、-、*等運(yùn)算符每次都會(huì)創(chuàng)建一個(gè)新的對(duì)象,這些對(duì)象都需要釋放,否則就會(huì)有內(nèi)存泄露。但是這些對(duì)象釋放的代碼看起來非常啰嗦。

假設(shè)有如下Python中訪問opencv的代碼:

mat1 =np.empty([100,100])

mat3 = 255-mat1*0.8

mats1 = cv2.split(mat3)

mat4=cv2.merge(mats1[0],mats1[2],mats1[2])

?

而在C#中同樣的代碼則像下面這樣啰嗦:

using (Mat mat1 = newMat(new Size(100, 100), MatType.CV_8UC3))

using (Mat mat2 = mat1* 0.8)

using (Mat mat3 =255-mat2)

{

?????? Mat[] mats1 = mat3.Split();

?????? using (Mat mat4 = new Mat())

?????? {

????????????? Cv2.Merge(new Mat[] { mats1[0], mats1[1], mats1[2] },mat4);

?????? }

?????? foreach(var m in mats1)

?????? {

????????????? m.Dispose();

?????? }

}

?

因此我創(chuàng)建了一個(gè)ResourceTracker類用來管理OpenCV的資源。ResourceTracker類的T()方法用于把OpenCV對(duì)象加入跟蹤記錄。T()方法的實(shí)現(xiàn)很簡(jiǎn)單,就是把被包裹的對(duì)象加入跟蹤記錄,然后再把對(duì)象返回。T()方法的核心代碼如下:

public Mat T(Mat obj)

{

?????? if (obj == null)

?????? {

????????????? return obj;

?????? }

?????? trackedObjects.Add(obj);

?????? return obj;

}

?

public Mat[] T(Mat[]objs)

{

?????? foreach (var obj in objs)

?????? {

????????????? T(obj);

?????? }

?????? return objs;

}

?

ResourceTracker實(shí)現(xiàn)了IDisposable接口,當(dāng)ResourceTracker類的 Dispose()方法被調(diào)用后,ResourceTracker跟蹤的所有資源都會(huì)被釋放。T()方法可以跟蹤一個(gè)對(duì)象或者一個(gè)對(duì)象數(shù)組。而NewMat() 這個(gè)方法是T(new Mat(...)) 的一個(gè)簡(jiǎn)化。因?yàn)?#43;、-、*等運(yùn)算符每次都會(huì)創(chuàng)建一個(gè)新的對(duì)象,所以每步運(yùn)算得到的對(duì)象都需要釋放,他們可以使用T()進(jìn)行包裹。例如:t.T(255 - t.T(picMat * 0.8))

?

因此,上面的啰嗦的C#代碼可以簡(jiǎn)化成如下的樣子:

using (ResourceTrackert = new ResourceTracker())

{

?????? Mat mat1 = t.NewMat(new Size(100, 100), MatType.CV_8UC3,newScalar(0));

?????? Mat mat3 = t.T(255-t.T(mat1*0.8));

?????? Mat[] mats1 = t.T(mat3.Split());

?????? Mat mat4 = t.NewMat();

?????? Cv2.Merge(new Mat[] { mats1[0], mats1[1], mats1[2] }, mat4);

}

?

在離開ResourceTracker的using代碼塊之后,所有ResourceTracker對(duì)象管理的Mat、MatExpr等對(duì)象的資源都會(huì)被釋放。

這個(gè)ResourceTracker類我放到了Zack.OpenCVSharp.Ext這個(gè)NuGet包中,可以通過如下NuGet命令安裝:

Install-PackageZack.OpenCVSharp.Ext

項(xiàng)目的源代碼地址:https://github.com/yangzhongke/Zack.OpenCVSharp.Ext

?

  • 訪問Mat中數(shù)據(jù)的高效方式

OpenCVSharp中提供了很多訪問Mat中數(shù)據(jù)的方法,經(jīng)過測(cè)試,我發(fā)現(xiàn),At()方式最慢,GetGenericIndexer也很慢,因?yàn)樗麄兌际峭耆ㄟ^托管代碼的方式進(jìn)行的,性能必然打折扣。而直接訪問內(nèi)存的GetUnsafeGenericIndexer方式快了很多,但是最快的方式還是使用mat.Ptr(x)并使用指針這種方式速度最快,因?yàn)檫@種方式直接通過指針讀寫Mat的內(nèi)存。使用這種方式的方法需要標(biāo)記為unsafe,并且項(xiàng)目要啟用“允許不安全代碼”。由于這種方式是直接讀寫內(nèi)存,所以一定要注意你的代碼,以免造成不正確的內(nèi)存訪問或者AccessViolation,對(duì)指針操作不熟悉的讀者,可以閱讀我出版的圖書《零基礎(chǔ)趣學(xué)C語言》(作者:楊中科,人民郵電出版社),因?yàn)镃#中指針操作和C語言幾乎一模一樣。

這種指針方式的參考代碼請(qǐng)參考上面的RenderGreenScreenMask()、DrawOverlay()兩個(gè)方法,Zack.OpenCVSharp.Ext這個(gè)開源項(xiàng)目中np類的where方法還演示了C#泛型、指針操作以及l(fā)ambda的結(jié)合使用。

OpenCVSharp中,Vec4b、Vec3b、byte等代表不同字節(jié)長(zhǎng)度的內(nèi)存單元,一定要根據(jù)使用的Mat對(duì)象的通道數(shù)等來選擇使用Vec4b、Vec3b、byte等,使用不當(dāng)不僅會(huì)影響性能,而且還可能會(huì)造成數(shù)據(jù)混亂,數(shù)據(jù)混亂的最直接的表現(xiàn)就是圖片顯示錯(cuò)亂、花屏。

?

  • CameraPlayer

我的軟件需要從攝像頭采集圖像,并且顯示到界面上,而且在顯示到界面上之前,還要對(duì)圖像進(jìn)行“摳人像、替換背景”的操作。在最開始的時(shí)候,我使用AForge.NET完成攝像頭的圖像采集和顯示,不過性能非常低。因?yàn)樾枰劝袮Forge.NET采集到的Bitmap轉(zhuǎn)換為OpenCVSharp的Mat,摳圖處理完成后再把Mat轉(zhuǎn)換回Bitmap,顯示到界面上。所以我就直接使用OpenCVSharp的VideoCapture類來完成攝像頭圖像的采集,由于它采集到的幀圖像直接用Mat表示,省去了轉(zhuǎn)換環(huán)節(jié),速度得到了很大的提升。

我把從攝像頭取數(shù)據(jù)以及顯示到界面上的操作封裝了一個(gè)CameraPlayer控件中,同時(shí)提供了.NET Core和.NET Framework版的WinForm控件,可以直接拿來用,而且提供了SetFrameFilter(Action<Mat> frameFilterFunc)方法來允許設(shè)定一個(gè)委托,從而在把幀圖像的Mat繪制到界面前使用OpenCVSharp進(jìn)行處理。

CameraPlayer控件中圖像采集、圖像的處理和圖像的顯示是由不同線程負(fù)責(zé),各自并行處理,所以性能非常高。

我把這個(gè)CameraPlayer控件開源了,具體用法請(qǐng)參考項(xiàng)目的文檔。

項(xiàng)目地址:https://github.com/yangzhongke/Zack.CameraLib

在開發(fā)CameraPlayer的時(shí)候,我發(fā)現(xiàn)如果不設(shè)定VideoCapture的FourCC屬性(也就是視頻的編碼),取一幀需要100ms,而把FourCC屬性設(shè)置為"MJPG"之后,取一幀只要50ms。我不知道這是否和攝像頭相關(guān)。因此,如果你因?yàn)镕ourCC屬性設(shè)置為"MJPG"之后,讀取圖像的速度反而變慢了,可以嘗試修改一個(gè)不同的FourCC值。

?

  • 謹(jǐn)慎使用可能造成性能問題的玩意兒

在實(shí)現(xiàn)RenderGreenScreenMask()這個(gè)方法的時(shí)候,其中有一步是用來“取blue、green、red三個(gè)值中的最大值”,最開始的時(shí)候,我使用.NET中的LINQ擴(kuò)展方法實(shí)現(xiàn)newbyte[]{blue,green,red}.Max();? 但是發(fā)現(xiàn)改成byte max1 = blue > green ? blue : green; byte max =max1>red?max1:red;這種簡(jiǎn)單的方法計(jì)算之后,每一幀的處理時(shí)間減少了50%。

由于LINQ操作涉及到“創(chuàng)建集合對(duì)象、把數(shù)據(jù)放入集合對(duì)象、獲取數(shù)據(jù)”這樣的過程,速度會(huì)比常規(guī)算法慢一些,在普通的數(shù)據(jù)處理中這點(diǎn)性能差距可以忽略不計(jì),特別是在使用LINQ對(duì)數(shù)據(jù)庫等進(jìn)行操作的時(shí)候,相對(duì)于耗時(shí)的IO操作來講,這點(diǎn)性能差別更是可以忽略不計(jì)。但是由于這里是在雙層循環(huán)中使用,而且執(zhí)行的操作的速度非常快的內(nèi)存讀寫,所以就把性能差距放大了。

因此,在使用OpenCVSharp對(duì)圖像進(jìn)行處理的時(shí)候,要謹(jǐn)慎使用這些可能會(huì)造成性能問題的高級(jí)玩意兒。

?

  • Mat內(nèi)存的初始化

在創(chuàng)建空的Mat對(duì)象的時(shí)候,最好初始化Mat對(duì)象的內(nèi)存數(shù)據(jù),就像在C語言中對(duì)于malloc拿到的內(nèi)存空間最好用memset重置一樣,以免造成內(nèi)存中舊的殘留數(shù)據(jù)干擾我們的操作。比如new Mat(srcSize,MatType.CV_8UC1)這樣創(chuàng)建的空白Mat中的內(nèi)存可能是復(fù)用之前被釋放的其他對(duì)象的內(nèi)存,數(shù)據(jù)是臟的,除非你的下一步操作是把Mat的每一位都重新填充,否則請(qǐng)使用Mat 構(gòu)造函數(shù)的Scalar類型的參數(shù)來初始化內(nèi)存,參考代碼如下:new Mat(srcSize,MatType.CV_8UC1,new Scalar(0))

?

六、未來工作

在以后有時(shí)間的時(shí)候,我可能會(huì)做如下這些工作。

  • 提升從攝像頭取一幀的速度。因?yàn)槲夷壳坝玫臄z像頭“羅技C920”標(biāo)稱的是FPS=30,所以理論上來講,取一幀的速度是33ms,而目前我取一幀的速度是50ms,我要研究一下是否能進(jìn)一步提升取一幀圖像的速度。

  • 除了我長(zhǎng)得不好看這個(gè)不可控因素之外,摳出來的圖也是原圖,亮度以及邊緣都還有待優(yōu)化,所以考慮增加美顏、瘦臉、亮膚、邊緣優(yōu)化等功能,目前的人像摳圖算法處理一幀需要大約20ms,而從攝像頭取一幀的速度是50ms,因此還有30ms的額外時(shí)間可以用來做這些美化工作。

  • 用人工智能算法實(shí)現(xiàn)“無綠幕摳人像、去除背景”。完全自己實(shí)現(xiàn)這個(gè)無疑是比較難的。我發(fā)現(xiàn)一個(gè)很強(qiáng)大的開源項(xiàng)目MODNet,它是一個(gè)python+torch實(shí)現(xiàn)的使用神經(jīng)網(wǎng)絡(luò)做智能人像識(shí)別的庫,包含已經(jīng)訓(xùn)練完成模型。而torch也有對(duì)應(yīng)的.NET移植版,所以理論上這是可以做到的。

?

七、結(jié)論

使用OpenCVSharp的時(shí)候,只要注意使用本文中介紹的高效訪問內(nèi)存的方式,并且合理調(diào)用相關(guān)的函數(shù),可以非常高性能的進(jìn)行圖像的處理,因此我開發(fā)的軟件可以做到每一幀圖像處理僅需大約20ms。借助于我開發(fā)的Zack.OpenCVSharp.Ext這個(gè)包中的ResourceTracker類,可以讓OpenCVSharp中的資源釋放變得非常簡(jiǎn)單,在幾乎不用修改表達(dá)式、代碼的基礎(chǔ)上,讓資源能夠及時(shí)得到釋放,避免內(nèi)存泄漏。

點(diǎn)擊【閱讀原文】查看項(xiàng)目的Github頁面。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的编程去除背景绿幕抠图,基于.NET+OpenCVSharp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

成人av一区二区在线观看 | www.色就是色 | 超碰夜夜 | 国产一区二区三区 在线 | 天天艹天天 | 亚洲精品国精品久久99热一 | 国产精品大尺度 | 久久久久国产一区二区三区四区 | 国产精品女同一区二区三区久久夜 | 欧美一级视频一区 | 国产99久久精品一区二区永久免费 | 色偷偷88888欧美精品久久 | 一区二区三区免费在线观看视频 | 91久久偷偷做嫩草影院 | 国产精品久久久久久爽爽爽 | 四虎欧美 | 男女免费视频观看 | 久久毛片网站 | 成人av电影免费在线观看 | 日韩一区二区三区免费视频 | 免费网址在线播放 | 好看的国产精品视频 | 黄色免费电影网站 | 日本中文字幕免费观看 | 国产一区欧美在线 | 国产午夜精品久久 | 久久在线免费观看视频 | 久久精品国产99国产 | 91视频麻豆| 天天干夜夜夜操天 | 天堂视频中文在线 | 一级欧美黄 | 日本资源中文字幕在线 | 在线黄色av | 中文成人字幕 | av天天澡天天爽天天av | 精品在线你懂的 | 欧美精品中文 | 日日夜夜骑 | 久久久久久久久久久久电影 | 日日夜夜精品免费 | 成人黄色小说在线观看 | 女人18片毛片90分钟 | 亚洲高清国产视频 | 九九九热精品 | 97超碰人人网 | 亚洲日本va中文字幕 | 久久综合色综合88 | 开心激情五月网 | 涩涩网站在线 | 婷婷五综合 | 日韩中文字幕免费看 | 国产网红在线 | 欧美性生交大片免网 | 婷婷在线免费观看 | 免费福利视频网站 | 色综合色综合久久综合频道88 | 国产97碰免费视频 | 草久久久久久 | 91香蕉视频 | 丁香六月婷 | 一二区电影 | 国产 日韩 欧美 自拍 | 色伊人网 | 精品国产一区二区三区噜噜噜 | 九九热re| 91黄在线看| 精品久久久久久久久久久院品网 | 国产专区在线播放 | 久久99精品久久久久久秒播蜜臀 | 国产视频 亚洲视频 | 亚洲国产精品va在线看黑人动漫 | 欧美精品久久久久久久免费 | 欧美精品中文 | 91香蕉视频720p | 国产男女爽爽爽免费视频 | 精品自拍sae8—视频 | 在线v片免费观看视频 | 色 免费观看 | 亚洲精品久久在线 | 狠狠色丁香婷婷综合基地 | 午夜视频免费在线观看 | 国产小视频在线 | 天天操天天能 | 欧美人牲 | 五月婷婷黄色网 | 1000部国产精品成人观看 | 久草在| 久久久免费播放 | 国产精品入口传媒 | 伊人小视频 | 久久夜视频| 亚洲日本成人网 | 国产成人在线观看免费 | 天天操夜夜逼 | 国产精品对白一区二区三区 | 91豆麻精品91久久久久久 | 超碰人人在线 | 欧美美女激情18p | 日b视频国产| 久久99久久99精品中文字幕 | 91视频在线免费看 | 国模精品在线 | 婷婷色网址 | 在线只有精品 | 久久99精品久久久久久秒播蜜臀 | 国产高清视频免费观看 | 久久一区二区免费视频 | 91精品在线视频观看 | 玖玖玖在线观看 | 国产精品白浆视频 | 天堂激情网 | 久久免费视频6 | 菠萝菠萝在线精品视频 | 国产成人精品一区二区在线观看 | 欧美精品一级视频 | 亚洲jizzjizz日本少妇 | 中文字幕久久精品一区 | 成人午夜剧场在线观看 | 亚洲最新av在线网站 | 亚洲作爱 | 日韩免| 精品国产视频在线观看 | 久久资源总站 | 福利电影一区二区 | 91精品国产一区二区三区 | 久久久综合| 日韩av在线不卡 | 99久久国产免费看 | 亚洲精品视频在线免费 | 亚洲天堂网在线视频观看 | 欧美性高跟鞋xxxxhd | 久99久在线视频 | 人人盈棋牌| 黄视频网站大全 | 亚洲情婷婷| 亚洲天堂首页 | 婷婷丁香激情 | 亚洲成av人片一区二区梦乃 | 国产在线a视频 | 久久伦理 | 日韩在线观看一区二区三区 | 91精品国产亚洲 | 91精品成人| 色天天| 懂色av懂色av粉嫩av分享吧 | 亚洲人精品午夜 | 麻豆国产精品va在线观看不卡 | 日韩www在线| 色中色资源站 | 九九免费在线看完整版 | 久草视频在线看 | 不卡精品视频 | 四虎在线免费观看 | 国产中文字幕视频在线观看 | 亚洲另类人人澡 | 国产黄色片免费在线观看 | 丁香五月网久久综合 | 久久免费视频4 | 91av免费在线观看 | 色综合久久五月天 | 成人久久国产 | 美女又爽又黄 | 午夜精品视频一区二区三区在线看 | 五月婷婷六月综合 | 91精品视频在线免费观看 | 成人在线免费观看网站 | 国产资源免费 | 国产精品一区二区麻豆 | 美女视频黄色免费 | 日日日日干 | 欧美午夜精品久久久久久浪潮 | 香蕉视频国产在线观看 | 国产精品18久久久 | 国产成人一区二区三区 | 日韩激情视频在线 | 色婷婷狠| 日韩综合色 | 亚洲国产精品影院 | 久久精品成人 | 精品国产一区二区三区在线 | 国产午夜精品一区二区三区 | 18pao国产成视频永久免费 | 国产98色在线 | 日韩 | a电影免费看 | 在线激情小视频 | 91麻豆精品国产91久久久更新时间 | 亚洲国产成人精品在线 | 亚洲天堂在线观看完整版 | 一级a性色生活片久久毛片波多野 | 日韩精品一区二区三区在线播放 | 欧美精品久久久久久久免费 | 91免费在线看片 | av中文国产 | 九九九九免费视频 | 久久看片网站 | 午夜久久久久久久久久影院 | 国产麻豆剧传媒免费观看 | 丁香激情五月婷婷 | av天天在线观看 | 激情五月婷婷网 | 成年人黄色免费看 | 日韩精品电影在线播放 | 国产一级做a爱片久久毛片a | 少妇搡bbbb搡bbb搡aa | 麻豆91精品| 久久精品国产免费看久久精品 | 欧美乱熟臀69xxxxxx | 久久久久伊人 | 岛国精品一区二区 | 日韩午夜电影 | 丁香花在线观看免费完整版视频 | 欧美激情第28页 | 欧美国产精品一区二区 | 看片黄网站 | 国产一级免费视频 | 午夜国产一区二区 | 亚洲在线视频免费观看 | 91大神一区二区三区 | 国产黄av| 丁香六月激情 | 免费视频 三区 | 成人久久久久久久久久 | 九九热av| 亚洲无人区小视频 | 在线观看麻豆av | 色在线观看网站 | 日韩专区中文字幕 | 免费精品| 天天综合网~永久入口 | 日日碰狠狠躁久久躁综合网 | 国产最新在线观看 | 国产小视频你懂的 | 国产小视频在线播放 | 一区二区观看 | 最新国产精品亚洲 | 在线观看mv的中文字幕网站 | 综合网天天色 | 色综合久久久久久久久五月 | 欧美久久久久 | 香蕉视频在线观看免费 | av成人免费观看 | 国产精品99久久久精品免费观看 | 色婷婷一| 免费黄色在线网址 | 色视频网站在线 | 国产精品二区在线 | 激情av五月婷婷 | 日韩视频中文字幕 | 国产高清不卡av | 在线中文字幕视频 | 免费三级黄色 | 六月丁香激情综合色啪小说 | 天天射天天操天天色 | 91大神电影 | 99久久99久久精品国产片 | 国产精品一区二区你懂的 | 在线av资源| 国产成人黄色片 | 日韩a级黄色 | 丁香综合五月 | 黄污网| 在线天堂v | 在线观看日韩免费视频 | 麻豆91网站 | 免费99精品国产自在在线 | 九九久久久久久久久激情 | 国产xxxx做受性欧美88 | 免费在线激情电影 | 久久久久99精品国产片 | 97超级碰碰碰碰久久久久 | 黄色一二级片 | 日韩精品一区二区三区在线播放 | 日韩视频免费观看高清 | av+在线播放在线播放 | 一区电影 | 国产伦理一区二区三区 | 欧美日韩一区二区在线 | 丁香花在线观看免费完整版视频 | 国产专区一 | 精品嫩模福利一区二区蜜臀 | 美女视频黄免费的久久 | 国产日韩欧美自拍 | 视频一区亚洲 | 久久久五月天 | 最近中文字幕完整视频高清1 | 丁香婷婷久久久综合精品国产 | 久久久久久久影院 | 亚洲精品九九 | 免费在线一区二区 | 在线观看第一页 | 亚洲日本中文字幕在线观看 | 日本丰满少妇免费一区 | 国产青草视频在线观看 | 亚洲专区在线视频 | 国产免费一区二区三区最新 | 欧美日韩中文国产 | 在线免费观看视频 | 日韩电影在线观看中文字幕 | 欧美一级日韩三级 | 久久综合久久综合久久 | 久久久精品国产免费观看一区二区 | 91久久久久久国产精品 | 天天操天天摸天天射 | 爱色av.com | 中国一区二区视频 | 国产无套精品久久久久久 | 久久久久久久久毛片精品 | 日本久久久影视 | 又黄又爽又刺激视频 | 欧美一二在线 | 色偷偷网站视频 | 97av视频| 九色视频网址 | 99高清视频有精品视频 | 国产69精品久久app免费版 | 国产美女被啪进深处喷白浆视频 | 色在线国产 | 久久久久久欧美二区电影网 | 亚洲精品乱码久久久久久蜜桃动漫 | 免费在线成人av | 中文字幕中文字幕在线中文字幕三区 | 日本在线观看中文字幕 | 91成人区| 999国内精品永久免费视频 | 777xxx欧美| 国产三级久久久 | 国产99久久久久久免费看 | 久久国产午夜精品理论片最新版本 | 久久精品99国产 | 91豆花在线| 999久久精品 | 精品久久久久久国产91 | 久久久久久毛片 | av国产网站 | 日韩精品中字 | 欧美激情精品久久久 | 伊人久久电影网 | 中文字幕在线观 | 亚洲欧美在线观看视频 | 日日操网 | 国产精品video爽爽爽爽 | 亚洲影院国产 | 99精品欧美一区二区 | 久草在线91 | 成人资源在线 | 五月综合激情网 | 国产精品视频内 | 久久久亚洲国产精品麻豆综合天堂 | 操操碰 | 免费三级a | 亚洲综合色视频 | 国产999精品久久久久久麻豆 | 久久久久国产视频 | 午夜免费电影院 | 亚洲黄色三级 | 在线观看一区视频 | 97精产国品一二三产区在线 | 亚洲免费资源 | 欧美精彩视频 | 亚洲 欧洲av | 亚洲精品视频偷拍 | 色天天综合网 | 国产一区二区三区视频在线 | av成人免费 | 久久久69| 超碰日韩在线 | av网址在线播放 | 久久久久区 | 欧美精品久久久久久久免费 | 婷婷免费在线视频 | 欧美最新大片在线看 | 国产糖心vlog在线观看 | 国产一区二区精品在线 | 免费日韩三级 | 又色又爽又激情的59视频 | 亚洲影音先锋 | 久久免费看视频 | 亚洲精品国内 | 91精品资源 | 国产不卡一 | 亚洲综合在线五月天 | 国产精品久久久久久久久久白浆 | 97国产情侣爱久久免费观看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 精品国产欧美一区二区三区不卡 | 国产一区在线视频播放 | 黄色av电影 | 亚洲精品视频免费在线 | 永久免费的啪啪网站免费观看浪潮 | 夜夜夜影院 | 一级黄毛片 | 91九色精品女同系列 | 久久黄色小说 | 国产精品 欧美 日韩 | 中文字幕在线观看第三页 | 毛片网免费 | 国产不卡在线 | 毛片一区二区 | 国产精品免费大片视频 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 亚洲日本成人 | 国产精品成人a免费观看 | 最新国产在线视频 | 婷婷激情五月综合 | 久久综合色影院 | 欧美视频xxx| 日韩高清观看 | 日韩三级视频 | 麻豆国产露脸在线观看 | 91精品视频免费在线观看 | 99综合视频| 麻豆视频在线免费看 | 国产小视频在线免费观看视频 | 日韩中文字幕视频在线 | 麻豆免费视频网站 | a色视频 | 久久艹国产视频 | 欧美日韩国产一二三区 | 毛片基地黄久久久久久天堂 | 国产不卡网站 | 四虎最新入口 | 亚洲精品美女在线观看播放 | 中文字幕国内精品 | 国产97在线播放 | 深爱激情五月婷婷 | 黄色大片av | 9热精品| 中文字幕影片免费在线观看 | 日韩精品在线观看视频 | 成人播放器| 成人久久| 91精品在线播放 | 中文字幕一区av | 久久公开免费视频 | 开心激情网五月天 | 99热免费在线 | 日韩在线网址 | 午夜精品久久久久久久99 | 五月婷婷婷婷婷 | 97超碰超碰久久福利超碰 | 激情网站网址 | 在线看成人 | 色福利网站 | 婷婷视频在线观看 | 欧美一级免费片 | 久久九九影院 | 国产一级免费在线观看 | 日韩免费不卡视频 | 久草视频免费播放 | 久久极品 | 国产免费亚洲高清 | 久久午夜免费视频 | www.人人草 | 国产一二区视频 | 亚洲精品97 | 国产视频一区在线播放 | 99热精品在线 | 国产精品igao视频网入口 | 国产 在线观看 | 亚洲一区二区三区四区在线视频 | 在线看国产精品 | 久久一久久| 在线观看视频你懂的 | 色播激情五月 | 在线观看精品黄av片免费 | 人人爽久久涩噜噜噜网站 | 亚洲精品黄网站 | 一区二区三区在线观看 | 精品国产亚洲日本 | 婷婷在线免费观看 | 992tv成人免费看片 | 国产情侣一区 | 97视频在线观看免费 | 国产不卡av在线 | 成人av片免费看 | 国产精品一区二区 91 | 一区二区三区免费在线观看 | 日韩中文字幕电影 | 久久免费视频一区 | 狠狠色丁香婷婷综合久小说久 | www.夜夜爽 | 91网免费看 | 国产一区在线看 | 亚洲va欧美 | 狠狠色丁香婷婷综合久久片 | 五月婷婷丁香色 | 久久久www免费电影网 | 98涩涩国产露脸精品国产网 | 97国产电影 | 国产色拍| 天天色天天操综合网 | 国产精品手机视频 | 精品视频久久久 | 免费在线观看av网站 | 精一区二区 | 天堂中文在线视频 | 欧美日性视频 | 黄色一级免费电影 | 国产在线观看污片 | 69精品| 最近中文字幕在线 | www.国产视频 | 中文字幕在线免费 | 色小说在线 | 国产成人三级在线 | 亚洲一级国产 | 国产在线成人 | 激情图片区 | 免费看黄的视频 | 国产一区二区不卡在线 | 成人作爱视频 | 人人澡超碰碰97碰碰碰软件 | 久久艹人人 | 四虎欧美 | 亚洲精品久久久久中文字幕二区 | 91精品久久久久久久久久入口 | 国产日韩欧美在线 | 五月婷婷激情综合网 | 久久情侣偷拍 | 国产在线观看你懂得 | 中文字幕丰满人伦在线 | 国产精品成人一区二区 | 四虎在线免费观看视频 | av动图| 激情中文字幕 | av在线网站免费观看 | 免费福利在线观看 | 久久久这里有精品 | 中文字幕免费高清在线观看 | 日韩av在线免费看 | 五月婷婷黄色网 | 国产精品美女久久久久久久网站 | 狠狠狠色丁香婷婷综合久久88 | 精品在线观看免费 | 成人黄色电影在线观看 | 国产在线免费 | 国产裸体视频bbbbb | 国产高清不卡一区二区三区 | 狠狠干网 | 欧美性色综合 | 免费av在线网站 | 亚洲精品91天天久久人人 | 最新av观看 | 成人福利在线观看 | 婷婷激情五月 | 99av国产精品欲麻豆 | 日韩高清精品免费观看 | 日韩精品免费在线播放 | 综合网av| 美女视频久久 | 亚洲人视频在线 | 毛片一二区 | bbbb操bbbb | 黄色小说视频网站 | 久久成人午夜视频 | 黄色三级免费看 | 日日色综合 | 色www.| 高清日韩一区二区 | 亚洲视频网站在线观看 | 视频在线观看一区 | av免费网站 | 深夜福利视频一区二区 | 亚洲精品小视频 | 久草在线视频首页 | 成人在线播放网站 | 国产区 在线 | 国产精品一区二区av | 久久久免费毛片 | 欧美 日韩 国产 中文字幕 | 一二三精品视频 | 在线观看视频在线 | 久久免费的精品国产v∧ | av片一区 | 久久精品这里热有精品 | 日韩精品一区二区三区外面 | 97**国产露脸精品国产 | 久章草在线观看 | 网站免费黄色 | 日韩在线观看视频一区二区三区 | 亚洲尺码电影av久久 | 国产精品高潮久久av | 亚洲欧美精品一区 | 最近中文字幕高清字幕免费mv | 成人av片免费观看app下载 | 美女福利视频一区二区 | 中文字幕中文中文字幕 | 国产一区二区精品在线 | 欧美日韩大片在线观看 | 欧美国产不卡 | 国产精品自拍在线 | 国产精品久久麻豆 | 久草在线免费新视频 | 亚洲丝袜一区 | 国产第页 | 日韩精品首页 | 91视频-88av | 成人精品久久久 | 精品一区二区三区在线播放 | 亚洲国产剧情av | 99精品网站 | 日韩欧美综合视频 | 久久久久久综合网天天 | 99热播精品| 超碰国产人人 | 国产日韩欧美在线观看视频 | 午夜精品久久久久久久久久 | 中文字幕在线观看免费观看 | 一区二区三区四区在线 | 久久久亚洲精华液 | 在线观看91av | 4438全国亚洲精品在线观看视频 | 国产亚洲欧美在线视频 | 高清久久久久久 | 欧美成人区 | 中文字幕日韩一区二区三区不卡 | 中文字幕在线观看三区 | 亚洲精品在线免费 | 特黄免费av | 日韩中文在线播放 | 日韩久久精品一区二区 | 91精品久久久久久综合乱菊 | 国产精品免费人成网站 | 六月婷操 | 亚洲国产三级 | www.色综合.com | 亚洲国产中文字幕在线视频综合 | 亚洲有 在线 | 婷婷久月 | 国产天天综合 | 99精品福利 | 亚洲精品国产精品国自产观看浪潮 | 亚洲精品小区久久久久久 | 激情综合色播五月 | 一区二区三区电影大全 | 天天躁日日躁狠狠 | 夜夜高潮夜夜爽国产伦精品 | 九九热免费观看 | av福利资源 | 免费在线观看av的网站 | 久久久久久久久久久久亚洲 | 成人中心免费视频 | 亚洲综合成人婷婷小说 | 又黄又爽又色无遮挡免费 | 五月综合激情网 | 国产不卡在线 | 五月婷婷六月丁香在线观看 | 国产午夜精品一区 | 精品久久久久久久久久 | bbbbb女女女女女bbbbb国产 | 久久视频在线观看免费 | 黄色软件在线观看视频 | 天天操天天射天天爽 | 亚洲国产中文字幕在线观看 | 色噜噜噜 | 成年人免费在线看 | 日本xxxxav| 成人黄色毛片视频 | 三日本三级少妇三级99 | 中文字幕91视频 | 久久人网 | www日韩欧美 | www黄色 | 精品亚洲一区二区 | 国产视频一级 | 99热在线精品观看 | av福利第一导航 | 美女网站在线播放 | 国产免费人人看 | 精品国产视频在线观看 | 成人小视频在线播放 | 九九视频免费在线观看 | 九九视频免费在线观看 | 国产探花视频在线播放 | 韩国中文三级 | 黄色三级免费看 | 国产不卡一二三区 | 麻豆视频免费在线观看 | 91在线免费观看国产 | 亚洲女人天堂成人av在线 | 黄污网| 成 人 黄 色 视频免费播放 | 91av成人 | 操操爽| 欧美一区日韩精品 | 字幕网在线观看 | 亚洲色图27p | 成人高清在线观看 | 午夜精品电影一区二区在线 | 狂野欧美激情性xxxx欧美 | 久久这里只有精品视频99 | 亚洲精品在线视频 | 99视频在线免费观看 | 超碰人人草人人 | 在线免费91| 夜夜干夜夜 | 九九久久影院 | 日韩美在线观看 | 麻花豆传媒一二三产区 | 在线欧美最极品的av | 欧美日在线 | 国产亚洲精品成人av久久影院 | 久久免费视频6 | 片网站 | 国产精品久久久久久久久久久久午夜 | 999国内精品永久免费视频 | 婷婷综合 | 激情视频一区二区 | 五月婷婷激情六月 | 国产精品久久久久久久久久久免费看 | 欧美尹人 | 国产+日韩欧美 | 91日韩精品一区 | 亚洲国产精品推荐 | 国产精品免费久久久久久久久久中文 | 亚洲精品免费在线 | 久草在线观 | 亚洲 欧美 综合 在线 精品 | 欧美激情综合色 | 91精品久久久久久综合乱菊 | 亚洲在线精品 | 99综合久久 | 成人h在线 | 久久人人干| 四虎影视精品永久在线观看 | 国产视频 亚洲精品 | 在线观看成人福利 | 午夜av免费观看 | 日本二区三区在线 | 欧美91精品久久久久国产性生爱 | 97理论电影 | 日韩在线中文字幕视频 | 91精品视频在线观看免费 | 国产91精品一区二区绿帽 | 免费99| 外国av网| 亚洲劲爆av| 日本夜夜草视频网站 | 亚洲永久精品一区 | 狠狠插狠狠干 | 不卡中文字幕av | 国产又粗又猛又爽又黄的视频先 | 中文字幕免费高 | 不卡的av片 | 日韩不卡高清视频 | 国产精品热视频 | 国产精品大尺度 | 精品视频一区在线 | 久久精品视频在线播放 | 粉嫩av一区二区三区入口 | 亚洲天天| 欧美日韩亚洲第一页 | 免费观看视频黄 | 日韩成人精品在线观看 | 日韩一级黄色大片 | 丁香激情五月 | 成人国产亚洲 | 亚洲作爱| 久久精品超碰 | 久久久免费 | 久久久999精品视频 国产美女免费观看 | 四虎4hu永久免费 | 久草在线视频免赞 | 伊人伊成久久人综合网小说 | 国产精品久久久久影院日本 | 久久精品国产一区 | 麻豆久久 | 亚洲爽爽网 | 91片在线观看 | 91九色视频 | 中国精品少妇 | 成人欧美一区二区三区在线观看 | 不卡视频在线看 | 久久成电影 | 国产中文字幕免费 | 成人免费视频网站在线观看 | 欧美a级片免费看 | 久久情爱 | 中文字幕在线精品 | 国产亚洲婷婷免费 | 天天干天天天天 | 国产中文在线播放 | 四虎亚洲精品 | 黄色小说免费在线观看 | 欧美久久久久久久久久久 | 激情伊人 | 伊人在线视频 | 亚洲视频2| 欧美 日韩 国产 中文字幕 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 成人av网站在线观看 | 中文在线√天堂 | 在线久久| 天天色天天射综合网 | 成片人卡1卡2卡3手机免费看 | 国产日韩精品一区二区三区 | 人成免费网站 | 激情久久小说 | 日精品在线观看 | 精品影院 | 久草电影网 | 国产精品专区在线观看 | 精品在线观看一区二区三区 | 91在线一区二区 | 午夜性盈盈 | 国内三级在线观看 | 亚洲成年人在线播放 | 精品视频在线看 | 久久国内视频 | 六月色丁| 久久人人爽人人 | 国产综合片 | 国产一区私人高清影院 | 欧美91精品国产自产 | 久热色超碰 | 天天干天天干天天干天天干天天干天天干 | 亚洲最大激情中文字幕 | 久久私人影院 | 日本久久综合视频 | 日本女人在线观看 | 国产99久久精品 | 三级黄色网络 | 激情五月看片 | 国产精品99久久久久久人免费 | 亚洲黄色免费 | 一区二区欧美激情 | 天天躁日日躁狠狠 | 91免费版成人 | 91人人爽久久涩噜噜噜 | 国产精品久久艹 | 最新日韩视频在线观看 | 国产精品一区二区免费在线观看 | 午夜体验区 | 欧美伦理一区二区 | 91久久久久久久 | 国产理论一区二区三区 | 在线有码中文 | 国产在线va| 久久久久五月天 | 日韩精品网址 | 992tv在线观看网站 | 国产精品露脸在线 | 91久久丝袜国产露脸动漫 | 国产一级性生活视频 | 在线视频一二区 | 97超碰免费| 中文字幕在线观看第三页 | 中文字幕免费国产精品 | 日日操日日插 | 天天干天天综合 | av网站播放 | 国产精品21区 | 亚洲国内精品在线 | 亚州精品在线视频 | 在线观看日韩精品 | 手机看片久久 | www激情网 | 精品久久免费看 | 波多野结衣一区三区 | 香蕉视频在线免费看 | 福利视频一区二区 | 97热在线观看 | 欧美性色综合网 | 亚洲精品免费在线视频 | 国产乱码精品一区二区蜜臀 | 黄污污网站 | 狠狠狠狠狠狠天天爱 | av激情五月 | 欧美最新另类人妖 | 亚洲天堂网在线观看视频 | 欧美特一级 | 亚洲天天综合 | 国内久久久久 | 中文一区在线观看 | 香蕉视频18 | 98精品国产自产在线观看 | 亚洲免费国产视频 | 亚洲美女在线国产 | 欧美一二在线 | 337p日本大胆噜噜噜噜 | 97色在线观看免费视频 | 日韩精品视频免费专区在线播放 | 色五婷婷 | 五月av在线| 久久精国产 | 99热在线免费观看 | 亚洲女裸体| 激情五月综合网 | 97人人看| 久久精品在线 | 日韩精品综合在线 | 婷婷综合成人 | 91资源在线观看 | www.xxxx变态.com | 九九热在线视频免费观看 | 在线观看色网站 | 97视频资源 | 黄色tv视频 | 国产精品中文在线 | 欧美一区中文字幕 | 国产精品免费观看网站 | 国产精品久久久久久久99 | 中文字幕日韩无 | 色在线视频 | 99精品在线 | 十八岁以下禁止观看的1000个网站 | 国产中文字幕在线免费观看 | 毛片www| 日韩三级视频在线看 | 亚洲欧美日本国产 | 91精品国产欧美一区二区 | 欧美性视频网站 | 99视频免费 | 国产一级片久久 | 国产一区在线视频 | 久久久亚洲影院 | 久久人人爽人人爽人人片 | 中文字幕永久 | 日日躁你夜夜躁你av蜜 | 超碰人人在 | 狠狠躁日日躁夜夜躁av | 亚洲女同ⅹxx女同tv | 成人手机在线视频 | 国产999视频 | 亚洲91精品在线观看 | 狠狠狠狠狠狠狠干 | 久久在线观看视频 | 国产一区av在线 | 国产成人免费观看 | 91在线精品视频 | 国产一级性生活视频 | 国产在线观看免费观看 | 激情网在线观看 | 久久久久免费精品视频 | 国产色视频一区二区三区qq号 | 日本久草电影 | 国产手机视频在线播放 | 在线观看完整版免费 | 97精品国自产拍在线观看 | 国产精品免费一区二区 | 免费看的黄色片 | 韩国精品福利一区二区三区 | 麻豆国产在线播放 | 成人免费在线视频观看 | 欧美一级日韩三级 | 在线观看国产91 | 91一区二区在线 | 免费色黄 | av在线播放一区二区三区 | 中文字幕在线一区二区三区 | 97视频在线观看成人 | 色香com.| 在线精品亚洲 | 欧美日韩国产色综合一二三四 | 色婷婷免费 | 午夜久草 | av一区二区三区在线 | 在线观看韩国av | 久久久久久久久久伊人 | 久久99国产精品视频 | 色噜噜日韩精品欧美一区二区 | 女人久久久久 | 精品综合久久久 | 爱色婷婷 | 91在线日韩 | 91精品免费在线观看 | 成人在线观看免费 | 中文字幕有码在线观看 | 狠狠操狠狠干天天操 | 国产精品一区二区中文字幕 | av电影亚洲| 国产精品美女久久久久久免费 | 国产精品99精品久久免费 | 国产精品淫片 | 日韩大片在线 | 国产成人一区二区在线观看 | 亚洲国产成人久久综合 | 国产精品久久久久久久毛片 | 久久久久免费视频 | 久久久免费精品国产一区二区 | 亚洲免费一级电影 | 国产一在线精品一区在线观看 | 欧美在线你懂的 | 日本久久久影视 | 亚洲特级片| 久久综合欧美精品亚洲一区 | 在线免费视频a | 亚洲综合激情五月 | 99精品电影| 在线观看国产永久免费视频 | 中文字幕在线免费观看视频 | 成人免费观看视频网站 | 久久久久久久久久久久av | 91免费视频网站在线观看 | 国产亚洲视频在线免费观看 | 国产亚洲欧美精品久久久久久 | 日韩 在线观看 |