OpenCV 玩转图像和视频

news2025/1/16 5:59:42

为什么学OpenCV?

• OpenCV ⽀持对图像缩放、旋转、绘制⽂字图形等基础操作
• OpenCV 库包含了很多计算机视觉领域常⻅算法:⽬标检测、⽬标跟踪等

OpenCV 简介

• OpenCV (Open Source Computer Vision) 是计算机视觉和机器学习软件库
• Intel 1999年 创建,⽤C++语⾔编写(提供了Python、Ruby、MATLAB等接⼝)

• 安装 OpenCV
• OpenCV 读取、缩放、翻转、写⼊图像
• OpenCV 在图像上绘制⽂字、⼏何图形
• OpenCV 视频操作

安装:
conda install -c conda-forge opencv
conda install opencv(换源后)

pip install opencv-python
检查是否安装成功:
$ Python
>>> import cv2
>>> cv2.version
‘4.5.4’

Notebook 演示

OpenCV 基本处理

导入相关的库

import numpy as np
import pandas as pd
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

查看opencv的版本

cv2.__version__

读取照片

img = cv2.imread("./img/cat.jpg") #即使图片的路径不存在也不会进行报错

展示图片

plt.imshow(img)

图片的存取的形式
opencv B G R
matplotlib R G B
将opencv转化为matplotlib的形式

img_fixed = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

灰度图的形式展现

plt.imshow(img_gray,cmap="gray")

改变img的大小

img_resize = cv2.resize(img_fixed,(1000,300))

图像的翻转

#0代表垂直翻转,1代表水平翻转,-1水平垂直都翻转
img_flip = cv2.flip(img_fixed,-1)

将RGB转化为BGR的格式

img_save = cv2.cvtColor(img_flip,cv2.COLOR_RGB2BGR) #将RGB转化为BGR的格式

保存BGR形式的图片

cv2.imwrite('./img_flip.jpg',img_save)

opencv 绘制文字和几何图形

导入包

# 导入包
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
%matplotlib inline

创建一个空白的图像

black_img = np.zeros(shape = (800,800,3),dtype = np.int16)

查看空白图像的类型

black_img.shape

在这里插入图片描述展示图片

plt.imshow(black_img)

在这里插入图片描述使用opencv画矩形

# 使用opencv画矩形
cv2.rectangle(img = black_img,pt1 = (100,100),pt2 = (400,300),color = (0,255,0),thickness = 10)
# 使用opencv画矩形
cv2.rectangle(img = black_img,pt1 = (100,100),pt2 = (400,300),color = (0,255,0),thickness = 10)

使用opencv画一个圆

# 利用opencv画一个圆
cv2.circle(img = black_img,center=(400,400),radius = 100,color=(0,0,255),thickness = 10)
# 画一个实心的圆
cv2.circle(img = black_img,center=(400,600),radius = 100,color=(0,0,255),thickness = -1)

opencv画一条线

# opencv 画一条线
cv2.line(img=black_img,pt1=(0,0),pt2=(800,800),color=(255,0,255),thickness=10)

opencv添加一段文字

# opencv添加一段文字
font = cv2.FONT_HERSHEY_PLAIN#导入字体
cv2.putText(img=black_img,text="python",org=(500,150),fontFace=font,fontScale=4,color=(255,0,255),thickness=5,lineType=cv2.LINE_AA)

opencv画多边形

#利用opencv画多边形
black_img = np.zeros(shape=(800,800,3),dtype=np.int16)
points = np.array([[400,100],[200,300],[400,700],[600,300]],dtype=np.int32)
pts = points.reshape(-1,1,2)
cv2.polylines(img=black_img,pts=[pts],isClosed=True,color=(255,0,0),thickness=10,lineType=cv2.LINE_AA)
plt.imshow(black_img)

注意opencv画图形是在opencv图像上画的(也就是BGR的形式)

opencv的小例子

demo1.py

"""
opencv显示图像
"""

# 导入opencv
import cv2
import numpy as np

# 读取图片
img = cv2.imread("./img/cat.jpg")

