(酒驾检测、人脸检测、疲劳检测、模拟口罩数据集制作、防酒驾)-常用的论文所用的python代码总结

发布时间:2024年01月21日

汇总:

15,摄像头黑屏遮挡检测 (摄像头被遮挡就会被检测到”可以触发报警“)

14,picture2mp4.py图片按一定的顺序转合成为MP4

13,STM32单片机串口 与电脑上位机连接通讯的代码
12,批量修改文件或者文件夹的重命名、按一定的顺序重命名、带序号的命名,以一定的顺序重命名
11,除图片水印
10,加权式双模注意力机制
9,将多张图片调整为统一尺寸纵向横向拼接
8,排序
7,批量打印PDF
6,常用的激活函数曲线绘制代码
5,批量删除或者检查指定格式的文件或者文件夹或者修改文件的命名方式。
4,批量检查删除失真的图片(本代码是自己论文中用到的,供参考修改)

3,批量删除文件名或者重命名文件名、删除文件名中指定的字符、另存为指定的文件后缀名

2,视频处理为图片.py???视频处理为一帧帧的图片并保存(根据需要自己稍加修改)
1,制作pairs.txt对(主要用于人脸识别,)

(ps:另外还有视频检测、疲劳 检测、酒驾检测、口罩人脸识别、低光照改善、人脸对称修复、高精度模拟口罩佩戴(给图片或视频中人脸佩戴模拟口罩、酒驾人脸检测上位机、涉及多个文件夹不方便上传,如有需要私信联系qq:1228119957)

1,制作pairs.txt对(主要用于人脸识别,)

"""
By Fivethousand

输入图片二级目录根目录,随机生成该图片集的验证集(图片对+label)
"""
import os
import random

correct_label="1"
error_label="0"
def V_S_G(loadpath,savepath="./AutoSaved.txt",split=" ",same_num=3000,diff_num=3000): ? ? ? ? ? ? ? ?#V_S_G refers to Verification-set-generator
? ? f = open(savepath, 'a+')
? ? f.seek(0)
? ? f.truncate() ?# 清空文件
? ? subfile_list1 = os.listdir(loadpath) ? ? ?#一级子文件名列表
? ? dictionary={}
? ? for file in subfile_list1:
? ? ? ? subfile_list2=os.listdir(os.path.join(loadpath,file) ) ? ? ? ?#某一个一级子文件下的二级子文件列表
? ? ? ? dictionary[file]=subfile_list2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#将该列表存入字典中,索引值为其母文件名

? ? for file in subfile_list1: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#生成相同的图片对
? ? ? ? count=2*same_num
? ? ? ? if count>len(dictionary[file]):
? ? ? ? ? ? count=len(dictionary[file])
? ? ? ? ? ? if count%2 is not 0: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#必须保证count是偶数
? ? ? ? ? ? ? ? count=count-1
? ? ? ? rdlist=random.sample(range(0,len(dictionary[file])),count) ? ? #生成相同的图片对
? ? ? ? for i in range(int(count/2)):
? ? ? ? ? ? # first=os.path.join(loadpath,file,dictionary[file][rdlist[2*i]]) ? ? ? ? ? ? ? #备份
? ? ? ? ? ? # second=os.path.join(loadpath, ? ?file, dictionary[file][rdlist[2 * i + 1]]) ? #备份
? ? ? ? ? ? first=os.path.join(file+'/',dictionary[file][rdlist[2*i]])
? ? ? ? ? ? second=os.path.join(file+'/', dictionary[file][rdlist[2 * i + 1]])

? ? ? ? ? ? f.write(first+split+second+split+correct_label+"\n")

? ? wrong_pair_num=diff_num
? ? if(diff_num>len(subfile_list1)):
? ? ? ? wrong_pair_num=len(subfile_list1)
? ? for i in range(wrong_pair_num): ? ? ? ? ? ? #生成不相同的图片对
? ? ? ? rdpair=random.sample(range(0,len(subfile_list1)),2)
? ? ? ? first_file_name=subfile_list1[rdpair[0]]
? ? ? ? first_rd=random.sample(range(0,len(dictionary[first_file_name])),1)[0]
? ? ? ? # first=os.path.join(loadpath,first_file_name,dictionary[first_file_name][first_rd]) # 备份
? ? ? ? first = os.path.join(first_file_name+'/',dictionary[first_file_name][first_rd])

? ? ? ? second_file_name=subfile_list1[rdpair[1]]
? ? ? ? second_rd=random.sample(range(0,len(dictionary[second_file_name])),1)[0]
? ? ? ? # second=os.path.join(loadpath,second_file_name,dictionary[second_file_name][second_rd]) #备份保留的是绝对路径
? ? ? ? second = os.path.join(second_file_name+'/',dictionary[second_file_name][second_rd])
? ? ? ? f.write(first+split+second+split+error_label+"\n")
? ? f.close()

V_S_G("D:\\pycharm\\pytorch-1\\facenet-pytorch-main_aded\\facenet-pytorch-main\\test\\WH_ed_peopele_cleaned_all_masked_AF_Before_aligned")

2,视频处理为图片.py? ?视频处理为一帧帧的图片并保存(根据需要自己稍加修改)

import cv2
import os
import sys
# 读取文件路径,视频文件所在位置
input_path = r"C:\\Users\\12281\\Desktop\\7\\000"
#设定每隔多少帧截取一帧
fram_interval = 1
filenames = os.listdir(input_path)
video_prefix = input_path.split(os.sep)[-1]
#自动建立一个新文件夹,名称为原文件夹名称后加上_frames
frame_path = '{}_frame'.format(input_path)
if not os.path.exists(frame_path):
? ? os.mkdir(frame_path)
cap = cv2.VideoCapture()
for filename in filenames:
? ? filepath = os.sep.join([input_path,filename])
? ? cap.open(filepath)
? ? #获取视频帧数
? ? n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
? ? #若画质低,则略过头帧
? ? #for i in range(42):
? ? ? ? #cap.read()
? ? for i in range(n_frames):
? ? ? ? ret, frame = cap.read()
? ? ? ? #每隔frame_interval帧进行一次截屏操作
? ? ? ? if i % fram_interval == 0:
? ? ? ? ? ? imagename = '{}_{:0>6d}.jpg'.format(filename.split('.')[0], i)
? ? ? ? ? ? imagepath = os.sep.join([frame_path, imagename])
? ? ? ? ? ? print('exported {}!'.format(imagepath))
? ? ? ? ? ? cv2.imwrite(imagepath, frame)
#图片重命名
path="C:\\Users\\12281\\Desktop\\7_frame"
#获取该目录下所有文件,存入列表中
fileList=os.listdir(path)
n=0
m=0
for i in fileList:
? ? #设置旧文件名
? ? oldname=path+ os.sep + fileList[n]
? ? #设置新文件名
? ? newname=path+os.sep +"train"+str(m+1)+".jpg"
? ? os.rename(oldname, newname)
? ? print(oldname, '======>', newname)
? ? n+=1
? ? m+=1
cap.release()

3,批量删除文件名或者重命名文件名、删除文件名中指定的字符、另存为指定的文件后缀名

'''
按文件名进行排序输出“最大”或“最小”文件名字
'''
import os
import cv2
import numpy as np
import PIL.Image as Image

path = 'C:\\Users\\12281\\Desktop\\AFDB_masked_2dian' ?# 文件夹地址
path_save = 'C:\\Users\\12281\\Desktop\\AFDB_masked_2dian'

def fond():
? ? for root, dirs, files in os.walk(path, topdown=False):
? ? ? ? new_root = root.replace(path, path_save) ? ? ? ? ? ? ? ?# 原路径保存
? ? ? ? for name in files: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# dirs:Prints out sub-directories from root.# files 具体文件名字
? ? ? ? ? ? t ? ? ? ? ?= 0
? ? ? ? ? ? file_ext = os.path.splitext(name) ? ? ? ? ? ? ??? ? ? ?# 分离文件前后缀,front为前缀名,ext为后缀名
? ? ? ? ? ? front, ext = file_ext?? ??? ??? ??? ??? ??? ??? ? ? ?# 将前后缀分别赋予front和ext
? ? ? ? ? ? re_name= name.replace('-', '') ? ? ? ? ? ? ? ? ? ? ?# 把减号删除
? ? ? ? ? ? try:


? ? ? ? ? ? ? ? os.rename( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 实现重命名操作
? ? ? ? ? ? ? ? os.path.join(new_root, name),
? ? ? ? ? ? ? ? os.path.join(new_root,re_name ))
? ? ? ? ? ? except: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 报错的话就会执行下面的东西
? ? ? ? ? ? ? ? t= "___"+name
? ? ? ? ? ? ? ? os.rename( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 防止更改后的文件名与先有的文件名重复,这里做个记号 实现重命名操作
? ? ? ? ? ? ? ? ? ? os.path.join(new_root, name),
? ? ? ? ? ? ? ? ? ? os.path.join(new_root, t))


if __name__ == "__main__":
? ? fond()

4,删除失真图片.py? ?批量检查删除失真的图片(本代码是自己论文中用到的,供参考修改)

# "燕山大学机械工程“
# 职业:学生
# 开发时间:2022-08-02 8:36
'''
按文件名进行排序输出“最大”或“最小”文件名字
'''
import os
import cv2
import numpy as np
import PIL.Image as Image

path = 'C:\\Users\\12281\\Desktop\\train_2dian' ?# 文件夹地址
path_save = 'C:\\Users\\12281\\Desktop\\train_2dian'


def fond():
? ? count=0
? ? for root, dirs, files in os.walk(path, topdown=False):
? ? ? ? new_root = root.replace(path, path_save) ?# 原路径保存
? ? ? ? for name in files: ?# dirs:Prints out sub-directories from root.# files 具体文件名字

? ? ? ? ? ? img=cv2.imread(os.path.join(new_root, name))

? ? ? ? ? ? shape= ?img.shape
? ? ? ? ? ? H= ? ? shape[0]
? ? ? ? ? ? W= ? ? shape[1]
? ? ? ? ? ? if W<224 or H<224:
? ? ? ? ? ? ? ? os.remove(os.path.join(new_root, name))
? ? ? ? ? ? ? ? count=count+1
? ? ? ? ? ? ? ? print(count)
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? continue


if __name__ == "__main__":

? ? fond()


5,删除或保留指定格式的文件或者文件夹.py? 批量删除或者检查指定格式的文件或者文件夹或者修改文件的命名方式。

# __Author:Wu
# date: 2019/12/3
# 工具功能:
# 遍历指定文件夹,留下需要的文件(使用后缀名识别),并且删除空文件夹
# 随后删除指定文件夹。(可选)
# 然后把这个文件夹压缩
import os
import sys
import shutil
import zipfile


def fileFilter(dirpath):
? ? for root, dirs, files in os.walk(dirpath):
? ? ? ? for file in files:
? ? ? ? ? ? # 获取文件所属目录
? ? ? ? ? ? # 获取文件路径
? ? ? ? ? ? rFindFileIndex = file.rfind('.')
? ? ? ? ? ? fileExtname = file[rFindFileIndex + 1:]
? ? ? ? ? ? # 删除指定后缀名的文件
? ? ? ? ? ? # if not (fileExtname == 'jpg' or fileExtname == 'png' or fileExtname == 'zip'):
? ? ? ? ? ? if not (fileExtname == 'jpg' or fileExtname == 'png'):
? ? ? ? ? ? ? ? os.remove(os.path.join(root, file))
? ? ? ? ? ? ? ? print('删除不需要的文件' + file)
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? pass
? ? ? ? ? ? # 删除空文件夹
? ? ? ? if not os.listdir(root):
? ? ? ? ? ? print("文件夹" + root + "为空,删除")
? ? ? ? ? ? os.rmdir(root)

? ? ? ? # 删除指定名称的文件夹
? ? ? ? # for roots in root:
? ? ? ? # ? ? if roots == '新建文件夹':
? ? ? ? # ? ? ? ? shutil.rmtree(roots)
? ? ? ? # ? ? ? ? os.mkdir(roots)
? ? print("已留下所需文件")


# 删除空文件夹
def delete_null_dirs(dires):
? ? dirs_list = []
? ? for root, dirs, files in os.walk(dires):
? ? ? ? dirs_list.append(root)
? ? for root in dirs_list[::-1]:
? ? ? ? if not os.listdir(root):
? ? ? ? ? ? print("删除空目录:" + root)
? ? ? ? ? ? os.rmdir(root)


# 压缩文件夹
def zipdir(srcPath, dstname):
? ? workzip = zipfile.ZipFile(dstname, "w", zipfile.ZIP_DEFLATED)
? ? for dirpath, dirs, files in os.walk(srcPath):
? ? ? ? for filename in files:
? ? ? ? ? ? workzip.write(os.path.join(dirpath, filename))
? ? ? ? ? ? print(filename + "压缩完成")
? ? workzip.close


# 获取操作文件夹名称
def direname(dirspath):
? ? finddirIndex = dirpath.split("\\")
? ? global dirname
? ? dirname = finddirIndex[-1]


if __name__ == "__main__":
? ? # dirpath = str(input("请输入要处理的文件夹路径"))
? ? # dirname = ''
? ? #

? ? dirpath = "C:\\Users\\12281\\Desktop\\7"
? ? delete_null_dirs(dirpath)
? ? fileFilter(dirpath)
? ? # direname(dirpath)
? ? # zipdir(dirpath, dirname + ".zip")
? ? print("完成,按任意键退出")
? ? input()

6,损失曲线.py 常用的激活函数曲线绘制代码

import numpy as np
import matplotlib.pyplot as plt
# from vtkmodules.numpy_interface.algorithms import ln
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
# 0 设置字体
from torch import nn

plt.rc('font', family='Times New Roman', size=15)


# 1.1 定义sigmoid函数
def sigmoid(x):
? ? return 1. / (1 + np.exp(-x))


# 1.2 定义tanh函数
def tanh(x):
? ? return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))


