【python计算机视觉编程——10.OpenCV】

news2024/12/23 20:42:42

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键退出
        break
    if 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键)
            break
        if 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=1
    if ret == True:
        cv2.imshow('video',im)
        frames.append(im)
        if cv2.waitKey(10) == 27:
            print(im.shape)
            break
    else:
        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 = imnames
        self.features = []
        self.tracks = []
        self.current_frame = 0
    def 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 = features
        self.tracks = [[p] for p in features.reshape((-1,2))]
        self.prev_gray = self.gray
        
    def 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.gray
    def 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.coloradmin.cn/o/2136167.html

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

相关文章

计算架构模式之负载均衡技巧

通用负载均衡算法 负载均衡算法 -轮询 & 随机 如果服务器挂掉了,那么负载均衡器还是可以感知到的,因为连接已经断掉了。 负载均衡算法-加权轮询 假设你有4核的和8核的,由于你的程序没有办法跑完CPU,那么有可能出现4核的和8核…

xmake vscode+clangd实现c/c++程序更精确跳转、补全

clangd相比与vscode自带的c/c插件要好用很多,使用xmake搭配vscode开发c/c程序时,可以通过下面方法使用clangd。 生成compile_commands.json 好像是叫什么compile database,xmake可以使用下面两种方式生成。 1、手动生成 xmake project -k…

[linux基础知识]教你使用vim和ctags阅读linux内核源码

1 安装ctags apt install ctags 2 内核源码目录下添加索引 使用下面命令,添加索引成功后,内核目录下会生成tags 索引文件。 ctags -R 3 vim使用索引阅读源码 跳转到函数变量定义与返回 #跳到函数或者变量定义 Ctrl] #返回 Ctrlo 光标移动到需要…

九九乘法表-for-python

for i in range(1, 10):for j in range(1, i):print(f"{j}*{i}{i*j}\t", end )print()运行结果截图:

Linux 离线安装 Docker

一、安装 docker 1. 下载 Docker 安装包 https://download.docker.com/linux/static/stable/x86_64/ 2. 解压安装包 tar -xvf docker-27.1.0.tgz mv docker/* /usr/bin/3. 将 docker 注册为 service 服务 vim /etc/systemd/system/docker.servicedocker.service [Unit] Des…

学习笔记 韩顺平 零基础30天学会Java(2024.9.14)

P547 Collections工具类2 P554 泛型引入 P555 泛型入门 ArrayList<Dog>arrayList new ArrayList<Dog>()//在这里可以理解为这个arrayList里面只能放Dog类型&#xff0c;就是限制了类型 P556 泛型说明 泛型就是可以代指一类数据类型&#xff0c;可以是Integer也可以…

哪个虚拟机软件在 Mac 上更好用,Mac 虚拟机会影响性能吗?

虚拟机如今已经成为许多用户工作生活不可缺少的工具之一&#xff0c;尤其是对于需要经常切换使用不同系统的用户来说&#xff0c;虚拟机提供了一个便捷而有效的操作平台&#xff0c;解决用户跨系统工作的问题。然而&#xff0c;当我们考虑在Mac上下载运行虚拟机时&#xff0c;会…

艾体宝洞察丨一文读懂最新密码存储方法,揭秘密码存储常见误区!

在信息安全的诸多领域之中&#xff0c;密码的安全存储无疑已然成为最为核心的问题之一。随着攻击技术的不断演进&#xff0c;传统的密码存储方法已无法抵御现代复杂的威胁。更为安全、健壮的密码存储机制也成为当代信息安全从业者的关注点。本篇文章将引入并介绍密码存储中的基…

交叉编译工具链的安装及带wiringPi库的交叉编译实现

交叉编译工具链的安装及带wiringPi库的交叉编译实现 交叉编译的概念交叉编译工具链的安装下载交叉编译工具链配置环境遍变量编译程序到ARM平台 带wiringPi库的交叉编译下载编译wiringPi库调用树莓派的wringPi库 交叉编译的概念 交叉编译是在一个平台上生成另一个平台上的可执行…

【资料分析】平均倍数类