# 显示图片
# cv2.imshow('Demo',img)]

while True:
    # 一直显示
    cv2.imshow('Demo', img)

    # 如果等待至少10ms,并且用户按了ESC键(ord('q))
    if cv2.waitKey(10) & 0xFF == ord('q'):
    # if cv2.waitKey(10) & oxFF == 27:
        break

# 关闭所有的窗口
cv2.destroyAllWindows()

demo2.py

"""
OpenCV读取摄像头视频流,并显示
类似demo1.py中的显示图片
"""

# 导入OpenCV
import cv2

# 使用VideoCapture,读取默认摄像头,后面的数字表示摄像头的编号,如果有多个摄像头可以换成其他数字
cap = cv2.VideoCapture(0)

# 再使用cap.read()读取视频流,类似照片,他会以一帧帧的图片返回,所以我们需要用一个循环语句来一直获取
while True:
    # 返回的是元组
    ret,frame = cap.read() #frame就是一帧帧的图片

    # 这里可以把frame 就当成图片来处理
    # 镜像
    frame = cv2.flip(frame,1)
    # 颜色变为灰度
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    # 显示图像
    cv2.imshow('demo',gray)

    # 退出条件: ESC
    if cv2.waitKey(10) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
    

demo3.py

"""
OpenCV读取摄像头视频流,并存储为MP4文件
"""

# 导入OpenCV
import cv2

# 读取默认摄像头
cap = cv2.VideoCapture(0)

 
# https://docs.opencv.org/4.x/dd/d43/tutorial_py_video_display.html
# 