# 1.3 定义relu函数
class h_sigmoid(nn.Module):
? ? def __init__(self, inplace=True):
? ? ? ? super(h_sigmoid, self).__init__()
? ? ? ? self.relu = nn.ReLU6(inplace=inplace)

? ? def forward(self, x):
? ? ? ? return self.relu(x + 3) / 6

def relu(x): ? ? ? ? ? ? ? ?# relu6
? ? y=np.where(x < 0, 0, x)
? ? x=np.where(y>6, 6, y)
? ? return x


# 1.4 定义prelu函数
def Leaky_ReLU(x):
? ? return np.where(x < 0, x * 0.5, x)

def Mish(x):
? ? return x * tanh(ln(1 + np.exp(x)))


# 2.1 定义绘制函数sigmoid函数
def plot_sigmoid():
? ? x = np.arange(-10, 10, 0.1)
? ? y = sigmoid(x)
? ? fig = plt.figure() ?# 如果使用plt.figure(1)表示定位(创建)第一个画板,如果没有参数默认创建一个新的画板,如果plt.figure(figsize = (2,2)) ,表示figure 的大小为宽、长
? ? ax = fig.add_subplot(111) ?# 表示前面两个1表示1*1大小,最后面一个1表示第1个
? ? ax.spines['top'].set_color('none') ?# ax.spines设置坐标轴位置,set_color设置坐标轴边的颜色
? ? ax.spines['right'].set_color('none')
? ? ax.spines['left'].set_position(('data', 0))
? ? ax.plot(x, y, color="black", lw=3) ?# 设置曲线颜色,线宽
? ? plt.xticks(fontsize=15) ?# 设置坐标轴的刻度子字体大小
? ? plt.yticks(fontsize=15)
? ? plt.xlim([-10.05, 10.05]) ?# 设置坐标轴范围
? ? plt.ylim([-0.02, 1.02])
? ? plt.tight_layout() ?# 自动调整子图参数
? ? plt.show() ?# 显示绘图


