国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python給你的頭像加上圣誕帽

Python給你的頭像加上圣誕帽

2020-12-31 00:39冰不語 Python

這篇文章主要為大家詳細(xì)介紹了Python給你的頭像加上圣誕帽 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

引言

隨著圣誕的到來,大家紛紛@官方微信給自己的頭像加上一頂圣誕帽。當(dāng)然這種事情用很多P圖軟件都可以做到。但是作為一個(gè)學(xué)習(xí)圖像處理的技術(shù)人,還是覺得我們有必要寫一個(gè)程序來做這件事情。而且這完全可以作為一個(gè)練手的小項(xiàng)目,工作量不大,而且很有意思。

用到的工具

OpenCV(畢竟我們主要的內(nèi)容就是OpenCV…)

dlib(前一篇文章剛說過,dlib的人臉檢測(cè)比OpenCV更好用,而且dlib有OpenCV沒有的關(guān)鍵點(diǎn)檢測(cè)。)

用到的語言為Python。但是完全可以改成C++版本,時(shí)間有限,就不寫了。有興趣的小伙伴可以拿來練手。

流程一、素材準(zhǔn)備

首先我們需要準(zhǔn)備一個(gè)圣誕帽的素材,格式最好為PNG,因?yàn)镻NG的話我們可以直接用Alpha通道作為掩膜使用。我們用到的圣誕帽如下圖:

Python給你的頭像加上圣誕帽

我們通過通道分離可以得到圣誕帽圖像的alpha通道。代碼如下:

?
1
2
3
4
r,g,b,a = cv2.split(hat_img)
rgb_hat = cv2.merge((r,g,b))
 
cv2.imwrite("hat_alpha.jpg",a)

為了能夠與rgb通道的頭像圖片進(jìn)行運(yùn)算,我們把rgb三通道合成一張rgb的彩色帽子圖。Alpha通道的圖像如下圖所示。

Python給你的頭像加上圣誕帽

二、人臉檢測(cè)與人臉關(guān)鍵點(diǎn)檢測(cè)

我們用下面這張圖作為我們的測(cè)試圖片。

Python給你的頭像加上圣誕帽

下面我們用dlib的正臉檢測(cè)器進(jìn)行人臉檢測(cè),用dlib提供的模型提取人臉的五個(gè)關(guān)鍵點(diǎn)。代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# dlib人臉關(guān)鍵點(diǎn)檢測(cè)器
predictor_path = "shape_predictor_5_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)
 
# dlib正臉檢測(cè)器
detector = dlib.get_frontal_face_detector()
 
# 正臉檢測(cè)
dets = detector(img, 1)
 
# 如果檢測(cè)到人臉
if len(dets)>0:
  for d in dets:
    x,y,w,h = d.left(),d.top(), d.right()-d.left(), d.bottom()-d.top()
    # x,y,w,h = faceRect
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2,8,0)
 
    # 關(guān)鍵點(diǎn)檢測(cè),5個(gè)關(guān)鍵點(diǎn)
    shape = predictor(img, d)
    for point in shape.parts():
      cv2.circle(img,(point.x,point.y),3,color=(0,255,0))
 
    cv2.imshow("image",img)
    cv2.waitKey()

這部分效果如下圖:

Python給你的頭像加上圣誕帽

三、調(diào)整帽子大小

我們選取兩個(gè)眼角的點(diǎn),求中心作為放置帽子的x方向的參考坐標(biāo),y方向的坐標(biāo)用人臉框上線的y坐標(biāo)表示。然后我們根據(jù)人臉檢測(cè)得到的人臉的大小調(diào)整帽子的大小,使得帽子大小合適。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 選取左右眼眼角的點(diǎn)
  point1 = shape.part(0)
  point2 = shape.part(2)
 
  # 求兩點(diǎn)中心
  eyes_center = ((point1.x+point2.x)//2,(point1.y+point2.y)//2)
 
  # cv2.circle(img,eyes_center,3,color=(0,255,0))
  # cv2.imshow("image",img)
  # cv2.waitKey()
 
  # 根據(jù)人臉大小調(diào)整帽子大小
  factor = 1.5
  resized_hat_h = int(round(rgb_hat.shape[0]*w/rgb_hat.shape[1]*factor))
  resized_hat_w = int(round(rgb_hat.shape[1]*w/rgb_hat.shape[1]*factor))
 
  if resized_hat_h > y:
    resized_hat_h = y-1
 
  # 根據(jù)人臉大小調(diào)整帽子大小
resized_hat = cv2.resize(rgb_hat,(resized_hat_w,resized_hat_h))

四、提取帽子和需要添加帽子的區(qū)域

按照之前所述,去Alpha通道作為mask。并求反。這兩個(gè)mask一個(gè)用于把帽子圖中的帽子區(qū)域取出來,一個(gè)用于把人物圖中需要填帽子的區(qū)域空出來。后面你將會(huì)看到。         

?
1
2
3
# 用alpha通道作為mask
mask = cv2.resize(a,(resized_hat_w,resized_hat_h))
mask_inv = cv2.bitwise_not(mask)

從原圖中取出需要添加帽子的區(qū)域,這里我們用的是位運(yùn)算操作。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 帽子相對(duì)與人臉框上線的偏移量
dh = 0
dw = 0
 # 原圖ROI
 # bg_roi = img[y+dh-resized_hat_h:y+dh, x+dw:x+dw+resized_hat_w]
 bg_roi = img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)]
 
