python记录3

本文介绍了将视频拆分为图片、使用哈希算法处理视频分镜以及比较图像相似度的方法。接着,展示了人脸识别的例子,通过调整容忍度实现准确匹配。最后,探讨了Python内置的dir、help和inspect函数,用于获取对象信息和帮助文档。
摘要由CSDN通过智能技术生成

1:把视频打散为图片

出现SyntaxError: invalid character in identifier但是却检查不出错误

字符串最后可能有空格

2.哈希算法处理视频分镜

import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
os.chdir('/Users/even/Desktop/pythonqusi')


# 均值哈希算法
def aHash(img):
    # 缩放为8*8
    plt.imshow(img)
    plt.axis('off')  #去掉坐标轴
    plt.show()
    img = cv2.resize(img, (8, 8))
    plt.imshow(img)
    plt.axis('off')  #去掉坐标轴
    plt.show()

    # 转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # s为像素和初值为0,hash_str为hash值初值为''
    s = 0
    hash_str = ''
    # 遍历累加求像素和
    for i in range(8):
        for j in range(8):
            s = s + gray[i, j]
    # 求平均灰度
    avg = s / 64
    # 灰度大于平均值为1相反为0生成图片的hash值
    for i in range(8):
        for j in range(8):
            if gray[i, j] > avg:
                hash_str = hash_str + '1'
            else:
                hash_str = hash_str + '0'
    return hash_str



# 通过得到RGB每个通道的直方图来计算相似度
def classify_hist_with_split(image1, image2, size=(256, 256)):
    # 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值
    image1 = cv2.resize(image1, size)
    image2 = cv2.resize(image2, size)
    plt.imshow(image1)
    plt.show()
    plt.axis('off')
    
    plt.imshow(image2)
    plt.show()
    plt.axis('off')
    
    sub_image1 = cv2.split(image1)
    sub_image2 = cv2.split(image2)
    sub_data = 0
    
    for im1, im2 in zip(sub_image1, sub_image2):
        sub_data += calculate(im1, im2)
    sub_data = sub_data / 3
    return sub_data


# 计算单通道的直方图的相似值
def calculate(image1, image2):
    hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
    hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
    plt.plot(hist1, color="r")
    plt.plot(hist2, color="g")
    plt.show()
    # 计算直方图的重合度
    degree = 0
    for i in range(len(hist1)):
        if hist1[i] != hist2[i]:
            degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))
        else:
            degree = degree + 1    #统计相似
    degree = degree / len(hist1)
    return degree


# Hash值对比
def cmpHash(hash1, hash2):
    n = 0
    print(hash1)
    print(hash2)
    # hash长度不同则返回-1代表传参出错
    if len(hash1)!=len(hash2):
        return -1
    # 遍历判断
    for i in range(len(hash1)):
        # 不相等则n计数+1,n最终为相似度
        if hash1[i] != hash2[i]:
            n = n + 1
    return n


img1 = cv2.imread('./pic/image0.jpg')  #  11--- 16 ----13 ---- 0.43
img2 = cv2.imread('./pic/image1.jpg')


hash1 = aHash(img1)
hash2 = aHash(img2)
n = cmpHash(hash1, hash2)
print('均值哈希算法相似度:', n)

n = classify_hist_with_split(img1, img2)
print('三直方图算法相似度:', n)

3.人脸匹配

import cv2
import face_recognition
import matplotlib.pyplot as plt
 
known_image=cv2.imread("xz1.jpg")
known_image = face_recognition.load_image_file("xz1.jpg")
 
unknown_image=cv2.imread("wyb1.jpg")
unknown_image = face_recognition.load_image_file("wyb1.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
 
results = face_recognition.compare_faces([known_encoding],
                                         unknown_encoding,
                                         tolerance=0.5)
if results[0] == True:
    print("匹配成功,该未知图片与已有图片人脸可匹配!")
else:
    print("匹配失败!")
print(known_encoding) 
print(unknown_encoding)
plt.imshow(known_image)
plt.axis('off')  
plt.show()
 
plt.imshow(unknown_image)
plt.axis('off')  
plt.show()

​​​​​​​

运行程序后,两人的人脸匹配成功了

虽然是两个人,但是程序却将其识别为一个人,是因为tolerance的数值较大。将数值调到0.3以下之后才显示匹配失败。

4.三个函数:dir、help、inspect

(1)dir:

   dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。 

dir 语法:

dir([object])

返回值:返回模块的属性列表。

代码内容

>>>dir()   #  获得当前模块的属性列表
['__builtins__', '__doc__', '__name__', '__package__', 'arr', 'myslice']
>>> dir([ ])    # 查看列表的方法
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>>

(2)help:help() 函数用于查看函数或模块用途的详细说明。

    help 语法:

help([object])

>>>help('sys') # 查看 sys 模块的帮助 ……显示帮助信息…… >>>help('str') # 查看 str 数据类型的帮助 ……显示帮助信息…… >>>a = [1,2,3] >>>help(a) # 查看列表 list 帮助信息 ……显示帮助信息…… >>>help(a.append) # 显示list的append方法的帮助 ……显示帮助信息……

3.inspect:

inspect模块也被称为 检查现场对象。这里的重点在于“现场”二字,也就是当前运行的状态。

inspect模块提供了一些函数来了解现场对象,包括 模块、类、实例、函数和方法。

inspect函数主要用于以下四个方面

  对是否是模块、框架、函数进行类型检查
  获取源码
  获取类或者函数的参数信息
  解析堆栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值