fps = 20
width = int( cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int( cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 

# 这里使用OpenCV的VideoWriter方法来,我们看一下官网他是如何使用的
# 可以看到第一个参数是文件名,然后是fourcc编码,然后是FPS帧率,再是画面大小
# 这里需要注意的是Fourcc编码,我们再看一下文档,可以看到
# Windows系统建议用DIVX编码
# macOS系统建议永MJPG、DIVX、X264
# 推荐用 X264、DIVX,一般macOS和Windows都试用
# 写法需要注意*'X264'
#

# FPS 帧率一般根据摄像头的帧率来填写,比如我的是20
# 高度、宽度可以自定义,不过我们也可以直接和原画面一样,使用cap.get方法获取

writer = cv2.VideoWriter('./myDemoVideo.mp4',cv2.VideoWriter_fourcc(*'X264'),fps,(width,height))

while True:
    # 读取视频
    ret,frame = cap.read()
    
    
    # 这里可以把frame 就当成图片来处理
    # 镜像
    frame = cv2.flip(frame,1)
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    
    # 写入画面
    writer.write(frame)

    # 显示图像
    cv2.imshow('demo',gray)

    # 退出条件: ESC
    if cv2.waitKey(10) & 0xFF == 27:
        break
    
# 释放句柄    
writer.release()
cap.release()
cv2.destroyAllWindows()
    

demo4.py

"""
OpenCV读取mp4视频文件
"""

# 导入OpenCV
import cv2
import time

# 还是使用cv2.VideoCapture,只不过参数可以换成文件名,我们读取前面保存的MP4视频
cap = cv2.VideoCapture('./vedio/myDemoVideo.mp4')

# 首先加一个判断,如果文件不存在或编码错误提示
if not cap.isOpened():
    print('文件不存在或编码错误')

while cap.isOpened():
    # 读取帧
    
    ret,frame = cap.read() #retbool判断是否读取成功

    if ret:
        # 显示
        cv2.imshow('demo',frame)

        # 降低显示速度(不加这行会显示得特别快)
        time.sleep(1/20)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    else:
        break


cap.release()
cv2.destroyAllWindows()

demo5.py

"""
Opencv在视频流上添加文字和图形
"""
# 导入Opencv模块
import cv2
import numpy as np
import time

#导入自定义模块
import drawUtils

#读取摄像头
cap = cv2.VideoCapture(0)

# 当前时间Unix时间戳
start_time = time.time()

while True:
    ret,frame = cap.read()#frame其实就是一帧帧的画面

    #对frame进行操作
    frame = cv2.flip(frame,1)#绕y轴旋转

    #print(type(frame))#打印frame的类型



    #画一个矩形
    cv2.rectangle(frame,(20,200),(120,300),(255,0,255),10)
    now = time.time()#当前时间
    fps_text = int(1/(now -start_time))#帧率,每秒处理的图片数量
    start_time = now#开始时间重新归零

    print(fps_text)

    frame_text = "帧率:" + str(fps_text)

    #显示帧率
    frame = drawUtils.cv2AddChineseText(frame,frame_text,(20,50),(0,255,255),30)
    #显示画面
    cv2.imshow('Demo',frame)
     
    #退出条件
    if cv2.waitKey(10) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

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

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

相关文章

特殊数字专题

特殊数字 1.奇数2.偶数3.完数4.素数5.回文数6.水仙花数7.中位数9.随机数11.求年份&#xff1a;闰年12.求数字&#xff1a;两个整数的最大公约数及最小公倍数 1.奇数 代码案例&#xff1a; //输出所有1-1000之间的奇数 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h&…

Java虚拟机(JVM):虚拟机栈溢出

一、概念 Java虚拟机栈溢出&#xff08;Java Virtual Machine Stack Overflow&#xff09;是指在Java程序中&#xff0c;当线程调用的方法层级过深&#xff0c;导致栈空间溢出的情况。 Java虚拟机栈是每个线程私有的&#xff0c;用于存储方法的调用和局部变量的内存空间。每当…

Java二分法查找

二分法&#xff1a;首先需要一个由小到大排序好的数组&#xff0c;先找到其中间值&#xff0c;然后进行比较如果比较中间值大的话则向前找。如果比要找的小&#xff0c;则向后找。 代码实现&#xff1a; //定义查询方法 public static int searchTarget(int[] nums, int targ…

用户新增预测(Datawhale机器学习AI夏令营第三期)

文章目录 简介任务1&#xff1a;跑通Baseline实操并回答下面问题&#xff1a;如果将submit.csv提交到讯飞比赛页面&#xff0c;会有多少的分数&#xff1f;代码中如何对udmp进行了人工的onehot&#xff1f; 任务2.1&#xff1a;数据分析与可视化编写代码回答下面的问题&#xf…

【CSS动画02--卡片旋转3D】

CSS动画02--卡片旋转3D 介绍代码HTMLCSS css动画02--旋转卡片3D 介绍 当鼠标移动到中间的卡片上会有随着中间的Y轴进行360的旋转&#xff0c;以下是几张图片的介绍&#xff0c;上面是鄙人自己录得一个供大家参考的小视频&#x1f92d; 代码 HTML <!DOCTYPE html>…

上半年营收19亿,金融壹账通第二增长曲线“加速上坡”

8月16日&#xff0c;壹账通金融科技有限公司&#xff08;下称“金融壹账通”&#xff09;发布了截至2023年6月30日中期业绩报告。 根据财报&#xff0c;2023年上半年&#xff0c;金融壹账通实现营收18.99亿元&#xff0c;毛利润为6.96亿元&#xff1b;归母净利润率从-26.1%提升…

(ElementPlus)操作(不使用 ts): Form表单检验、规则及案例分析(这一篇就够了)

Ⅰ、Form 表单检验简介&#xff1a; 1、什么是 Form 表单检验&#xff1f; 其一、属性&#xff1a; 表单验证是 javascript 中的高级选项之一&#xff1b; 其二、定义&#xff1a; JavaScript 在数据被送往服务器前对 HTML 中的 Form 表单中的这些输入数据进行验证的行为就…

MySQL索引介绍 为什么mysql使用B+树

什么是索引&#xff1f; 索引是一种用于快速查询和检索数据的数据结构&#xff0c;常见的索引结构有&#xff1a;B树&#xff0c;B树和Hash。 索引的作用就相当于目录。打个比方&#xff0c;我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去…

文本三剑客之sed编辑器

sed 一、sed简介1.1 什么是sed&#xff1f;1.2 sed原理1.3 sed核心功能 二、sed命令格式详解2.1 命令格式2.2 常用选项2.3 sed脚本语法2.3.1 基本语法结构2.3.2 地址部分-----指定匹配范围2.3.3 命令部分-----要执行的命令 三、sed查找替换3.1 基本语法3.2 分组后向引用3.3 变量…

.NET应用UI组件DevExpress XAF v23.1 - 全新的日程模块

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在新版中…

【爬虫练习之glidedsky】爬虫-基础2

题目 链接 爬虫往往不能在一个页面里面获取全部想要的数据&#xff0c;需要访问大量的网页才能够完成任务。 这里有一个网站&#xff0c;还是求所有数字的和&#xff0c;只是这次分了1000页。 思路 找到调用接口 可以看到后面有个参数page来控制页码 代码实现 import reques…

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…

win10下IDEA搭建web项目脚手架

参考 IDEA运行Maven项目配置全过程(菜鸟专属)_idea配置maven_Hi梅的博客-CSDN博客 下载 IDEA 下载JDK 1.8 https://pan.baidu.com/s/1lj2na9omGwhPrCKYNz1qSQ 提取码:izkj 点击exe一步步next 添加环境变量: JAVA_HOME 对于自己jdk的路径 添加系统变量PATH:%JAVA_H…

混杂接口模式---vlan

策略在两个地方可以用--1、重发布 2、bgp邻居 2、二层可以干的&#xff0c;三层也可以干 3、未知单播&#xff1a;交换机的MAC地址表的记录保留时间是5分钟&#xff0c;电脑的ARP表的记录保留时间是2小时 4、route recursive-lookup tunnel 华为默认对于bgp学习来的路由不开启标…

在Hive/Spark上执行TPC-DS基准测试 (PARQUET格式)

在上一篇文章:《在Hive/Spark上运行执行TPC-DS基准测试 (ORC和TEXT格式)》中,我们介绍了如何使用 hive-testbench 在Hive/Spark上执行TPC-DS基准测试,同时也指出了该项目不支持parquet格式。 如果我们想要生成parquet格式的测试数据,就需要使用其他工具了。本文选择使用另…

深入了解Maven(一)

目录 一.Maven介绍与功能 二.依赖管理 1.依赖的配置 2.依赖的传递性 3.排除依赖 4.依赖的作用范围 5.依赖的生命周期 一.Maven介绍与功能 maven是一个项目管理和构建工具&#xff0c;是基于对象模型POM实现。 Maven的作用&#xff1a; 便捷的依赖管理&#xff1a;使用…

[.NET/WPF] CommunityToolkit.Mvvm 异步指令

我们在开发中, 经常会有这样的需求: 点击按钮后, 进行一些耗时的工作工作进行时, 按钮不可再次被点击工作进行时, 会显示进度条, 或者 “加载中” 的动画 RelayCommand CommunityToolkit.Mvvm 中的 RelayCommand 除了支持最简单的同步方法, 还支持以 Task 作为返回值的异步方…

开源语音聊天软件Mumble

网友 大气 告诉我&#xff0c;Openblocks在国内还有个版本叫 码匠&#xff0c;更贴合国内软件开发的需求&#xff0c;如接入了国内常用的身份认证&#xff0c;接入了国内的数据库和云服务&#xff0c;也对小程序、企微 sdk 等场景做了适配。 在 https://majiang.co/docs/docke…

WooCommerce Product Bundles电商网站产品捆绑包

WooCommerce Product Bundles电商网站产品捆绑包是用于 WooCommerce 的最灵活、最强大的产品捆绑工具包&#xff0c;为数以千计的成功商店提供支持。它的产品分组、定价和运输功能旨在确保它在广泛的用例中发挥出色。很少有产品包无法处理的情况&#xff01; 网址&#xff1a;W…

基于Simulink的Chaos混沌电路设计与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 07_001m 4.算法理论概述 混沌电路是一类特殊的非线性电路&#xff0c;其输出信号表现出无规律…