【python计算机视觉编程——10.OpenCV】
python计算机视觉编程——10.OpenCV
- 10.OpenCV
- 10.2 OpenCV基础知识
- 10.2.1 读取和写入图像
- 10.2.2 颜色空间
- 10.2.3 显示图像及结果
- 10.3 处理视频
- 10.3.1 视频输入
- 10.3.2 将视频读取到NumPy数组中
- 10.4 跟踪
- 10.4.1 光流
- 10.4.2 Lucas-Kanade算法
- 使用跟踪器
- 使用发生器
- 10.5 更多示例
- 10.5.1图像修复
10.OpenCV
10.2 OpenCV基础知识
10.2.1 读取和写入图像
import cv2
from pylab import *
im=cv2.imread('sun.jpg')
h,w=im.shape[:2]
print(h,w)cv2.imwrite('result.png',im)
10.2.2 颜色空间
im=cv2.imread('sun.jpg')
# 创建灰度图像
# COLOR_BGR2GRAY、COLOR_BGR2RGB、COLOR_GRAY2BGR
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
imshow(gray)

10.2.3 显示图像及结果
import cv2
# 读取图像
im = cv2.imread('sun.jpg')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)# 计算积分图像
intim = cv2.integral(gray)# 归一化并保存
intim = (255.0*intim) / intim.max()
cv2.imwrite('result.jpg',intim)
import cv2# 读取图像
filename = 'sun.jpg'
im = cv2.imread(filename)
h,w = im.shape[:2]
# 泛洪填充
diff = (6,6,6)
mask = np.zeros((h+2,w+2),uint8)
cv2.floodFill(im,mask,(10,10), (255,255,0),diff,diff)
# 在OpenCV 窗口中显示结果
cv2.imshow('flood fill',im)
cv2.waitKey()
# 保存结果
cv2.imwrite('result.jpg',im)
from pylab import *
im1=cv2.imread('result_10.2.3-1.jpg')
im2=cv2.imread('result_10.2.3-2.jpg')
gray()
subplot(121)
imshow(im1)
subplot(122)
imshow(im2)

import cv2# 初始化 ORB 检测器
orb = cv2.ORB_create()# 读取图像
image = cv2.imread('sun.jpg', cv2.IMREAD_GRAYSCALE)# 检测关键点和描述符
keypoints, descriptors = orb.detectAndCompute(image, None)# 在图像上绘制关键点
output_image = cv2.drawKeypoints(image, keypoints, None)# 显示结果
cv2.imshow('ORB Keypoints', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

10.3 处理视频
10.3.1 视频输入
import cv2#设置视频捕获
# cap = cv2.VideoCapture(0) #可以是摄像头的索引
cap = cv2.VideoCapture('MARSCONCERT.mp4') #也可以是视频的名称if not cap.isOpened():print("无法打摄像机")exit()while True:ret,im = cap.read()cv2.imshow('video_test',im)key = cv2.waitKey(10)if key == 27: #Esc键退出breakif key == ord(' '): #空格抓拍cv2.imwrite('vid_result.jpg',im)# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

还可以对实时显示的图像进行模糊
import cv2# 1. 捕获视频
cap = cv2.VideoCapture('MARSCONCERT.mp4') # 0通常代表默认的摄像头,也可以替换为视频文件的路径# 检查摄像头是否成功打开
if not cap.isOpened():print("Error opening video stream or file")exit()# 2. 设置输出视频参数
# fourcc = cv2.VideoWriter_fourcc(*'XVID') # 选择编码器
# out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) # 输出视频文件名、编码器、帧率、分辨率# 3. 读取并处理帧
while(cap.isOpened()):ret, frame = cap.read() # 读取一帧if ret == True:blur = cv2.GaussianBlur(frame,(0,0),5)# 将处理后的帧写入输出视频# out.write(gray)# 显示帧(可选)cv2.imshow('frame', blur)key = cv2.waitKey(10)if key == 27: #(Esc键)breakif key == ord(' '):cv2.imwrite('vid_result.jpg',im)else:break# 完成后释放资源
cap.release()
# out.release()
cv2.destroyAllWindows()

10.3.2 将视频读取到NumPy数组中
import cv2
import numpy as np
cap = cv2.VideoCapture('MARSCONCERT.mp4')frames=[]
# 获取帧,存储到数组中
flag=0
while True:ret,im = cap.read()if flag==0:print(im.shape)flag=1if ret == True:cv2.imshow('video',im)frames.append(im)if cv2.waitKey(10) == 27:print(im.shape)breakelse:break
frames = np.array(frames)# 检查尺寸
print(frames.shape)# 完成后释放资源
cap.release()
cv2.destroyAllWindows() # 有帧数、帧高、帧宽及颜色通道数(3个),共记录了181帧

10.4 跟踪
10.4.1 光流
- 光流法主要依赖于三个假设。
- 亮度恒定:图像中目标的像素强度在连续帧之间不会发生变化。
- 时间规律:相邻帧之间的时间足够短,以至于在考虑运行变化时可以忽略它们之 间的差异。该假设用于导出下面的核心方程。
- 空间一致性:相邻像素具有相似的运动。
import cv2
import numpy as np
def draw_flow(im,flow,step=16):""" 在间隔分开的像素采样点处绘制光流"""h,w = im.shape[:2] # 获取图像的高度和宽度y,x = np.mgrid[step/2:h:step,step/2:w:step].reshape(2,-1) # 生成间隔分开的采样点坐标y, x = y.astype(np.int32), x.astype(np.int32) # 转换为整数类型# print(y,x)fx,fy = flow[y,x].T # 获取每个采样点的光流向量分量# 创建线的终点lines = np.vstack([x,y,x+fx,y+fy]).T.reshape(-1,2,2)lines = np.int32(lines)# 创建图像并绘制vis = cv2.cvtColor(im,cv2.COLOR_GRAY2BGR) # 将灰度图像转换为彩色图像for (x1,y1),(x2,y2) in lines:cv2.line(vis,(x1,y1),(x2,y2),(0,255,0),1) # 绘制光流的线条cv2.circle(vis,(x1,y1),1,(0,255,0), -1) # 在起点绘制小圆点return vis
# 设置视频捕获
cap = cv2.VideoCapture('小镇里的花.mp4')
ret,im = cap.read()
prev_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)while True:# 获取灰度图像ret,im = cap.read()gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)#计算流 flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,None,0.5,3,15,3,5,1.2,0)prev_gray = gray#画出流矢量 cv2.imshow('Optical flow',draw_flow(gray,flow))if cv2.waitKey(10) == 27:break
cap.release()
cv2.destroyAllWindows()

