<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
OpenCV-Python是一個Python庫,旨在解決計算機視覺問題。
OpenCV是一個開源的計算機視覺庫,1999年由英特爾的Gary Bradski啟動。Bradski在訪學過程中注意到,在很多優秀大學的實驗室中,都有非常完備的內部公開的計算機視覺介面。這些介面從一屆學生傳到另一屆學生,對於剛入門的新人來說,使用這些介面比重複造輪子方便多了。這些介面可以讓他們在之前的基礎上更有效地開展工作。OpenCV正是基於為計算機視覺提供通用介面這一目標而被策劃的。
安裝opencv
pip3 install -i https://pypi.doubanio.com/simple/ opencv-python
思路:
1、首先區分三張圖片:
base圖片代表初始化圖片;
template圖片代表需要在大圖中匹配的圖片;
white圖片為需要替換的圖片。
2、然後template圖片逐畫素縮小匹配,設定閾值,匹配度到達閾值的圖片,判定為在初始圖片中;否則忽略掉。
3、匹配到最大閾值的地方,返回該區域的位置(x,y)
4、然後用white圖片resize到相應的大小,填補到目標區域。
match函數:
"""檢查模板圖片中是否包含目標圖片""" 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 """達到0.75覆蓋之前的圖片""" if threshold > 0.8: loc = np.where(res >= threshold) x = int(loc[1]) y = int(loc[0]) print('覆蓋圖片左上角座標:', 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函數:
"""將目標圖片鑲嵌到指定座標位置""" 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()
每次執行需要初始化x,y(圖片匹配初始位置引數),w,h(圖片縮放初始寬高)
x = 0 y = 0 w = 0 h = 0 flag = True threshold = 0 template = '' num_1 = 0 num_2 = 0 photo3 = '' """引數初始化""" 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 = '' """引數初始化""" def init(): global x, y, w, h, threshold, template,flag x = 0 y = 0 w = 0 h = 0 threshold = 0 template = '' """檢查模板圖片中是否包含目標圖片""" 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 """達到0.75覆蓋之前的圖片""" if threshold > 0.8: loc = np.where(res >= threshold) x = int(loc[1]) y = int(loc[0]) print('覆蓋圖片左上角座標:', 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 """將目標圖片鑲嵌到指定座標位置""" 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)
執行結果:
到此這篇關於Python+OpenCV實現影象識別替換功能詳解的文章就介紹到這了,更多相關Python OpenCV影象識別替換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45