# 2.2 定义绘制函数tanh函数
def plot_tanh():
? ? x = np.arange(-10, 10, 0.1)
? ? y = tanh(x)
? ? fig = plt.figure()
? ? ax = fig.add_subplot(111)
? ? ax.spines['top'].set_color('none')
? ? ax.spines['right'].set_color('none')
? ? ax.spines['left'].set_position(('data', 0))
? ? ax.spines['bottom'].set_position(('data', 0))
? ? ax.plot(x, y, color="black", lw=3)
? ? plt.xticks(fontsize=15)
? ? plt.yticks(fontsize=15)
? ? plt.xlim([-10.05, 10.05])
? ? plt.ylim([-0.02, 1.02])
? ? ax.set_yticks([-1.0, -0.5, 0.5, 1.0])
? ? ax.set_xticks([-10, -5, 5, 10])
? ? plt.tight_layout()
? ? plt.show()


# 2.3 定义绘制函数relu函数
def plot_relu():
? ? x = np.arange(-10, 10, 0.1)
? ? # h_sigmoid
? ? # y = relu(x)
? ? y=h_sigmoid(x)
? ? fig = plt.figure()
? ? ax = fig.add_subplot(111)
? ? ax.spines['top'].set_color('none')
? ? ax.spines['right'].set_color('none')
? ? ax.spines['left'].set_position(('data', 0))
? ? ax.plot(x, y, color="black", lw=3)
? ? plt.xticks(fontsize=15)
? ? plt.yticks(fontsize=15)
? ? plt.xlim([-10.05, 10.05])
? ? plt.ylim([-0.02, 1.02])
? ? ax.set_yticks([2, 4, 6, 8, 10])
? ? plt.tight_layout()
? ? plt.show()


# 2.4 定义绘制函数Leaky_ReLU函数
def plot_Leaky_relu():
? ? x = np.arange(-10, 10, 0.1)
? ? y = Leaky_ReLU(x)
? ? fig = plt.figure()
? ? ax = fig.add_subplot(111)
? ? ax.spines['top'].set_color('none')
? ? ax.spines['right'].set_color('none')
? ? ax.spines['left'].set_position(('data', 0))
? ? ax.spines['bottom'].set_position(('data', 0))
? ? ax.plot(x, y, color="black", lw=3)
? ? plt.xticks(fontsize=15)
? ? plt.yticks(fontsize=15)
? ? plt.tight_layout()
? ? plt.show()


def plot_Mish():
? ? x = np.arange(-10, 10, 0.1)
? ? y = Mish(x)
? ? fig = plt.figure()
? ? ax = fig.add_subplot(111)
? ? ax.spines['top'].set_color('none')
? ? ax.spines['right'].set_color('none')
? ? ax.spines['left'].set_position(('data', 0))
? ? ax.spines['bottom'].set_position(('data', 0))
? ? ax.plot(x, y, color="black", lw=3)
? ? plt.xticks(fontsize=15)
? ? plt.yticks(fontsize=15)
? ? plt.tight_layout()
? ? plt.show()


# 3 运行程序
h_sigmoid=h_sigmoid()
plot_sigmoid()
plot_tanh()
plot_relu()
plot_Leaky_relu()
plot_Mish()

7,批量打印pdF.py? 批量打印PDF

import win32api
import os