10.4.2 Lucas-Kanade算法
import cv2# 一些常数及默认参数
lk_params = dict(winSize=(15,15),maxLevel=2,criteria=(cv2.TERM_CRITERIA_EPS|cv2.TERM_CRITERIA_COUNT,10,0.03))
subpix_params = dict(zeroZone=(-1,-1),winSize=(10,10),criteria = (cv2.TERM_CRITERIA_COUNT|cv2.TERM_CRITERIA_EPS,20,0.03))
feature_params = dict(maxCorners=500,qualityLevel=0.01,minDistance=10)class LKTracker(object):"""用金字塔光流Lucas-Kanade跟踪类"""def __init__(self,imnames):""" 使用图像名称列表初始化"""self.imnames = imnamesself.features = []self.tracks = []self.current_frame = 0def detect_points(self):""" 利用子像素精确度在当前帧中检测“利于跟踪的好的特征”(角点) """#载入图像并创建灰度图像self.image = cv2.imread(self.imnames[self.current_frame])self.gray = cv2.cvtColor(self.image,cv2.COLOR_BGR2GRAY)#搜索好的特征点features = cv2.goodFeaturesToTrack(self.gray, **feature_params)#提炼角点位置cv2.cornerSubPix(self.gray,features, **subpix_params)self.features = featuresself.tracks = [[p] for p in features.reshape((-1,2))]self.prev_gray = self.graydef track_points(self):""" 跟踪检测到的特征""" if self.features != []:self.step() # 移到下一帧# 载入图像并创建灰度图像self.image = cv2.imread(self.imnames[self.current_frame])self.gray = cv2.cvtColor(self.image,cv2.COLOR_BGR2GRAY)# reshape() 操作,以适应输入格式tmp = np.float32(self.features).reshape(-1, 1, 2)# 计算光流features,status,track_error = cv2.calcOpticalFlowPyrLK(self.prev_gray,self.gray,tmp,None,**lk_params)# 去除丢失的点self.features = [p for (st,p) in zip(status,features) if st]# 从丢失的点清楚跟踪轨迹features = np.array(features).reshape((-1,2))for i,f in enumerate(features):self.tracks[i].append(f)ndx = [i for (i,st) in enumerate(status) if not st]ndx.reverse()# 从后面移除for i in ndx:self.tracks.pop(i) self.prev_gray = self.graydef step(self,framenbr=None):""" 移到下一帧。如果没有给定参数,直接移到下一帧"""if framenbr is None:self.current_frame = (self.current_frame + 1) % len(self.imnames)else:self.current_frame = framenbr % len(self.imnames)def draw(self):"""用OpenCV 自带的画图函数画出当前图像及跟踪点,按任意键关闭窗口""" # 用绿色圆圈画出跟踪点for point in self.features:cv2.circle(self.image,(int(point[0][0]),int(point[0][1])),3,(0,255,0),-1)cv2.imshow('LKtrack',self.image)cv2.waitKey()
import numpy as np
imnames = ['bt.003.pgm', 'bt.002.pgm', 'bt.001.pgm', 'bt.000.pgm']# 创建跟踪对象
lkt = LKTracker(imnames)
# 在第一帧进行检测,跟踪剩下的帧
lkt.detect_points()
lkt.draw()
for i in range(len(imnames)-1):lkt.track_points()lkt.draw()cv2.waitKey(0)
cv2.destroyAllWindows()




