人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

Python+OpenCV實現(xiàn)圖像識別替換功能詳解

發(fā)布日期:2022-07-20 19:40 | 文章來源:源碼中國

OpenCV-Python是一個Python庫,旨在解決計算機視覺問題。

OpenCV是一個開源的計算機視覺庫,1999年由英特爾的Gary Bradski啟動。Bradski在訪學(xué)過程中注意到,在很多優(yōu)秀大學(xué)的實驗室中,都有非常完備的內(nèi)部公開的計算機視覺接口。這些接口從一屆學(xué)生傳到另一屆學(xué)生,對于剛?cè)腴T的新人來說,使用這些接口比重復(fù)造輪子方便多了。這些接口可以讓他們在之前的基礎(chǔ)上更有效地開展工作。OpenCV正是基于為計算機視覺提供通用接口這一目標(biāo)而被策劃的。

安裝opencv

pip3 install -i https://pypi.doubanio.com/simple/ opencv-python

思路:

1、首先區(qū)分三張圖片:

base圖片代表初始化圖片;

template圖片代表需要在大圖中匹配的圖片;

white圖片為需要替換的圖片。

2、然后template圖片逐像素縮小匹配,設(shè)定閾值,匹配度到達(dá)閾值的圖片,判定為在初始圖片中;否則忽略掉。

3、匹配到最大閾值的地方,返回該區(qū)域的位置(x,y)

4、然后用white圖片resize到相應(yīng)的大小,填補到目標(biāo)區(qū)域。

match函數(shù):

"""檢查模板圖片中是否包含目標(biāo)圖片"""
def make_cv2(photo1, photo2):
 global x, y, w, h, num_1,flag
 starttime = datetime.datetime.now()
 #讀取base圖片
 img_rgb = cv2.imread(f'{photo1}')
 #讀取template圖片
 template = cv2.imread(f'{photo2}')
 h, w = template.shape[:-1]
 print('初始寬高', h, w)
 res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
 print('初始最大相似度', res.max())
 threshold = res.max()
 """,相似度小于0.2的,不予考慮;相似度在[0.2-0.75]之間的,逐漸縮小圖片"""
 print(threshold)
 while threshold >= 0.1 and threshold <= 0.83:
  if w >= 20 and h >= 20:
w = w - 1
h = h - 1
template = cv2.resize(
 template, (w, h), interpolation=cv2.INTER_CUBIC)
res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
threshold = res.max()
print('寬度:', w, '高度:', h, '相似度:', threshold)
  else:
break
 """達(dá)到0.75覆蓋之前的圖片"""
 if threshold > 0.8:
  loc = np.where(res >= threshold)
  x = int(loc[1])
  y = int(loc[0])
  print('覆蓋圖片左上角坐標(biāo):', x, y)
  for pt in zip(*loc[::-1]):
cv2.rectangle(
 img_rgb, pt, (pt[0] + w, pt[1] + h), (255, 144, 51), 1)
  num_1 += 1
  endtime = datetime.datetime.now()
  print("耗時:", endtime - starttime)
  overlay_transparent(x, y, photo1, photo3)
 else:
  flag = False

replace函數(shù):

"""將目標(biāo)圖片鑲嵌到指定坐標(biāo)位置"""
def overlay_transparent(x, y, photo1, photo3):
 #覆蓋圖片的時候上下移動的像素空間
 y += 4
 global w, h, num_2
 background = cv2.imread(f'{photo1}')
 overlay = cv2.imread(f'{photo3}')
 """縮放圖片大小"""
 overlay = cv2.resize(overlay, (w, h), interpolation=cv2.INTER_CUBIC)
 background_width = background.shape[1]
 background_height = background.shape[0]
 if x >= background_width or y >= background_height:
  return background
 h, w = overlay.shape[0], overlay.shape[1]
 if x + w > background_width:
  w = background_width - x
  overlay = overlay[:, :w]
 if y + h > background_height:
  h = background_height - y
  overlay = overlay[:h]
 if overlay.shape[2] < 4:
  overlay = np.concatenate([overlay, np.ones((overlay.shape[0], overlay.shape[1], 1), dtype=overlay.dtype) * 255],axis=2,)
 overlay_image = overlay[..., :3]
 mask = overlay[..., 3:] / 255.0
 background[y:y + h,x:x + w] = (1.0 - mask) * background[y:y + h,x:x + w] + mask * overlay_image
 # path = 'result'
 path = ''
 cv2.imwrite(os.path.join(path, f'1.png'), background)
 num_2 += 1
 print('插入成功。')
 init()