if __name__ == '__main__':
? ? path = r"C:\\Users\\12281\\Desktop\\p" ?# 或path =str(input("请输入文件夹的绝对路径"))
? ? files = [path + "\\" + i for i in os.listdir(path)] ?# 获取文件夹下的文件名,并拼接完整路径。

for filename in files:
? ? print(filename)
? ? win32api.ShellExecute(0, "print", filename, None, ".", 0)

'''
参数说明:
"print":选择的操作是打印;
"filename":这里是输入文件名;
"None":这里是打印机的设置,代表使用默认打印机;
".":(无说明)
"0":此参数应设置为0。
'''

8,排序Loss_rank排序.py? ?排序


# 开发时间:2022-07-22 7:05

'''
按文件名进行排序输出“最大”或“最小”文件名字
'''
import os
import numpy as np


# 函数功能为:筛选出文件夹下所有后缀名为.txt的文件
def screen():
? ? path = '/FA3_960_group_cov_first_stride1' ?# 文件夹地址
? ? txt_list = [] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 创建一个空列表用于存放文件夹下所有后缀为.txt的文件名称
? ? file_list = os.listdir(path) ? ? ? ? ? ? ? ? ? ?? ? ?? ?# 获取path文件夹下的所有文件,并生成列表
? ? for i in file_list:
? ? ? ? file_ext = os.path.splitext(i) ? ? ? ? ? ? ??? ?# 分离文件前后缀,front为前缀名,ext为后缀名
? ? ? ? front, ext = file_ext?? ??? ??? ??? ??? ??? ??? ?# 将前后缀分别赋予front和ext

? ? ? ? if ext == '.pth': ? ? ? ? ? ? ? ? ? ? ? ? ??? ??? ?# 判断如果后缀名为.txt则将该文件名添加到txt_list的列表当中去
? ? ? ? ? ? txt_list.append(i)
? ? return txt_list


if __name__ == "__main__":
? ? top=3
? ? # a=[]
? ? txt_list=screen()
? ? val_loss_min= ? txt_list[:] ? ? ? ? ? ? ? ? ? ? ? ? # 列表赋值,注意sort()函数改变原来的列表函数返回值是空值即None
? ? train_loss_min= txt_list[:]
? ? sum_loss_min= ? txt_list[:]
? ? list_pre= ? ? ? txt_list[:]
? ? val_loss_min.sort(key=lambda x: (float(x.split('loss')[2].split('.pth')[0])),reverse=False) ? ? # 不能直接赋值给一个空列表 默认降序
? ? train_loss_min.sort(key=lambda x: (float(x.split('loss')[1].split('-')[0]))) ? ? ? ? ? ? ? ? ? ?# 训练集损失排序升序
? ? sum_loss_min.sort(key=lambda x:(float(x.split('loss')[1].split('-')[0])+float(x.split('loss')[2].split('.pth')[0]))) # 按键进行排序

? ? print("val_loss_min_top%d:\n"%top,val_loss_min[0:top]) ? ? ? # 输出前3个val_loss 最小的三个值
? ? print(('-'*100))
? ? # print(a)
? ? print("train_loss_min_top%d:\n"%top,train_loss_min[0:top])
? ? print(('-' * 100))
? ? print("sum_loss_min_top%d\n"%top,sum_loss_min[0:top])

9,论文图片拼接.py? 将多张图片调整为统一尺寸纵向横向拼接

# "燕山大学机械工程“
# 职业:学生
# 开发时间:2022-07-28 21:55
import cv2
import numpy as np
import os
import numpy as np ?# 数值计算工具包
import cv2 ?# 读取格式是BRG
import os

datasets_path = "C:\\Users\\12281\\Desktop\\6"
desize=(144,256)
list=[]
def cv_show(imge, name):
? ? cv2.imshow(str(name), imge) ?# str(name)需要进行一个字符串的转换
? ? cv2.waitKey(0)
? ? cv2.destroyAllWindows()
if __name__ == "__main__":

? ? types_name = os.listdir(datasets_path)
? ? for id, type_name in enumerate(types_name):
? ? ? ? photos_path = os.path.join(datasets_path, type_name) # 图片的绝对路径
? ? ? ? type_name = cv2.imread(photos_path)
? ? ? ? type_name=cv2.resize(type_name,(112,112))
? ? ? ? list.append(type_name)
? ? t=tuple(list)
? ? result=np.hstack(t)
? ? cv2.imwrite('cd.jpg', result)
? ? cv_show(result,result)

10,加权式双模注意力机制.py 加权式双模注意力机制

# "燕山大学机械工程“
# 职业:学生
# 开发时间:2022-07-25 14:17

import torch
import torch.nn as nn
import math

class h_sigmoid(nn.Module):
? ? def __init__(self, inplace=True):
? ? ? ? super(h_sigmoid, self).__init__()
? ? ? ? self.relu = nn.ReLU6(inplace=inplace)

? ? def forward(self, x):
? ? ? ? return self.relu(x + 3) / 6


class h_swish(nn.Module):
? ? def __init__(self, inplace=True):
? ? ? ? super(h_swish, self).__init__()
? ? ? ? self.sigmoid = h_sigmoid(inplace=inplace)

? ? def forward(self, x):
? ? ? ? return x * self.sigmoid(x)


def conv_bn(inp, oup, stride=1):
? ? return nn.Sequential(
? ? ? ? nn.Conv2d(inp, oup, 3, stride, 1, bias=False),
? ? ? ? nn.BatchNorm2d(oup),
? ? ? ? nn.ReLU6()
? ? )


def conv_dw(inp, oup, stride=1):
? ? return nn.Sequential(
? ? ? ? nn.Conv2d(inp, inp, 3, stride, 1, groups=inp, bias=False),
? ? ? ? nn.BatchNorm2d(inp),
? ? ? ? # nn.ReLU6(),
? ? ? ? h_swish(), ? ? ?# 这里用H-swish 代替relu6

? ? ? ? nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
? ? ? ? nn.BatchNorm2d(oup),
? ? ? ? # nn.ReLU6(), ? #
? ? ? ? h_sigmoid(), ? ?# 这里更换了Relu6()激活函数
? ? )


def conv_3x3_bn(inp, oup, stride):
? ? return nn.Sequential(
? ? ? ? nn.Conv2d(inp, oup, 3, stride, 1, bias=False),
? ? ? ? nn.BatchNorm2d(oup),
? ? ? ? h_swish()
? ? )


