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

先看一下效果

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

源图像

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

一)导入库

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做的,他自带的会额外弹出一个窗口,就很烦

        所以用 matplotlib的图像显示

        -------------------------------------------

        22年4月23日  我阅读了《OpenCV轻松入门:面向Python》李立宗 这本书发现

        这个模块真的毫无作用,至少,是在我这里

        给 cv.imread()追加一个参数就可以读取原始色彩,啊啊啊啊 就这样

        cv.imread('path',-1)  -1 代表 cv2.IMREAD_UNCHANGED : 保持原格式不变

        真离谱啊

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()   

你可能感兴趣的:(python,图像处理)