每次執(zhí)行需要初始化x,y(圖片匹配初始位置參數(shù)),w,h(圖片縮放初始寬高)

x = 0
y = 0
w = 0
h = 0
flag = True
threshold = 0
template = ''
num_1 = 0
num_2 = 0
photo3 = ''
"""參數(shù)初始化"""
def init():
 global x, y, w, h, threshold, template,flag
 x = 0
 y = 0
 w = 0
 h = 0
 threshold = 0
 template = ''

完整代碼

import cv2
import datetime
import os
import numpy as np
x = 0
y = 0
w = 0
h = 0
flag = True
threshold = 0
template = ''
num_1 = 0
num_2 = 0
photo3 = ''
"""參數(shù)初始化"""
def init():
 global x, y, w, h, threshold, template,flag
 x = 0
 y = 0
 w = 0
 h = 0
 threshold = 0
 template = ''
"""檢查模板圖片中是否包含目標(biāo)圖片"""
def make_cv2(photo1, photo2):
 global x, y, w, h, num_1,flag
 starttime = datetime.datetime.now()
 img_rgb = cv2.imread(f'{photo1}')
 template = cv2.imread(f'{photo2}')
 h, w = template.shape[:-1]
 print('初始寬高', h, w)
 res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
 print('初始最大相似度', res.max())
 threshold = res.max()
 """,相似度小于0.2的,不予考慮;相似度在[0.2-0.75]之間的,逐漸縮小圖片"""
 print(threshold)
 while threshold >= 0.1 and threshold <= 0.83:
  if w >= 20 and h >= 20:
w = w - 1
h = h - 1
template = cv2.resize(
 template, (w, h), interpolation=cv2.INTER_CUBIC)
res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
threshold = res.max()
print('寬度:', w, '高度:', h, '相似度:', threshold)
  else:
break
 """達(dá)到0.75覆蓋之前的圖片"""
 if threshold > 0.8:
  loc = np.where(res >= threshold)
  x = int(loc[1])
  y = int(loc[0])
  print('覆蓋圖片左上角坐標(biāo):', x, y)
  for pt in zip(*loc[::-1]):
cv2.rectangle(
 img_rgb, pt, (pt[0] + w, pt[1] + h), (255, 144, 51), 1)
  num_1 += 1
  endtime = datetime.datetime.now()
  print("耗時:", endtime - starttime)
  overlay_transparent(x, y, photo1, photo3)
 else:
  flag = False

"""將目標(biāo)圖片鑲嵌到指定坐標(biāo)位置"""
def overlay_transparent(x, y, photo1, photo3):
 y += 0
 global w, h, num_2
 background = cv2.imread(f'{photo1}')
 overlay = cv2.imread(f'{photo3}')
 """縮放圖片大小"""
 overlay = cv2.resize(overlay, (w, h), interpolation=cv2.INTER_CUBIC)
 background_width = background.shape[1]
 background_height = background.shape[0]
 if x >= background_width or y >= background_height:
  return background
 h, w = overlay.shape[0], overlay.shape[1]
 if x + w > background_width:
  w = background_width - x
  overlay = overlay[:, :w]
 if y + h > background_height:
  h = background_height - y
  overlay = overlay[:h]
 if overlay.shape[2] < 4:
  overlay = np.concatenate([overlay, np.ones((overlay.shape[0], overlay.shape[1], 1), dtype=overlay.dtype) * 255],axis=2,)
 overlay_image = overlay[..., :3]
 mask = overlay[..., 3:] / 255.0
 background[y:y + h,x:x + w] = (1.0 - mask) * background[y:y + h,x:x + w] + mask * overlay_image
 # path = 'result'
 path = ''
 cv2.imwrite(os.path.join(path, f'1.png'), background)
 num_2 += 1
 print('插入成功。')
 init()

if __name__ == "__main__":
 photo1 = "1.png"
 photo2 = "3.png"
 photo3 = "white.png"
 while flag == True:
  make_cv2(photo1, photo2)
  overlay_transparent(x, y, photo1, photo3)

執(zhí)行結(jié)果:

到此這篇關(guān)于Python+OpenCV實現(xiàn)圖像識別替換功能詳解的文章就介紹到這了,更多相關(guān)Python OpenCV圖像識別替換內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

海外穩(wěn)定服務(wù)器

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部