成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

怎么用Python做一個圣誕帽

這篇“怎么用Python做一個圣誕帽”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么用Python做一個圣誕帽”文章吧。

成都創(chuàng)新互聯(lián)公司主營石林網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),石林h5成都小程序開發(fā)搭建,石林網(wǎng)站營銷推廣歡迎石林等地區(qū)企業(yè)咨詢

基礎(chǔ)知識準(zhǔn)備

在計算機(jī)中,圖像是以矩陣的形式保存的,先行后列。所以,一張寬×高×顏色通道=480×256×3的圖片會保存在一個256×480×3的三維張量中。圖像處理時也是按照這種思想進(jìn)行計算的(其中就包括 OpenCV 下的圖像處理),即 高×寬×顏色通道。

數(shù)字圖像

對于一幅的數(shù)字圖像,我們看到的是 肉眼可見的一幅真正的圖片,但是計算機(jī)看來,這副圖像只是一堆亮度各異的點(diǎn)。一副尺寸為 M × N 的圖像可以用一個 M × N 的矩陣來表示,矩陣元素的值表示這個位置上的像素的亮度,一般來說像素值越大表示該點(diǎn)越亮。

一般來說,灰度圖用 2 維矩陣表示,彩色(多通道)圖像用 3 維矩陣(M× N × 3)表示。

圖像通道

描述一個像素點(diǎn),如果是灰度,那么只需要一個數(shù)值來描述它,就是單通道。如果一個像素點(diǎn),有RGB三種顏色來描述它,就是三通道。而四通道圖像,就是R、G、B加上一個A通道,表示透明度。一般叫做alpha通道,表示透明度。

ROI和mask

Setting Region of Interest (ROI),翻譯成白話為,設(shè)置感興趣的區(qū)域。mask是做圖像掩膜處理,相當(dāng)于把我們不關(guān)心的部位覆蓋住,留下ROI部分。上面說的alpha就可以作為mask。

矩陣(Numpy)知識

矩陣索引、切片等,這里我自己掌握的也不好,就不多說了,小伙伴兒們可以自行學(xué)習(xí)。

環(huán)境準(zhǔn)備

有了基礎(chǔ)知識后,我們來簡單看下代碼。

首先安裝需要要用到的 OpenCV 和 dlib 庫,使用pip分別安裝之

pip install python-opencv

pip install dlib

然后手工在網(wǎng)上下載數(shù)據(jù)模型文件 shape_predictor_5_face_landmarks.dat,地址如下:http://dlib.net/files/,下載后放到項目目錄下。

有興趣的同學(xué)可以玩玩那個 shape_predictor_68_face_landmarks.dat,識別出的人臉關(guān)鍵點(diǎn)有68個之多呢。

怎么用Python做一個圣誕帽

代碼處理

帽子處理

我們首先要做的就是處理帽子,我們使用的圖片如下

怎么用Python做一個圣誕帽

先提取帽子圖片的rgb和alpha值

# 帽子圖片
hat_img3 = cv2.imread("hat.png", -1)
r, g, b, a = cv2.split(hat_img3)
rgb_hat = cv2.merge((r, g, b))
cv2.imwrite("rgb_hat.jpg", rgb_hat)
cv2.imwrite("alpha.jpg", a)
print(a)
print(hat_img3.shape)
print(rgb_hat.shape)

我們得到的效果如下:

rgb圖

怎么用Python做一個圣誕帽

alpha圖

怎么用Python做一個圣誕帽

對于的打印出的a數(shù)值如下:

[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]
人臉檢測

下面進(jìn)行人臉檢測,使用dlib處理。

# 人臉檢測
dets = self.detector(img, 1)
x, y, w, h = dets[0].left(), dets[0].top(), dets[0].right() - dets[0].left(), dets[0].bottom() - dets[0].top()
# 關(guān)鍵點(diǎn)檢測
shape = self.predictor(img, dets[0])
point1 = shape.parts()[0]
point2 = shape.parts(2)
# 求兩點(diǎn)中心
eyes_center = ((point1.x + point2.x) // 2, (point1.y + point2.y) // 2)

接下來是按照比例縮小帽子的圖片

# 帽子和人臉轉(zhuǎn)換比例
hat_w = int(round(dets[0].right()/1.5))
hat_h = int(round(dets[0].bottom() / 2))
if hat_h > y:
hat_h = y - 1
hat_newsize = cv2.resize(rgb_hat, (hat_w, hat_h))
mask = cv2.resize(a, (hat_w, hat_h))
mask_inv = cv2.bitwise_not(mask)
dh = 0
dw = 0

bg_roi = img[y+dh-hat_h:y+dh,(eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)]

ROI 提取

進(jìn)行 ROI 提取

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

mask 變量,取出了帽子的區(qū)域。

怎么用Python做一個圣誕帽

mask_inv 變量,用來取出人臉圖片中安裝帽子的區(qū)域。

怎么用Python做一個圣誕帽

接下來在人臉圖片中取出安裝帽子的區(qū)域(ROI)

# 原圖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)]

再接下來在人臉圖片中取出帽子形狀區(qū)域

# 原圖ROI中提取放帽子的區(qū)域
bg_roi = bg_roi.astype(float)
mask_inv = cv2.merge((mask_inv, mask_inv, mask_inv))
alpha = mask_inv.astype(float) / 255
# 相乘之前保證兩者大小一致(可能會由于四舍五入原因不一致)
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')

這里是把圖片默認(rèn)的uint8類型轉(zhuǎn)換成了float類型進(jìn)行運(yùn)算,最后又轉(zhuǎn)換回來。

合成的圖片

怎么用Python做一個圣誕帽

黑黑的部分就是我們要放置帽子的地方。

在帽子圖片中提取帽子部分。

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

使用剛剛調(diào)整大小的帽子圖片來提取。

怎么用Python做一個圣誕帽

可以看到,除了帽子部分,其他區(qū)域已經(jīng)掩模處理了。

以上就是提取ROI的過程,比較難懂,需要好好琢磨,尤其是矩陣的切片、mask處理部分。

合成圖片

最后一步就是把人臉圖片與帽子合成到一起了,也就是把人臉空余帽子部分的圖片區(qū)域和帽子只展示帽子區(qū)域的圖片區(qū)域(有點(diǎn)拗口)合并在一起。

# 相加之前保證兩者大小一致(可能會由于四舍五入原因不一致)
hat = cv2.resize(hat, (bg_roi.shape[1], bg_roi.shape[0]))
# 兩個ROI區(qū)域相加
add_hat = cv2.add(bg, hat)

最后把這個片段放回人臉原圖中,展示圖片

img[y+dh-hat_h:y+dh, (eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)] = add_hat

以上就是關(guān)于“怎么用Python做一個圣誕帽”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章標(biāo)題:怎么用Python做一個圣誕帽
文章地址:http://jinyejixie.com/article22/jjidjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT域名注冊、網(wǎng)站設(shè)計全網(wǎng)營銷推廣建站公司、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
铅山县| 如皋市| 深圳市| 安泽县| 天门市| 高雄县| 天镇县| 永清县| 华池县| 台南市| 连平县| 广水市| 武义县| 特克斯县| 米林县| 四川省| 九江市| 铁岭市| 马公市| 邵阳市| 鲁山县| 海原县| 韶山市| 祁连县| 浑源县| 万源市| 泾源县| 临海市| 宁陕县| 商洛市| 准格尔旗| 阳江市| 西乌| 玛纳斯县| 日照市| 基隆市| 张家川| 福泉市| 河北省| 福清市| 鹿泉市|