def conv_1x1_bn(inp, oup):
? ? return nn.Sequential(
? ? ? ? nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
? ? ? ? nn.BatchNorm2d(oup),
? ? ? ? h_swish()
? ? )

class ChannelAttention(nn.Module): ?# 通道
? ? def __init__(self, in_planes, ratio=4): # ratio 缩放倍率: 这里先设为4 后期参数可以调
? ? ? ? super(ChannelAttention, self).__init__()

? ? ? ? self.conv_dw = conv_dw(inp=in_planes, oup=in_planes, stride=1)

? ? ? ? # self.avg_pool = nn.AdaptiveAvgPool2d(1) ? ? # 通道深度方向全局和最大池化
? ? ? ? # self.max_pool = nn.AdaptiveMaxPool2d(1)

? ? ? ? # 利用1x1卷积代替全连接
? ? ? ? self.fc1 ? = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
? ? ? ? # self.relu1 = nn.ReLU()
? ? ? ? self.fc2 ? = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
? ? ? ? self.h_sigmoid = h_sigmoid()
? ? ? ? # self.sigmoid = nn.Sigmoid()
? ? ? ? self.h_swish = h_swish()

? ? def forward(self, x):
? ? ? ? AC ?= self.conv_dw(x) ?# 通过深度可分离卷积空间维度信息聚合

? ? ? ? # Vm:对AC每个通道求和 作为分母
? ? ? ? Vm ?= torch.sum(AC,dim=2, keepdim=True) ? ? ?# Vm 就是权重向量计算公式的分母
? ? ? ? Vm ?= torch.sum(Vm,dim=3, keepdim=True) ? ?# Vm 就是权重向量计算公式的分母
? ? ? ? # 加权求分母
? ? ? ? Vz ?= AC*x ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 点积
? ? ? ? V ? = torch.div(Vz, Vm) ? ? ? ? ? ? ? ? ? # 得到权重向量
? ? ? ? # 权重向量激活
? ? ? ? Vt1 = self.fc1(V)
? ? ? ? Vt1 = self.h_swish(Vt1)
? ? ? ? Vt2 = self.fc2(Vt1) ? ? ? ? ? ? ? ? ? ? ? # 还原通道
? ? ? ? C ? = self.h_sigmoid(Vt2)
? ? ? ? # 用激活后的权重向量进行对输入特征校准
? ? ? ? return C

class SpatialAttention(nn.Module):
? ? def __init__(self, channel,kernel_size=7):
? ? ? ? super(SpatialAttention, self).__init__()
? ? ? ? self.conv_dw ?= ? conv_dw(inp=channel,oup=channel,stride=1)
? ? ? ? # self.conv_N = nn.Conv2d(in_channels=channel, out_channels=channel, kernel_size=3, stride=1, padding=1, bias=False) ?# 正常卷积 不改变c、w、h 这里可以换为深度可分离卷积
? ? ? ? self.conv_S2 = nn.Conv2d(1, 1, kernel_size=3, stride=2, padding=1, bias=False) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 步长为2的卷积 w、h 都压缩一倍
? ? ? ? self.conv_N2 = nn.Conv2d(1, 1, kernel_size=3, stride=1, padding=1,bias=False) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 正常卷积
? ? ? ? self.relu ? ?= nn.ReLU6() ? # 这里可以改为H-sigmoid
? ? ? ? self.t_conv = nn.ConvTranspose2d(in_channels=1,out_channels=1,stride=2,kernel_size=4, ? # 反卷积
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? padding=1,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? output_padding=0, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 注意这里是2d不是1d
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bias=False
? ? ? ? )
? ? ? ? # self.bn = nn.BatchNorm2d(channel)
? ? ? ? self.h_swish=h_swish()
? ? ? ? # self.Sigmoid = nn.Sigmoid()
? ? ? ? # assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
? ? ? ? # padding = 3 if kernel_size == 7 else 1 ?# padding=int(kernel_size//2)
? ? ? ? # self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False) ?# 输入的是2通道输出是1通道一次卷积
? ? ? ? # self.sigmoid = nn.Sigmoid()
? ? ? ? self.h_sigmoid=h_sigmoid()

? ? def forward(self, x):
? ? ? ? # s = self.conv_N(x)
? ? ? ? A= ?self.conv_dw(x) ? ? ? ? ? ? ? ? ? ? ? ?# 深度可分离卷积,进行通道信息聚合
? ? ? ? # ? ? ? ?s = self.bn(s)
? ? ? ? # s = self.Sigmoid(s) ? ? ? ? ? ? ? ? ? ? ?# s 特征Y注意力池化聚合权重 A

? ? ? ? Sm = torch.sum(A, dim=1, keepdim=True) ? ? # 通道增加的方向进行求和,通道变成1
? ? ? ? Sz = A*x ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 分子 聚合权重A相乘输入特征点积
? ? ? ? sz = torch.sum(Sz, dim=1, keepdim=True)
? ? ? ? TS = torch.div(sz, Sm) ? ? ? ? ? ? ? ? ? ? # 点除与点乘相反
? ? ? ? t = self.conv_S2(TS) ? ? ? ? ? ? ? ? ? ? ? # 步长为2降采样卷积 W,H 缩短一半
? ? ? ? t = self.h_swish(t) ? ? ? ? ? ? ? ? ? ? ? ?# 激活
? ? ? ? t = self.conv_N2(t) ? ? ? ? ? ? ? ? ? ? ? ?# 普通卷积
? ? ? ? t = self.h_swish(t) ? ? ? ? ? ? ? ? ? ? ? ?# h-swish激活
? ? ? ? t = self.t_conv(t) ? ? ? ? ? ? ? ? ? ? ? ? # 上采样卷积
? ? ? ? S= self.h_sigmoid(t) ? ? ? ? ? ? ? ? ? ? ? # 这个就是最终要输出的权重
? ? ? ? return S

class DAC(nn.Module):
? ? def __init__(self, channel, ratio=8, kernel_size=3):
? ? ? ? super(DAC, self).__init__()
? ? ? ? self.channelattention = ChannelAttention(channel, ratio=ratio)
? ? def forward(self, x):
? ? ? ? C = self.channelattention(x)
? ? ? ? return C


class DAS(nn.Module):
? ? def __init__(self, channel, ratio=8, kernel_size=3):
? ? ? ? super(DAS, self).__init__()
? ? ? ? # self.channelattention = ChannelAttention(channel, ratio=ratio)
? ? ? ? self.spatialattention = SpatialAttention(channel,kernel_size=kernel_size)