平均 观察选项&#xff0c;差距较大&#xff0c;大胆约分即可 很少的情况下&#xff0c;选项相差很近不能随便约分 倍数 第N次注意增长率是否为下降&#xff01; 问的是基期倍数比哦 平均增长量 十三五这种明确问法&#xff0c;一定是五年 属于有往前推的A和不往前推的…

智能智造和工业软件研发平台SCSAI功能介绍

用爱编程30年&#xff0c;倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销&#xff0c;致力于为10000家的中小企业实现数字化转型&#xff0c;打造数字化企业和智能工厂&#xff0c;点击上边蓝色字体&#xff0c;关注“AI智造AI编程”或文末扫码…

掌握Transformer之深入多头注意力机制

01 引言 这是我关于Transformer系列的第三篇文章。在在前两篇文章中&#xff0c;我们了解了什么是Transformer、Transformer的架构以及其各组件的工作原理。在本文中&#xff0c;我们将进一步深入探讨多头注意力机制&#xff0c;它是Transformer的大脑。 闲话少说&#xff0…

每天五分钟玩转深度学习PyTorch:模型参数优化器torch.optim

本文重点 在机器学习或者深度学习中,我们需要通过修改参数使得损失函数最小化(或最大化),优化算法就是一种调整模型参数更新的策略。在pytorch中定义了优化器optim,我们可以使用它调用封装好的优化算法,然后传递给它神经网络模型参数,就可以对模型进行优化。本文是学习第…

福建聚鼎科技:装饰画怎么运营更受大家喜欢

在繁华喧嚣的都市中&#xff0c;装饰画宛如一首无言的诗篇&#xff0c;静静地诉说着生活的美好。如何让这门艺术走进千家万户&#xff0c;成为装点空间、启迪心灵的一抹亮色?今天&#xff0c;我们就来探寻装饰画运营的秘诀&#xff0c;让它在市场的海洋中乘风破浪。 一幅优秀的…

Python+Pytest框架,“conftest.py文件编写如何获取token和获取日志“?

1、新增"conftest.py" import pytest import loggingfrom api_keyword.api_key import ApiKey from config import *# 获取token # 1. 正常的请求对应的接口并且提取数据 # 2. pytest.fixture()测试夹具&#xff08;测试前置、后置操作&#xff09;pytest.fixture(s…

黑神话悟空+云技术,游戏新体验!

近期&#xff0c;一款名为黑神话悟空的游戏因其独特的艺术风格和创新的技术实现在玩家中产生了不小的影响。 而云桌面技术作为一种新兴的解决方案&#xff0c;正在改变人们的游戏体验方式&#xff0c;使得高性能游戏可以在更多设备上流畅运行。 那么&#xff0c;黑神话悟空如…

大数据安全需求分析与安全保护工程

大数据安全威胁与需求分析 特征&#xff1a;海量是数据规模、快速的数据流转、多样的数据类型和价值密度低 种类和来源&#xff1a;结构化、半结构化和非结构化数据 数据种类&#xff1a; 结构化数据&#xff1a;关系模型数据&#xff0c;以关系数据库表形式管理的数据 非…

【FATFS】FATFS简介及下载

1、FATFS简介 FatFs 是一个针对嵌入式系统开发的通用文件系统模块&#xff0c;主要用于支持 FAT 文件系统。它最初由 ChaN 开发&#xff0c;并被广泛应用于嵌入式设备上。FatFs 以其轻量级、可配置和设备无关的特性著称&#xff0c;支持 FAT12、FAT16、FAT32 以及 exFAT 文件系…

还有人认为C++容器是线程安全的吗?

C标准库中的容器&#xff08;如std::vector, std::list, std::map等&#xff09;本身不是线程安全的、不是线程安全的、不是线程安全的&#xff0c;重要的事情讲三遍。这意味着如果你在多线程环境中同时访问&#xff08;读或写&#xff09;同一个容器实例&#xff0c;而没有进行…

力扣14.最长公共前缀

思路&#xff1a;将字符串数组中第一个字符串用作参考&#xff1b; 8.将他的长度作为范围&#xff0c;因为超范围了之后就不会再有公共前缀了 9.将字符串数组的长度也作为范围&#xff0c;意思是便利字符串数组中的字符串 11.开始第一层循环&#xff0c;依次遍历第一个字符串的…