【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 光流

  • 光流法主要依赖于三个假设。
    1. 亮度恒定:图像中目标的像素强度在连续帧之间不会发生变化。
    2. 时间规律:相邻帧之间的时间足够短,以至于在考虑运行变化时可以忽略它们之 间的差异。该假设用于导出下面的核心方程。
    3. 空间一致性:相邻像素具有相似的运动。
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()

下图为修复前的图像

在这里插入图片描述

下图为掩模图

在这里插入图片描述

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

在这里插入图片描述

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

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

相关文章

Jmeter进行http接口测试,这一篇就搞定

jmeter-http接口测试脚本 jmeter进行http接口测试的主要步骤(1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL,路径,请求方式,参数 4.添加查看结果树 5.调用接口,查看返回值) 针对接口添加heade…

2025年最新大数据毕业设计选题-基于Hive分析相关

选题思路 回忆学过的知识(Python、Java、Hadoop、Hive、Sqoop、Spark、算法等等。。。) 结合学过的知识确定大的方向 a. 确定技术方向,比如基于Hadoop、基于Hive、基于Spark 等等。。。 b. 确定业务方向,比如民宿分析、电商行为分析、天气分析等等。。。…

09年408考研真题解析-计算机网络

[题34]在无噪声情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输速率是(B) A.12 kbps B.24 kbps C.48 kbps D.96 kbps 解析&#xff…

基于协同过滤+SpringBoot+Vue的剧本杀服务平台系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤JavaSpringBootV…

Java 技巧 如何在IDEA2024 中快速打出System.out.println();

1.基本用法 键入sout回车 回车后变成: 2.打印变量 快速打印变量,以打印变量名为set为例,set.sout回车, 回车后变成

Java 每日一刊(第13期):this super static

“优秀的代码不仅仅是给机器看的,更是给人看的。” 前言 这里是分享 Java 相关内容的专刊,每日一更。 本期将为大家带来以下内容: this 关键字super 关键字static 关键字 this 关键字 this 关键字是 Java 中最常见的关键字之一&#xf…

pg入门18—如何使用pg gis

1. 下载postgre gis镜像 2. 运行镜像 docker run -p 15432:5432 -d -e POSTGRES_PASSWORDAb123456! postgis/postgis:12-3.4-alpine 3. 使用gis # 进入容器,登录pgdocker exec -it bash# 登录数据库psql -U postgres# 创建数据库CREATE DATABASE mygeotest;# 使用…

计算机毕业设计之:教学平台微信小程序(

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Linux —— 多线程

一、本篇重点 1.了解线程概念,理解线程与进程区别与联系 2.理解和学会线程控制相关的接口和操作 3.了解线程分离与线程安全的概念 4.学会线程同步。 5.学会互斥量,条件变量,posix信号量,以及读写锁 6.理解基于读写锁的读者写…

用 HTML + JavaScript DIY 一个渐进式延迟法定退休年龄测算器

为减轻社会和个人因退休年龄变化带来的冲击,近日,全国人民代表大会常务委员会正式发布了关于实施渐进式延迟法定退休年龄的重要决定。 根据该决定,我国将同步启动对男、女职工法定退休年龄的延迟计划。这一调整将采取渐进式的方式进行&#…

第十二周:机器学习笔记

第十二周周报 摘要Abstract机器学习1. Recurrent Neural Network(下)1.1 RNN的Loss Function怎么求?1.2 RNN奇怪的特性1.3 如何解决 RNN 梯度消失或者爆炸1.4 RNN 其他应用 Pytorch学习1. 现有的网络模型使用以及其修改1.1 在VGG16模型添加Mo…

python-3n+1数链/233

一:3n1数链题目描述 在计算机科学上,有很多类问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可解决。现在我们就有这样一个问题,问题如下&#…

win11 wsl2安装ubuntu22最快捷方法

操作系统是win11,wsl版本是wsl2,wsl应该不用多介绍了,就是windows上的虚拟机,在wsl上可以很方便的运行Linux系统,性能棒棒的,而且wsl运行的系统和win11主机之间的文件移动是无缝的,就是两个系统…

第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)

这节记录下如何使用redis缓存数据库。 第一步: 先在服务器端安装redis, 下载地址:Releases tporadowski/redis GitHub。 第二步: 安装redis客户端可视化管理软件redisDesktopmanager Redis Desktop Manager - Download 第…

C++ tracy性能分析(二)

环境搭建 项目根目录下 git clone https://github.com/wolfpld/tracy cmake 配置 add_definitions("-DTRACY_ENABLE") add_subdirectory(tracy) include_directories(${TRACY_PUBLIC_DIR}) target_link_libraries(project TracyClient) test.cpp //#define TRACY_C…

完整版:NacosDocker 安装

第一步:先直接通过命令安装 Nacos docker run --name nacos2.2.3 -d -p 8848:8848 -e MODEstandalone f151dab7a111 第二步:创建 Docker 挂载目录 # 创建 log 目录 mkdir -p /root/nacos 第三步:将 Docker 容器的文件复制到挂载目录中 …

[Linux] Linux进程PCB内部信息的深入理解

标题:[Linux] Linux进程PCB内部信息的深入理解 个人主页:水墨不写bug (图片来自网络) 目录 一.查看进程 二.认识并了解进程的关键信息 I,PID/PPID II,exe III,cwd 三、fork(&…

LeetCode[中等] 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路:基于快排改进的快速…

【云原生安全篇】一文掌握Harbor集成Trivy应用实践

【云原生安全篇】一文掌握Harbor集成Trivy应用实践 目录 1 概念 1.1 什么是 Harbor 和 Trivy? 1.1.1 Harbor 1.1.2 Trivy 1.2 Harbor 与 Trivy 的关系 Trivy 在 Harbor 中的作用: 1.3 镜像扫描工作流程 2 实战案例:在Harbor 配置 Trivy …

初识模版!!

初识模版 1.泛型编程1.1 如何实现一个交换函数呢(使得所有数据都可以交换)?1.2 那可以不可以让编译器根据不同的类型利用该模子来生成代码呢? 2.模版类型2.1 模版概念2.2 函数模版的原理2.3 函数模板的实例化2.4 模板参数的匹配原…