? ? def forward(self, x):
? ? ? ? # x = x * self.channelattention(x)
? ? ? ? S = self.spatialattention(x)
? ? ? ? return S


class DACS_block(nn.Module):
? ? def __init__(self, channel, ratio=8, kernel_size=7):
? ? ? ? super(DACS_block, self).__init__()
? ? ? ? self.channelattention = DAC(channel, ratio=ratio)
? ? ? ? self.spatialattention = DAS(channel,kernel_size=kernel_size)

? ? def forward(self, x):
? ? ? ? x = x * self.channelattention(x)
? ? ? ? x = x * self.spatialattention(x)
? ? ? ? return x


if __name__ == "__main__":
? ? print("-"*70)
? ? model ? = DACS_block(channel=160)#channel 需要给输入通道的
? ? print(model)
? ? inputs ?= torch.randn(2,160,160,160) ? ?# 正态分布的初始化一个张量4维度
? ? print(inputs)
? ? outputs = model(inputs)
? ? model_dict = model.state_dict()
? ? print(outputs.shape)


11,除水印.py 除图片水印

import cv2
import numpy as np

if __name__ =='__main__':
? ? img_path = "C:\\Users\\12281\\Desktop\\12\\0.jpg"

? ? img1 = cv2.imread(img_path)
? ? cv2.namedWindow('img1',cv2.WINDOW_FREERATIO)
? ? cv2.imshow('img1',img1)

? ? # 转化为 灰度图
? ? gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
? ? # 创建一个白画布
? ? ellipse_img = np.full((img1.shape[0],img1.shape[1],3),0,dtype = np.uint8)
? ? print(ellipse_img.shape,ellipse_img[0][0])
? ? gray = cv2.GaussianBlur(gray,(5,5),0) # 高斯处理
? ? # 应用霍夫圆检测,检测出所有圆
? ? circles = cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,gray.shape[0]/8,100,100,100,0)


? ? # 找到最大的圆
? ? measure = 0.0
? ? x = 0.0
? ? y = 0.0
? ? for circle in (circles[0]):
? ? ? ? if circle[2] > measure:
? ? ? ? ? ? measure = circle[2]
? ? ? ? ? ? x = circle[0]
? ? ? ? ? ? y = circle[1]

? ? # 绘制圆
? ? cv2.circle(img1,(x,y),3,(0,255,0),-1,8,0)
? ? cv2.circle(img1,(x,y),int(measure),(0,255,0),2,8,0)
? ? # 绘制相同大小的圆
? ? ellipse_img = ?cv2.ellipse(ellipse_img,(x,y),(int(measure),int(measure)),0,0,360,(255,255,255),-1,8)
? ? print(f'center x is {x} ,y is {y}, radius is {measure}')
? ? ellipse_img = cv2.cvtColor(ellipse_img,cv2.COLOR_BGR2GRAY)

? ? result = cv2.bitwise_and(gray,ellipse_img)


? ? cv2.namedWindow('bitwise and',cv2.WINDOW_FREERATIO)
? ? cv2.imshow('bitwise and',result)

? ? # 估计圆图像像素强度
? ? x = result[int(x+30)][int(y)]
? ? print(f'intensity is ?{x}')


? ? # 阈值分割
? ? _,ellipse_img = cv2.threshold(result,int(x) - 10,250,cv2.THRESH_BINARY)
? ? # print('ellipse_img shape is {}'.format(ellipse_img.shape))
? ? cv2.namedWindow('threshold',cv2.WINDOW_FREERATIO)
? ? cv2.imshow('threshold',ellipse_img)

? ? # 使用 bitwise_or 方法
? ? print('shape ------------\n')
? ? print(ellipse_img.shape,gray.shape)
? ? res = cv2.bitwise_or(gray,ellipse_img)

? ? cv2.namedWindow('bitwise_or',cv2.WINDOW_FREERATIO)
? ? cv2.imshow('bitwise_or',res)

? ? cv2.waitKey(0)

12,删除指定字符.py 批量修改文件或者文件夹的重命名、按一定的顺序重命名、带序号的命名,以一定的顺序重命名

'''
按文件名进行排序输出“最大”或“最小”文件名字
'''
import os
import cv2
import numpy as np
import PIL.Image as Image

path = 'C:\\Users\\12281\\Desktop\\process0' ?# 文件夹地址
path_save ='C:\\Users\\12281\\Desktop\\process_test'

def fond():
? ? for root, dirs, files in os.walk(path, topdown=False):
? ? ? ? new_root = root.replace(path, path_save) ? ? ? ? ? ? ? ?# 原路径保存
? ? ? ? for name in files: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# dirs:Prints out sub-directories from root.# files 具体文件名字
? ? ? ? ? ? t ? ? ? ? ?= 0
? ? ? ? ? ? file_ext = os.path.splitext(name) ? ? ? ? ? ? ??? ? ? ?# 分离文件前后缀,front为前缀名,ext为后缀名
? ? ? ? ? ? front, ext = file_ext?? ??? ??? ??? ??? ??? ??? ? ? ?# 将前后缀分别赋予front和ext
? ? ? ? ? ? if ext ? != '.jpg':
? ? ? ? ? ? # if front[-1]== '.':
? ? ? ? ? ? ? ? re_name=name[:-4]+".jpg"
? ? ? ? ? ? ? ? try:
? ? ? ? ? ? ? ? ? ? os.rename( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 实现重命名操作
? ? ? ? ? ? ? ? ? ? os.path.join(new_root, name),
? ? ? ? ? ? ? ? ? ? ? ? os.path.join(new_root,re_name ))
? ? ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 报错的话就会执行下面的东西
? ? ? ? ? ? ? ? ? ? t= "_"+name
? ? ? ? ? ? ? ? ? ? os.rename( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 防止更改后的文件名与先有的文件名重复,这里做个记号 实现重命名操作
? ? ? ? ? ? ? ? ? ? ? ? os.path.join(new_root, name),
? ? ? ? ? ? ? ? ? ? ? ? os.path.join(new_root, t))


if __name__ == "__main__":
? ? fond()

另一个


'''
按文件名进行排序输出“最大”或“最小”文件名字
'''
import os
import cv2
import numpy as np
import PIL.Image as Image

path = 'C:\\Users\\12281\\Desktop\\test' ?# 文件夹地址
path_save = 'C:\\Users\\12281\\Desktop\\test'

