python opencv 简单图像识别,标注 [升级版]

python opencv 简单图像识别,标注 [升级版],第1张

先看一下效果

源图像

 

一)导入库
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()   

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/719058.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存