将下面的方法添加到LKTracker类:
def track(self):""" 发生器,用于遍历整个序列""" for i in range(len(self.imnames)):if self.features == []:self.detect_points()else:self.track_points()# 创建一份RGB副本f = array(self.features).reshape(-1,2)im = cv2.cvtColor(self.image,cv2.COLOR_BGR2RGB)yield im,f
from pylab import *
imnames = ['viff.000.ppm', 'viff.001.ppm','viff.002.ppm', 'viff.003.ppm', 'viff.004.ppm']
# 用LKTracker 发生器进行跟踪
lkt = LKTracker(imnames)
for im,ft in lkt.track():print('tracking %d features' % len(ft))
# 画出轨迹
figure()
imshow(im)
for p in ft:plot(p[0],p[1],'bo')
for t in lkt.tracks:plot([p[0] for p in t],[p[1] for p in t])
axis('off')
show()

10.5 更多示例
10.5.1图像修复
import numpy as np
import cv2#读取图片
img = cv2.imread('repair.png')
#图像转换为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#灰度二值化
_,mask = cv2.threshold(cv2.cvtColor(img,cv2.COLOR_BGR2GRAY),100,255,cv2.THRESH_BINARY_INV)
dst = cv2.inpaint(img,mask,10,cv2.INPAINT_NS) #3:领域大小
cv2.imshow('img0',img)
#cv2.imshow('img10',mask1)
cv2.imshow('img1',mask)
cv2.imshow('img2',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
下图为修复前的图像

下图为掩模图

下图为修复图像,可以看到,虽然黑线被修复了,但是整体图像中,原本不需要修复的地方,会被修复函数当作是需要修复的

相关文章:
【python计算机视觉编程——10.OpenCV】
python计算机视觉编程——10.OpenCV 10.OpenCV10.2 OpenCV基础知识10.2.1 读取和写入图像10.2.2 颜色空间10.2.3 显示图像及结果 10.3 处理视频10.3.1 视频输入10.3.2 将视频读取到NumPy数组中 10.4 跟踪10.4.1 光流10.4.2 Lucas-Kanade算法使用跟踪器使用发生器 10.5 更多示例…...
医学数据分析实训 项目二 数据预处理预备知识(数据标准化处理,数据离差标准化处理,数据二值化处理,独热编码处理,数据PCA降维处理)
文章目录 数据预处理预备知识任务一 数据标准化处理1. 数据准备2. 数据标准化 任务二 数据离差标准化处理任务三 数据二值化处理任务五 独热编码处理对数据进行“离散化处理”(装箱)将已经装箱的数据进行OneHotEncoder独热编码 任务六 数据PCA降维处理1.…...
MySQL查询执行(四):查一行也很慢
假设存在表t,这个表有两个字段id和c,并且我在里面插入了10万行记录。 -- 创建表t CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB;-- 通过存储过程向t写入10w行数据 delimiter ;; create procedure idat…...
【Obsidian】当笔记接入AI,Copilot插件推荐
当笔记接入AI,Copilot插件推荐 自己的知识库笔记如果增加AI功能会怎样?AI的回答完全基于你自己的知识库余料,是不是很有趣。在插件库中有Copilot插件这款插件,可以实现这个梦想。 一、什么是Copilot? 我们知道githu…...
Spring Cloud集成Gateaway
Spring Cloud Gateway 是一个基于 Spring 生态的网关框架,用于构建微服务架构中的API网关。它可以对请求进行路由、过滤、限流等操作,是Spring Cloud微服务体系中常用的组件之一。下面介绍 Spring Cloud Gateway 的核心概念、应用场景以及简单的示例。 …...
如何准备技术面试?
大家好,我是老三,好久没更新了,翻出之前的一篇旧稿,是一篇总纲性质的文章——如何准备一场技术面试。这篇文章原本的开头是写给金三银四的,转眼就“金九银十”了,每一年都是最差的一年,又是未来…...
Kafka原理剖析之「Topic创建」
一、前言 Kafka提供了高性能的读写,而这些读写操作均是操作在Topic上的,Topic的创建就尤为关键,其中涉及分区分配策略、状态流转等,而Topic的新建语句非常简单 bash kafka-topics.sh \ --bootstrap-server localhost:9092 \ // …...
Java 高级学习路线概要~
前言:恭喜你已经掌握了 Java 的基础知识!现在,让我们踏上 Java 高级学习之旅,探索更强大的编程技巧和技术。学习前记得不要忘了巩固和加强基础的学习哦,高级学习也是建立在基础的学习之上。 1. 集合框架进阶 Map 接口…...
浏览器插件快速开启/关闭IDM接管下载
假设你已经为浏览器安装了IDM扩展,那么按下图的点击顺序,可以快速开启或关闭IDM的下载接管,而不必在IDM软件的设置->选项中,临时作调整。...
初识c++:入门基础
打字不易,留个赞再走吧~~ 目录 一.第一个c程序二.命名空间 namespace三.C输⼊&输出四.缺省参数 C兼容C语⾔绝⼤多数的语法,所以C语⾔实现的hello world依旧可以运⾏,C中需要把定义⽂件 代码后缀改为.cpp 一.第一个c程序 做好准备我们来写…...
Java Exception 异常相关总结
1.简介 在Java中,当代码运行有问题时会抛出异常,主要分为两类: 1.可以通过try...catch来捕获解决的,不影响后续执行的RuntimeException。 2.不可以通过代码解决的Exception。 为了提高代码的健壮性,我们会选择去捕…...
HighCharts图表自动化简介
什么是分析数据? 在任何应用程序中捕获并以图形或图表形式显示的分析数据是任何产品或系统的关键部分,因为它提供了对实时数据的洞察。 验证此类分析数据非常重要,因为不准确的数据可能会在报告中产生问题,并可能影响应用程序/系统的其他相关领域。 什么是HighChart? …...
使用LDAP登录GitLab
使用LDAP登录GitLab gitlab.rb 配置如下 gitlab_rails[ldap_enabled] true #gitlab_rails[prevent_ldap_sign_in] false###! **remember to close this block with EOS below** gitlab_rails[ldap_servers] YAML.load <<-EOSmain:label: LDAPhost: 172.16.10.180port:…...
【2024】前端学习笔记5-表单标签使用
表单是网页提供的一种交互式操作手段,主要用于采集用户输入的信息。 学习笔记 1.表单框架:form标签1.1.action属性:目标指向1.2.method属性:提交方式1.3.id属性:唯一标识1.4.placeholder属性:提示文字2.input标签2.1.text类型:基本文本输入2.2.password类型:密码输入2.…...
数据结构--二叉树(C语言实现,超详细!!!)
文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种…...
【将字符串变为空的编辑距离】
题目描述 求由s串变成t串的编辑距离 在s串的开头/末尾添加一个字符,花费p 在s串的开头/末尾添加一个s串的子串,花费q 每次作都是基于当前的s串 s串初始为空 分析 等价于将一个字符串变为空串的过程 第一层按照长度遍历(如果按照下标i,j遍…...
卡特兰数的推理
卡特兰数(Catalan number),又称卡塔兰数、明安图数,是组合数学中一种常出现于各种计数问题中的数列。它以比利时数学家欧仁查理卡特兰的名字命名,但值得注意的是,这一数列的首次发现可以追溯到1730年&#…...
高精度治具加工的重要性和优势
在现代工业制造中,高精度治具加工扮演着举足轻重的角色。它不仅关乎产品制造的精度与质量,还直接影响到生产效率和成本控制。因此,时利和将深入探讨高精度治具加工的重要性和优势,对于提升工业制造水平具有重要意义。 高精度治具加…...
新版IDEA提示@Autowired不建议字段注入
随着项目的复杂度的增加,我们通常会在一个业务类中注入其他过多的业务类。从而使当前的业务层扩充成一个大而全的功能模块。那么就容易出现一下问题 字段注入会让依赖关系变得不那么明显,因为你无法通过构造函数看到所有的依赖项。使用构造函数时&#…...
adb的安装和使用 以及安装Frida 16.0.10+雷电模拟器
.NET兼职社区 .NET兼职社区 .NET兼职社区 1.下载adb Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip 2.配置adb环境变量 按键windowsr打开运行,输入sysdm.cpl,回车。 高级》环境变量》系统变量》…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