def fond():
? ? for root, dirs, files in os.walk(path, topdown=False):
? ? ? ? new_root = root.replace(path, path_save) ? ? ? ? ? ? ? ?# 原路径保存
? ? ? ? for name in files: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# dirs:Prints out sub-directories from root.# files 具体文件名字
? ? ? ? ? ? file_ext = os.path.splitext(name) ? ? ? ? ? ? ??? ? ? ?# 分离文件前后缀,front为前缀名,ext为后缀名
? ? ? ? ? ? front, ext = file_ext?? ??? ??? ??? ??? ??? ??? ? ? ?# 将前后缀分别赋予front和ext
? ? ? ? ? ? if front== 'unmasked':
? ? ? ? ? ? ? ? n=len(files)-1
? ? ? ? ? ? ? ? t ? = str(n)+".jpg"
? ? ? ? ? ? ? ? try:
? ? ? ? ? ? ? ? ? ? os.rename( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 实现重命名操作
? ? ? ? ? ? ? ? ? ? os.path.join(new_root, name),
? ? ? ? ? ? ? ? ? ? ? ? os.path.join(new_root, t))
? ? ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 报错的话就会执行下面的东西
? ? ? ? ? ? ? ? ? ? t= ? "_"+t
? ? ? ? ? ? ? ? ? ? os.rename( ?# 实现重命名操作
? ? ? ? ? ? ? ? ? ? ? ? os.path.join(new_root, name),
? ? ? ? ? ? ? ? ? ? ? ? os.path.join(new_root, t))


if __name__ == "__main__":
? ? fond()

删除或保留指定格式的文件或者文件夹.py保留文件名中包含有指定字符的文件夹



'''
按文件名进行排序输出“最大”或“最小”文件名字
'''
import os
import cv2
import numpy as np
import PIL.Image as Image
import shutil

path = 'C:\\Users\\12281\\Desktop\\CASIA_masked' ?# 文件夹地址
path_save = 'C:\\Users\\12281\\Desktop\\CASIA_masked'


def fond():
? ? count=0
? ? for root, dirs, files in os.walk(path, topdown=False):
? ? ? ? for dir in dirs: ?# dirs:Prints out sub-directories from root.# files 具体文件名字
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? if dir.split("_")[1] == "mk":
? ? ? ? ? ? ? ? ? ? pass
? ? ? ? ? ? except:
? ? ? ? ? ? ? ? # os.remove(os.path.join(root, dir)) ? ?# 这个只能删除某个文件
? ? ? ? ? ? ? ? # os.remove –删除文件。
? ? ? ? ? ? ? ? # os.rmdir –删除文件夹。
? ? ? ? ? ? ? ? # shutil.rmtree –删除目录及其所有内容。
? ? ? ? ? ? ? ? shutil.rmtree(os.path.join(root, dir)) ?# 删除文件夹极其内部的文件
? ? ? ? ? ? ? ? count = count + 1
? ? ? ? ? ? ? ? pass
? ? print(count)

if __name__ == "__main__":

? ? fond()
13,com串口_test.py STM32单片机串口 与电脑上位机连接通讯的代码

#!/usr/bin/python
# encoding:utf-8
#
import time
import serial
import serial.tools.list_ports

plist = list(serial.tools.list_ports.comports()) ? ?# 使用此方法得到可用的usb口数据,把是串口的输出成列表
if len(plist) <= 0: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 如果输出的列表是空的说明没有打开任何串口
? ? print("没有发现端口!")
else:
? ? plist_0 = list(plist[0])
? ? print(plist)
serialName = plist_0[0]
print("可用端口名>>>",serialName)
ser = serial.Serial(serialName, 9600, 8, 'N', 1) ? ?# 设置了第一个串口号,波特率 数据位 奇偶校验 停止位
while True:
? ? ser.write('A'.encode()) ? ? ? ? ? ? ? ? ? ? ? ? # 向串口内写入数据'A' 两位数分别对应了单片机的两个
? ? count = ser.inWaiting() ? ? ? ? ? ? ? ? ? ? ? ? # 当没有数据传回电脑时,程序顺序执行到此处进行等待
? ? if count > 0:
? ? ? ? recive = ser.read(count) ? ? ? ? ? ? ? ? ? ?# 电脑读取单片机回传数据的方法
? ? ? ? if len(recive)==5: ? ? ? ? ? ? ? ? ? ? ? ? ?# 如果检测成果则就开始执行下面进入到编码和识别阶段
? ? ? ? ? ? print("识别成功")
? ? ? ? print(recive)
? ? time.sleep(0.8) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 延时操作,程序顺序等待0.2秒
? ? print("success")
? ? # ser.write('01\r\n'.encode()) ?# 1代表电量,0代表熄灭
? ? # time.sleep(0.2)

# !/usr/bin/python
# encoding:utf-8
#
# import serial
# import serial.tools.list_ports
#
# """查看可用串口操作"""
# plist = list(serial.tools.list_ports.comports())
# if len(plist) <= 0:
# ? ? print("没有发现端口!")
# else:
# ? ? plist_0 = list(plist[0])
# ? ? serialName = plist_0[0]
# ? ? # serialFd = serial.Serial(serialName, 9600, timeout=60)
# ? ? print("可用端口名>>>", serialName)
#
# '''电脑接收数据'''
#
# def recive_serial():
# ? ? ser = serial.Serial(serialName, 9600, 8, 'N', 1) ?# 设置了第一个串口号,波特率,读超时设置
# ? ? # ser.open()
# ? ? while True:
# ? ? ? ? # ser.write('10\r\n'.encode())
# ? ? ? ? count = ser.inWaiting() ? ? ? ?# 当没有数据传回电脑时,程序顺序执行到此处进行等待
# ? ? ? ? if count > 0:
# ? ? ? ? ? ? recive = ser.read(count) ? # 电脑读取单片机回传数据的方法
# ? ? ? ? ? ? # if recive == b'01\r\n': ?# 没有经过处理,直接硬骇识别
# ? ? ? ? ? ? if len(recive) == 2: ? ? ? # 如果检测成果则就开始执行下面进入到编码和识别阶段
# ? ? ? ? ? ? ? ? print("识别成功")
# ? ? ? ? ? ? print(recive)
# recive_serial()

另一个

import serial


# 串口打开函数
def open_ser():
? ? port = 'COM7' ?# 串口号
? ? baudrate = 115200 ?# 波特率
? ? try:
? ? ? ? global ser
? ? ? ? ser = serial.Serial(port, baudrate, timeout=2)
? ? ? ? if ser.isOpen() == True:
? ? ? ? ? ? print("串口打开成功")
? ? except Exception as exc:
? ? ? ? print("串口打开异常", exc)


