如何利用OpenCV实现图像识别,并能替换的功能
Admin 2022-07-26 群英技术资讯 865 次浏览
今天小编跟大家讲解下有关“如何利用OpenCV实现图像识别,并能替换的功能”的内容 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了相关资料,希望小伙伴们看了有所帮助。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)
执行结果:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
制表符也属于“写法是两个字符的组合,但含义上只是一个字符”的情形。它的写法是“\t”,是反斜杠和t字母的组合,t取的是table之意。它的含义是一个字符,叫做制表符。它的作用是对齐表格数据的各列。
在日常开发中,对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块。本文就为大家详细讲解这两个模块的使用,需要的可以参考一下
这篇文章主要介绍了python之NAN和INF值处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章主要为大家详细介绍了PyQt中实现自定义工具提示ToolTip的方法详解,文中的示例代码讲解详细,对我们学习有一定帮助,需要的可以参考一下
这篇文章主要介绍了Pytorch实现图像识别之数字识别(附详细注释),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008