源图像
一)导入库
import cv2 as cv
import matplotlib.pyplot as plt
import os
import random
二)读取图片
注意!!!
所有图片是在同一文件夹下的哦
主图名称是必须知道的哦
def read_img(mpath,img_main):
"""读取图片"""
img_name=os.listdir(mpath) # 获取 所有图片名称,是个列表
imgs=[] # 读取进来的图片数据
for name in (img_name):
if name==img_main:
# if os.path.splitext(name)[0]==os.path.splitext(img_main)[0]: # 多余的测试
main=img_rgb(cv.imread(mpath+name)) # 调用颜色转置了 下面就是
else:
imgs.append(img_rgb(cv.imread(mpath+name)))
#返回对应 参数 方便下一个函数使用 ,避免声明 全局变量
return imgs,main,img_name
颜色转置,
不是很重要的模块,
因为opencv读取图像是 BGR 而不是 常用的 RGB 所以,用别的 库显示opencv读取的图像需要转换一下,
不然就是蓝色的
当然了,opencv自带的 函数显示的是正常的,但是
我用的jupter做的,他自带的会额外d出一个窗口,就很烦
所以用 matplotlib的图像显示
def img_rgb(img):
"""颜色转置"""
# 颜色转置 bgr 转换 rgb
b,g,r = cv.split(img)
img= cv.merge([r,g,b])
return img
获取图片的高 宽
因为是要在 peo.jpg【第二张图中,倒数第三个】中用矩形框标注其他图像,
所以需要获取 其他图像的【高度】 和【宽度】
才能设定矩形的大小
def img_hwl(imgs):
"""获取图片的高 宽 """
hwl=[] # 存放 高 宽 L 属性
# 获取 图像 高 宽 和 一个 L???,不确定,没用到第三个值
for i in range(len(imgs)):
hwl.append(imgs[i].shape)
return hwl
从检测结果中提取 对应坐标
def img_points(res,hwl):
"""从检测结果中提取 对应坐标 """
# 注 minMaxLoc 返回的是四个值,
min_val,max_val,min_loc,max_loc=cv.minMaxLoc(res)
# 这里取第四个,是不同算法决定的
top_left=max_loc# 存放图片在原图上的 左上角坐标
# 矩形框 右下角坐标
bottom_right=(top_left[0]+hwl[1],top_left[1]+hwl[0])
return top_left,bottom_right
放置文本[就是美化一下]
不是关键
def put_txt(img,top_left,text):
"""放置文本"""
fontsize=1 # 字体大小
r=random.randint(50,256)
g=random.randint(50,256)
b=random.randint(50,256)
color=(r,g,b)
font=cv.FONT_HERSHEY_DUPLEX # 字体格式
cv.putText(img,text,(top_left[0],
top_left[1]+15),font,fontsize,color,1,cv.LINE_AA)
检测图片,核心功能 !!!
def img_check(path,img_main):
"""检测图片,核心功能"""
imgs,img_main,img_name=read_img(path,img_main) # 获取 图像列表,主图像,图像名称列表
hwl=img_hwl(imgs)# 存放 高 宽 L 属性
ress=[] # 存放比对结果
for i in range(len(imgs)):
# 进行检测对比 第三步
ress.append(
cv.matchTemplate(imgs[i],
img_main,cv.TM_CCOEFF))
# cv.TM_CCOEFF 一种算法 ,有他才实现的 还有别的,百度叭
# 从检测结果中提取 对应坐标 第四步
top_left,bottom_right=img_points(ress[i],hwl[i]) # 调用自设函数
put_txt(img_main,top_left,img_name[i]) # 调用自设函数
cv.rectangle(img_main,top_left,bottom_right,
(193, 44, 31),2)
plt.figure(figsize=(10,5))
plt.imshow(img_main)
plt.show()
主函数 或者说 开始函数
def main():
"""主函数"""
path = r'C:\Users\Administrator\Desktop\python\mypic\peo\'
img_main= 'peo.jpg'
# path=r'C:\Users\Administrator\Desktop\python\mypic\annimo\'
# img_main= 'anis.png'
img_check(path,img_main)
main()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)