# 原圖ROI中提取放帽子的區(qū)域
 bg_roi = bg_roi.astype(float)
mask_inv = cv2.merge((mask_inv,mask_inv,mask_inv))
alpha = mask_inv.astype(float)/255
 
 # 相乘之前保證兩者大小一致(可能會(huì)由于四舍五入原因不一致)
 alpha = cv2.resize(alpha,(bg_roi.shape[1],bg_roi.shape[0]))
 # print("alpha size: ",alpha.shape)
 # print("bg_roi size: ",bg_roi.shape)
 bg = cv2.multiply(alpha, bg_roi)
 bg = bg.astype('uint8')

這是的背景區(qū)域(bg)如下圖所示。可以看到,剛好是需要填充帽子的區(qū)域缺失了。

Python給你的頭像加上圣誕帽

然后我們提取帽子區(qū)域。

?
1
2
# 提取帽子區(qū)域
hat = cv2.bitwise_and(resized_hat,resized_hat,mask = mask)

提取得到的帽子區(qū)域如下圖。帽子區(qū)域正好與上一個(gè)背景區(qū)域互補(bǔ)。

Python給你的頭像加上圣誕帽

五、添加圣誕帽

最后我們把兩個(gè)區(qū)域相加。再放回到原圖中去,就可以得到我們想要的圣誕帽圖了。這里需要注意的就是,相加之前resize一下保證兩者大小一致,因?yàn)榭赡軙?huì)由于四舍五入原因不一致。

?
1
2
3
4
5
6
7
8
# 相加之前保證兩者大小一致(可能會(huì)由于四舍五入原因不一致)
   hat = cv2.resize(hat,(bg_roi.shape[1],bg_roi.shape[0]))
   # 兩個(gè)ROI區(qū)域相加
   add_hat = cv2.add(bg,hat)
   # cv2.imshow("add_hat",add_hat)
 
   # 把添加好帽子的區(qū)域放回原圖
 img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)] = add_hat

最后我們得到的效果圖如下所示。

Python給你的頭像加上圣誕帽

下載:完整代碼

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/xingchenbingbuyu/article/details/78880931

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 欧美精品理论片大全 | 午夜精品一区二区三区在线播放 | 欧美极品视频 | 亚洲精品麻豆 | 久久久.com | 国产精品欧美久久久久一区二区 | 蜜桃一区 | 亚洲激情视频 | 国产一区免费 | 亚洲生活片 | 成人精品一区二区三区视频播放 | 精一区二区 | 日韩一区欧美 | 中文字幕在线观看1 | 亚洲欧美成人a毛片 | 国产v日产∨综合v精品视频 | 羞羞在线观看 | 成人福利在线观看 | 日韩在线观看中文字幕 | 中文字幕一区二区三 | 国产精品久久久久久婷婷天堂 | 国产资源在线观看视频 | 国产精品久久久久久久久 | 精品国产一区二区在线 | 一级大毛片 | 一区二区三区四区在线播放 | 国产精品区二区三区日本 | 欧美一级二级三级视频 | 精品国产欧美一区二区三区成人 | 亚洲精品电影在线观看 | 欧美黑人一级爽快片淫片高清 | 国产亚洲一区二区三区 | 亚洲电影免费 | 亚洲www视频| 亚洲成av | 欧美黄色a视频 | 国产一级一级国产 | 久久中文字幕网 | 午夜视频在线观看免费视频 | 欧美精品亚洲精品 | 国产高清亚洲 |