# 数据发送
def send_msg():
? ? try:
? ? ? ? send_datas = input("请输入要发送的数据:\n")
? ? ? ? ser.write(str(send_datas + '\r\n').encode("gbk"))
? ? ? ? print('-' * 80)
? ? ? ? print("已发送数据:")
? ? ? ? print(send_datas)
? ? ? ? print('-' * 80)
? ? ? ? # send_datas1 = 875
? ? ? ? # ser.write(str(send_datas1).encode("gbk"))
? ? ? ? # print("已发送数据:", send_datas1)
? ? except Exception as exc:
? ? ? ? print("发送异常", exc)


# 接收数据
def read_msg():
? ? try:
? ? ? ? print("等待接收数据......")
? ? ? ? while True:
? ? ? ? ? ? data = ser.read(ser.in_waiting).decode('gbk')
? ? ? ? ? ? if data != '':
? ? ? ? ? ? ? ? break
? ? ? ? print('-' * 80)
? ? ? ? print("已接受到数据:")
? ? ? ? print(data)
? ? ? ? print('-' * 80)
? ? except Exception as exc:
? ? ? ? print("读取异常", exc)


# 关闭串口
def close_ser():
? ? try:
? ? ? ? ser.close()
? ? ? ? if ser.isOpen():
? ? ? ? ? ? print("串口未关闭")
? ? ? ? else:
? ? ? ? ? ? print("串口已关闭")
? ? except Exception as exc:
? ? ? ? print("串口关闭异常", exc)


if __name__ == '__main__':
? ? ser = None
? ? open_ser() ?# 打开串口

? ? while 1:
? ? ? ? print('----------请选择你要进行的操作----------')
? ? ? ? print('---1:发送数据--2:接收数据--3:关闭串口---')
? ? ? ? op = input('请输入:')
? ? ? ? if op == '1':
? ? ? ? ? ? send_msg() ?# 写数据
? ? ? ? if op == '2':
? ? ? ? ? ? read_msg() ?# 读数据2
? ? ? ? if op == '3':
? ? ? ? ? ? close_ser() ?# 关闭串口
? ? ? ? ? ? break

14,picture2mp4.py图片按一定的顺序转合成为MP4

import numpy as np
import cv2
import os

# 1.每张图像大小
size = (2500, 1900)
print("每张图片的大小为({},{})".format(size[0], size[1]))
# 2.设置源路径与保存路径
src_path ='C:\\Users\\12281\\Desktop\\7\\0.0\\'
sav_path ='C:\\Users\\12281\\Desktop\\7\\organoid4.mp4'
# 3.获取图片总的个数
all_files = os.listdir(src_path)
index = len(all_files)
print("图片总数为:" + str(index) + "张")
# 4.设置视频写入器
fourcc = cv2.VideoWriter_fourcc(*'mp4v') ?# MP4格式
# 完成写入对象的创建,第一个参数是合成之后的视频的名称,第二个参数是可以使用的编码器,第三个参数是帧率即每秒钟展示多少张图片,第四个参数是图片大小信息
videowrite = cv2.VideoWriter(sav_path, fourcc, 2, size) ?# 2是每秒的帧数,size是图片尺寸
# 5.临时存放图片的数组
img_array = []

# 6.读取所有jpg格式的图片 (这里图片命名是0-index.jpg example: 0.jpg 1.jpg ...)
for filename in [src_path + r'{0}.jpg'.format(i) for i in range(0, index)]:
? ? img = cv2.imread(filename)
? ? if img is None:
? ? ? ? print(filename + " is error!")
? ? ? ? continue
? ? img_array.append(img)
# 7.合成视频
for i in range(0, index):
? ? img_array[i] = cv2.resize(img_array[i], (2500, 1900))
? ? videowrite.write(img_array[i])
? ? print('第{}张图片合成成功'.format(i))
print('------done!!!-------')

15,摄像头黑屏遮挡检测 (摄像头被遮挡就会被检测到”可以触发报警“)
# 开发时间:2023-03-24 20:59
import numpy as np
import cv2
from PIL import Image, ImageDraw, ImageFont

if __name__ == '__main__':
? ? cap = cv2.VideoCapture(0)
? ? cap.set(3, 112)
? ? cap.set(4, 112)
? ? # cv2.namedWindow('test_cam', cv2.WINDOW_NORMAL) ?# 窗口大小可设置

? ? def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):
? ? ? ? if (isinstance(img, np.ndarray)): ?# 判断是否OpenCV图片类型
? ? ? ? ? ? img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
? ? ? ? # 创建一个可以在给定图像上绘图的对象
? ? ? ? draw = ImageDraw.Draw(img)
? ? ? ? # 字体的格式
? ? ? ? fontStyle = ImageFont.truetype(
? ? ? ? ? ? "simsun.ttc", textSize, encoding="utf-8")
? ? ? ? # 绘制文本
? ? ? ? draw.text(position, text, textColor, font=fontStyle)
? ? ? ? # 转换回OpenCV格式
? ? ? ? return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

? ? while True:
? ? ? ? ret, frame = cap.read() ?# 读取视频

? ? ? ? if ret is False: ?# 当所有帧读取完毕后退出循环
? ? ? ? ? ? print('视频读取失败 or 视频读取完毕')
? ? ? ? ? ? break
? ? ? ? s=np.var(frame)
? ? ? ? v=np.mean(frame)
? ? ? ? if s<=2000:
? ? ? ? ? ? # pass
? ? ? ? ? ? frame = cv2AddChineseText(frame, "已遮挡!!!", (10, 20), ?(255, 0, 0), 100)
? ? ? ? print(s)
? ? ? ? # print(v)
? ? ? ? # frame = cv2.putText(frame, "s= %.2f" % (fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) ?# 1指1号字

? ? ? ? cv2.imshow("video", frame) ?# p 重复一帧帧的显示
? ? ? ? c = cv2.waitKey(1) & 0xff ?# p cv2.waitkey(1)返回值为-1, 参数为0 按任意键跳出等待 esc 的asii为27 谁个0xff与都是谁
? ? ? ? if c == 27:
? ? ? ? ? ? cap.release()
? ? ? ? ? ? break
? ? print("Video Detection Done!")

文章来源:https://blog.csdn.net/P13643822101/article/details/135733108
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。