Python3.6.6 OpenCV 将视频中人物标记或者打马赛克或加图片并保存为不同格式

1、轻松识别视频人物并做出标记

需安装face_recongnition与dlib,过程有点困难,还请网上查找方法

import face_recognition
import cv2
#镜像源 -i https://pypi.mirrors.ustc.edu.cn/simple 
# 加载视频
video_file = 'E:\\videos\\1.mp4'
video_capture = cv2.VideoCapture(video_file)width = int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(video_capture.get(cv2.CAP_PROP_FPS))
frame_count = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT))# 设置视频格式
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 调用VideoWrite()函数
size = (int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
video_writer = cv2.VideoWriter('output1.avi', fourcc, fps, size)count = 0 
# 通过循环读取视频的每一帧
while True and count < 200:ret, frame = video_capture.read()# 如果正确读取帧,ret为Trueif not ret:break# 将帧转换为灰度图像,因为人脸识别对颜色不敏感gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 使用face_recognition库的API进行人脸定位face_locations = face_recognition.face_locations(gray_frame)# 遍历所有找到的人脸for top, right, bottom, left in face_locations:# 画出人脸框cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)# 显示帧#cv2.imshow('Video', frame)if not video_writer is False:video_writer.write(frame)count = count + 1# 按'q'退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放视频捕获对象
video_capture.release()
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()

实现效果

2、实现视频人物加图,代码如下

import cv2
import numpy as np
import face_recognition
from PIL import Image # 加载视频
cap = cv2.VideoCapture('E:\\videos\\1.mp4')# 图片加密马赛克
def apply_mosaic(frame, mosaic_image, x, y, w, h):#print(mosaic_image.shape)mosaic_image = cv2.resize(mosaic_image, (w, h))#print(mosaic_image.shape)#cv2.imwrite('1.png',mosaic_image)#roi = frame[y:y+h, x:x+w]image_np = np.array(mosaic_image)#print(mosaic_image.shape)#print(frame.shape)#frame[y:y+h, x:x+w] = image_np#cv2.addWeighted(mosaic_image, 0, roi, 1, 0)for i in range(h):for j in range(w):#if(y+i<frame_height and x+j<frame_width):frame[x+i, y+j] = image_np[i, j]
# 加载图片
mosaic_image = cv2.imread('masaike.png')# 读取视频的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 设置马赛克的位置和大小
x, y, w, h = 50, 50, 100, 100# 写入视频
#out = cv2.VideoWriter('output_video.avi', cv2.VideoWriter_fourcc(*'XVID'), 20.0, (frame_width, frame_height))width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 设置视频格式
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 调用VideoWrite()函数
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
video_writer = cv2.VideoWriter('output2.avi', fourcc, fps, size)count = 0 while cap.isOpened() and count < 250:ret, frame = cap.read()if ret and count > 50:# 将帧转换为灰度图像,因为人脸识别对颜色不敏感gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 使用face_recognition库的API进行人脸定位face_locations = face_recognition.face_locations(gray_frame)# 遍历所有找到的人脸for top, right, bottom, left in face_locations:# 画出人脸框#cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)# 应用马赛克apply_mosaic(frame, mosaic_image, top, left, abs(top-bottom), abs(right-left))# 输出帧video_writer.write(frame)count = count + 1# 显示帧#cv2.imshow('Video', frame)# 按 'q' 退出循环if cv2.waitKey(1) & 0xFF == ord('q'):breakelif count >= 250:breakcount = count + 1# 释放资源
cap.release()
video_writer.release()
cv2.destroyAllWindows()

实现效果如下

至此完成,谢谢阅读 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt下使用OpenCV的鼠标回调函数进行圆形/矩形/多边形的绘制

文章目录 前言一、设置imshow显示窗口二、绘制圆形三、绘制矩形四、绘制多边形五、示例完整代码总结 前言 本文主要讲述了在Qt下使用OpenCV的鼠标回调在OpenCV的namedWindow和imshow函数显示出来的界面上进行一些图形的绘制&#xff0c;并最终将绘制好的图形显示在QLabel上。示…

UE4 解决创建布料报错:三角形退化

**【问题】**创建创建布料时报错&#xff1a;三角形退化 【方法】 1.要重新绑定&#xff1a;导入到ue4为静态网格体&#xff0c;勾选“移除退化”&#xff0c;再导出fbx&#xff0c;再重新绑定 2.不用重新绑定&#xff1a;使用排除法&#xff08;费时&#xff09;&#xff0c…

全栈物联网项目:结合 C/C++、Python、Node.js 和 React 开发智能温控系统(附代码示例)

1. 项目概述 本文详细介绍了一个基于STM32微控制器和AWS IoT云平台的智能温控器项目。该项目旨在实现远程温度监控和控制,具有以下主要特点: 使用STM32F103微控制器作为主控芯片,负责数据采集、处理和控制逻辑采用DHT22数字温湿度传感器,精确采集环境温湿度数据通过ESP8266 W…

js播放mp3,并且读取srt字幕文件,展示字幕

下面是gpt生成的代码&#xff0c;能跑&#xff0c;但是性能gpt是不考虑的&#xff0c;自行斟酌 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>MP3播放器</title> </head> <body><h1>MP3播放器…

Mac和VirtualBox Ubuntu共享文件夹

1、VirtualBox中点击设置->共享文件夹 2、设置共享文件夹路径和名称&#xff08;重点来了&#xff1a;共享文件夹名称&#xff09; 3、保存设置后重启虚拟机&#xff0c;执行下面的命令 sudo mkdir /mnt/share sudo mount -t vboxsf share /mnt/share/ 注&#xff1a;shar…

Leetcode-203-移除链表元素-临时变量作用域-c++

题目详见https://leetcode.cn/problems/remove-linked-list-elements/ 题解代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullpt…

你需要知道的笔记本养护的几个小知识

笔记本充电器可以长期不拔吗&#xff1f; 可以&#xff0c;但建议偶尔使用电池激发电池活性并且修正电量计精度&#xff1b; 当充电器接入后&#xff0c;笔记本会优先使用充电器进行供电而不会使用电池供电&#xff0c;同时充电器也会为缺电的电池补充电量。 现在笔记本电脑普遍…

大数据开发中的数据驱动决策:关键问题与实践指南

目录 决策前的准备工作1. 我已经掌握了哪些信息&#xff1f;2. 我们已经做出决定了吗&#xff1f;3. 我们需要哪些额外信息以及何时需要&#xff1f; 决策过程中的关键问题1. 我们需要做这个决定吗&#xff1f;2. 错误地做出这个决定的代价是什么&#xff1f; 决策后的反思1. 我…

分布式系统—Ceph对象存储系统(RGW接口)

一、对象存储概念 对象存储&#xff08;object storage&#xff09;是非结构数据的存储方法&#xff0c;对象存储中每一条数据都作为单独的对象存储&#xff0c;拥有唯一的地址来识别数据对象&#xff0c;通常用于云计算环境中。不同于其他数据存储方法&#xff0c;基于对象的…

web黑马课总结笔记(持续更新)

web学习笔记 jsjs引入方式内部脚本&#xff1a;将js代码定义在html界面中外部脚本&#xff1a;将js代码定义在外部js文件中&#xff0c;然后引入到html页面中 js的三种输出 js js是一门跨平台&#xff0c;面向对象的脚本语言。是用来控制网页行为时代的&#xff0c;它能使网页…

《Python零基础入门》——关于PyCharm使用技巧及python基本概念

从本次文章开始&#xff0c;我们将学习一门新的编程语言——Python。作为最热门的编程语言&#xff0c;Python相对比较清晰、简单。 python主要的编译工具就是pycharm&#xff0c;关于pycharm的安装及python配置环境&#xff0c;大家可自行参考网络上的教程&#xff0c;本文不…

# Redis 入门到精通(一)数据类型(4)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;4&#xff09; 一、redis 数据类型–sorted_set实现时效性任务管理 1、sorted_set 类型数据操作的注意事项 score 保存的数据存储空间是64位&#xff0c;如果是整数范围是-9007199254740992~9007199254740992…

python的seek()和tell()

seek() seek() 是用来在文件中移动指针位置的方法。它的作用是将文件内部的当前位置设置为指定的位置。 seek(offset, whence) 参数说明 offset: 这是一个整数值&#xff0c;表示相对于起始位置的偏移量。如果是正数&#xff0c;表示向文件末尾方向移动&#xff1b;如果是负…

volatile关键字的作用java

1.内存可见性 当一个变量被声明volatile时,它会保证被修改的值被立刻更新到主内存中,不会优化到寄存器或缓存中 2.禁止指令重排序 针对被volatile修饰的变量的读写相关指令,是不能被重新排序的 代码演示 class Counter{public int flag; } public class Thread3 {public stati…

QT creator与VS2019 QT加载模块方法

QT creator与VS2019加载模块方法 QT creator&#xff0c;pro文件添加 VS2019 QT

酷克数据亮相第13届PostgreSQL中国技术大会,获数据库杰出贡献奖

7 月 12 日&#xff0c;第 13 届 PostgreSQL 中国技术大会在杭州盛大开幕。本次大会以“聚焦云端创新&#xff0c;汇聚智慧共享”为主题&#xff0c;邀请了国内外 PG 领域众多行业大咖、学术精英及技术专家&#xff0c;共同探讨数据库领域的发展趋势、技术创新和实践经验。酷克…

每天一个数据分析题(四百二十六)- 总体方差

为了比较两个总体方差&#xff0c;我们通常检验两个总体的() A. 方差差 B. 方差比 C. 方差乘积 D. 方差和 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#xff0c;SQL&#xff0c;统计学&a…

[Vulnhub] Tr0ll3 aircrack-ng+lynx

信息收集 IP AddressOpening Ports192.168.101.147TCP:22 $ ssh start192.168.101.147 用户:Start startTr0ll3:~$ find / -type f -perm 0777 2>/tmp/1 startTr0ll3:~$ cat /var/log/.dist-manage/wytshadow.cap | nc 192.168.101.128 10035 WIFI握手包 aircrack-ng 破…

mysql快速精通(四)多表查询

主打一个实用 一. 连接查询 交叉连接 交叉连接返回两个表的笛卡尔积&#xff0c;即每个表的每一行与另一个表的每一行组合 语法: SELECT *FROM table1 CROSS JOIN table2;内连接 查询两张表都存在的数据&#xff0c;即排除两张表的未匹配部分 语法: SELECT 字段名 FROM 左表 IN…

记一次 .NET某上位视觉程序 离奇崩溃分析

一&#xff1a;背景 1. 讲故事 前段时间有位朋友找到我&#xff0c;说他们有一个崩溃的dump让我帮忙看下怎么回事&#xff0c;确实有太多的人在网上找各种故障分析最后联系到了我&#xff0c;还好我一直都是免费分析&#xff0c;不收取任何费用&#xff0c;造福社区。 话不多…