展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Python实战:运动检测编程演练详解

Python实战:运动检测编程演练详解

​译者|朱先忠审校|孙淑娟概述由于Python编程语言面临多个开源库可用;因此,选择Python语言进行运动检测开发是很容易的。目前,运动检测已经有许多的商业应用。例如,它可以用于在线考试的监考,也可以用于商店、银行等领域的安全目的。Python编程语言是一种开源的且支持库极其丰富的语言,如今基于此语言已经为用户开发了大量的应用程序,并拥有大量用户。正因为如此,Python语言在市场上快速增长。Python语言的优点不胜枚举,不仅是因为它的语法简单、易于发现错误,而且其非常迅速的调试过程使其对用户

本文目录

    ​译者 | 朱先忠

    审校 | 孙淑娟

    Python实战:运动检测编程演练详解

    概述

    由于Python编程语言面临多个开源库可用;因此,选择Python语言进行运动检测开发是很容易的。目前,运动检测已经有许多的商业应用。例如,它可以用于在线考试的监考,也可以用于商店、银行等领域的安全目的。

    Python编程语言是一种开源的且支持库极其丰富的语言,如今基于此语言已经为用户开发了大量的应用程序,并拥有大量用户。正因为如此,Python语言在市场上快速增长。Python语言的优点不胜枚举,不仅是因为它的语法简单、易于发现错误,而且其非常迅速的调试过程使其对用户更加友好。

    为什么建议您学习Python呢?我们可以使用下图来简单说明:

    Python实战:运动检测编程演练详解

    Python于1991年设计,由Python软件基金会开发。如今已经发布了许多版本。其中,Python2和Python3最为著名。目前,Python3已经被广泛使用,用户数量也在快速增长。在本文这个项目中,我们将使用Python3作为开发语言。

    什么是运动检测?

    根据物理学原理,当一个物体静止不动且没有速度时,它就被认为处于静止状态;而恰恰相反的是,当一物体没有完全静止且在某个方向(无论是左右、前后或上下)上有一定的运动或速度时,它都被认为处于运动状态。在本文中,我们将尝试检测出物体的运行情况。

    Python实战:运动检测编程演练详解

    目前,运动检测在现实生活中已经存在大量实现或应用,这充分证明其巨大的应用价值。其中,使用网络摄像头(我们将在本文中实现)作为安全警卫进行在线考试监考等是最典型的应用。

    在本文中,我们将尝试实现一个脚本。通过该脚本,我们将使用台式机或笔记本电脑上安装的网络摄像头实现对物体运动的检测。我们的想法是,我们将拍摄两帧视频,并试图找出它们之间的差异。如果两帧之间存在某种差异,那么很明显,相机前面的物体存在某种移动,这就产生了差异。

    主要的参考库

    在着手实现代码之前,让我们先看看我们将在代码中使用的一些模块或库,这些模块或库用于操作网络摄像头进行运动检测。正如我们所讨论的,这些开源库对于Python声誉的传播起着重要作用。让我们看看本文示例项目中需要的开源库:

    • OpenCV
    • Pandas

    上述两个库OpenCV和Pandas都是纯粹基于Python的免费开源库,我们将通过Python语言的Python3版本来使用它们。

    1.OpenCV

    OpenCV是一个非常著名的开源库,可以与许多编程语言(如C++、Python等)一起使用,专门应用于处理图像和视频程序开发。通过与Python的开源库Pandas或者NumPy库集成应用,我们可以充分挖掘出OpenCV的功能。

    2.Pandas

    Pandas是一个开放源码的Python库,为数据分析提供了丰富的内置工具;因此,在数据科学和数据分析领域得到了广泛的应用。在Pandas中提供了数据结构形式DataFrame数据帧,这种结构对于将表格数据操作和存储到二维数据结构中提供了极方便的支持。

    上述两个模块都不是Python内置的,我们必须在使用前先安装它们。除此之外,我们还将在项目中使用另外两个模块。

    • Python日期时间(DateTime)模块
    • Python时间(Time)模块

    这两个模块都内置在Python中,以后无需安装。这些模块分别用来处理与日期和时间相关的功能。

    代码实现

    到目前为止,我们已经看到了我们将在代码中使用的库。接下来,让我们从视频只是许多静态图像或帧的组合这一假定开始,然后使用所有这些帧的组合来创建一个视频。

    导入所需的库

    在本节中,我们将首先导入所有库,如Pandas和OpenCV。然后,我们从DateTime模块导入time和DateTime函数。

    #导入Pandas库
    import Pandas as panda
    
    # 导入OpenCV库
    import cv2
    
    #导入时间模块
    import time
    
    #从datetime 模块导入datetime 函数 
    from datetime import datetime 

    初始化数据变量

    在本节中,我们要初始化一些变量,并将在代码中进一步使用这些变量。首先,我们将初始状态定义为“None”,然后通过另一个变量motionTrackList来存储跟踪的运动。

    此外,我们还定义了一个列表“motionTime”,用于存储发现运动的时间,并使用Panda的模块初始化数据帧列表。

    # 对于初始帧,以变量initialState的形式将初始状态指定为None
    initialState = None
    
    # 帧中检测到任何运动时存储所有轨迹的列表 
    motionTrackList= [ None, None ]
    
    # 一个新的“时间”列表,用于存储检测到移动时的时间
    motionTime = []
    
    # 使用带有初始列和最终列的Panda库初始化数据帧变量“DataFrame” 
    dataFrame = panda.DataFrame(columns = ["Initial", "Final"])

    关键帧捕获过程

    在本节中,我们将实现本文示例项目中最关键的运动检测步骤。下面,让我们分步骤进行解说:

    1. 首先,我们将开始使用cv2模块捕获视频,并将其存储在视频变量中。
    2. 然后,我们将使用无限while循环从视频中捕获每一帧。
    3. 接下来,将使用read()方法读取每个帧,并将它们存储到各自的变量中。
    4. 我们定义了一个变量var_motion,并将其初始化为零。
    5. 我们使用cv2函数cvtColor和GaussianBlur创建另外两个变量grayImage和grayFrame,以找到运动中的变化。
    6. 如果我们的initialState为None,则我们将当前grayFrame指定为initialState;否则,使用“continue”关键字跳过后面代码的执行。
    7. 在后面代码中,我们计算在当前迭代中创建的初始帧和灰度帧grayscale之间的差异。
    8. 然后,我们将使用cv2阈值和dilate函数突出显示初始帧和当前帧之间的变化。
    9. 我们将从当前图像或帧中的运动对象中找到轮廓,并通过使用rectangle函数在其周围创建绿色边界来指示运动对象。
    10. 在此之后,我们将把当前检测到的元素添加到列表变量motionTrackList。
    11. 到目前为止,我们已经通过使用imshow方法显示出如灰度和原始帧等所有的关键帧。
    12. 此外,我们还使用cv2模块的witkey()方法来结束进程。程序中,我们选择使用按下键盘上的'm'键来结束我们的进程。
    # 使用cv2模块启动网络摄像头以捕获视频 
    video = cv2.VideoCapture(0)
    
    # 使用无限循环从视频中捕获帧
    while True:
    
     # 使用read功能从视频中读取每个图像或帧
    
     check, cur_frame = video.read()
    
     
    
     #将'motion'变量定义为等于零的初始帧
    
     var_motion = 0
    
     
    
     # 从彩色图像创建灰色帧 
    
     gray_image = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY)
    
     
    
     # 从灰度图像中使用GaussianBlur函数找到变化部分
    
     gray_frame = cv2.GaussianBlur(gray_image, (21, 21), 0)
    
     
    
     # 在第一次迭代时进行条件检查
    
     # 如果为None,则把grayFrame赋值给变量initalState
    
     if initialState is None:
    
     initialState = gray_frame
    
     continue
    
     
    
     # 计算静态(或初始)帧与我们创建的灰色帧之间的差异
    
     differ_frame = cv2.absdiff(initialState, gray_frame)
    
     
    
     # 静态或初始背景与当前灰色帧之间的变化将突出显示 
    
     
    
     thresh_frame = cv2.threshold(differ_frame, 30, 255, cv2.THRESH_BINARY)[1]
    
     thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2)
    
     
    
     #对于帧中的移动对象,查找轮廓
    
     cont,_ = cv2.findContours(thresh_frame.copy(), 
    
    cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
     
    
     for cur in cont:
    
     if cv2.contourArea(cur) < 10000:
    
     continue
    
     var_motion = 1
    
     (cur_x, cur_y,cur_w, cur_h) = cv2.boundingRect(cur)
    
     
    
     # 在移动对象周围创建一个绿色矩形
    
     cv2.rectangle(cur_frame, (cur_x, cur_y), (cur_x + cur_w, cur_y + cur_h), (0, 255, 0), 3)
    
     
    
    # 从帧中添加运动状态 
    
     motionTrackList.append(var_motion)
    
     motionTrackList = motionTrackList[-2:]
    
     
    
     # 添加运动的开始时间 
    
     if motionTrackList[-1] == 1 and motionTrackList[-2] == 0:
    
     motionTime.append(datetime.now())
    
     
    
    # 添加运动的结束时间 
    
     if motionTrackList[-1] == 0 and motionTrackList[-2] == 1:
    
     motionTime.append(datetime.now())
    
     
    
    # 在显示捕获图像的灰度级中 
    
     cv2.imshow("The image captured in the Gray Frame is shown below: ", gray_frame)
    
     
    
     # 显示初始静态帧和当前帧之间的差异 
    
     cv2.imshow("Difference between theinital static frame and the current frame: ", differ_frame)
    
     
    
     # 在框架屏幕上显示视频中的黑白图像 
    
     cv2.imshow("Threshold Frame created from the PC or Laptop Webcam is: ", thresh_frame)
    
     
    
     #通过彩色框显示物体的轮廓
    
     cv2.imshow("From the PC or Laptop webcam, this is one example of the Colour Frame:", cur_frame)
    
     
    
     # 创建处于等待状态的键盘按键 
    
     wait_key = cv2.waitKey(1)
    
     
    
     # 按下'm'键时,结束整个进程执行
    
     if wait_key == ord('m'):
    
     # 当屏幕上有东西移动时,将运动变量值添加到motiontime列表中 
    
     if var_motion == 1:
    
     motionTime.append(datetime.now())
    
     break 

    代码收尾工作

    在结束循环体执行后,我们将从dataFrame和motionTime列表中添加数据到CSV文件中,最后关闭视频。这一部分代码的实现如下所示:

    # 最后,我们在数据帧中添加运动时间 
    for a in range(0, len(motionTime), 2):
    
     dataFrame = dataFrame.append({"Initial" : time[a], "Final" : motionTime[a + 1]}, ignore_index = True)
    
     
    # 创建CSV文件记录下所有运动信息
    dataFrame.to_csv("EachMovement.csv")
    
    # 释放视频内存 
    video.release()
    
    #现在,在openCV的帮助下关闭或销毁所有打开的窗口
    cv2.destroyAllWindows()

    至此,我们已经成功地创建完所有代码。现在,让我们再次归纳一下整个过程。

    首先,我们使用设备的网络摄像头捕捉视频,然后将输入视频的初始帧作为参考,并不时检查下一帧。如果发现与第一帧不同的帧,则说明存在运动。该信息将被标记在绿色矩形中。

    完整的代码

    现在,让我们把上面所有代码片断连接到一起,如下所示:

    #导入Pandas库
    import Pandas as panda
    
    # 导入OpenCV库
    import cv2
    
    #导入时间模块
    import time
    
    #从datetime 模块导入datetime 函数 
    from datetime import datetime 
    
    # 对于初始帧,以变量initialState的形式将初始状态指定为None
    initialState = None
    
    # 帧中检测到任何运动时存储所有轨迹的列表 
    motionTrackList= [ None, None ]
    
    # 一个新的“时间”列表,用于存储检测到移动时的时间
    motionTime = []
    
    # 使用带有初始列和最终列的Panda库初始化数据帧变量“DataFrame” 
    dataFrame = panda.DataFrame(columns = ["Initial", "Final"])
    
    # 使用cv2模块启动网络摄像头以捕获视频 
    video = cv2.VideoCapture(0)
    
    # 使用无限循环从视频中捕获帧
    while True:
    
     # 使用read功能从视频中读取每个图像或帧
    
     check, cur_frame = video.read()
    
     
    
     #将'motion'变量定义为等于零的初始帧
    
     var_motion = 0
    
     
    
     # 从彩色图像创建灰色帧 
    
     gray_image = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY)
    
     
    
     # 从灰度图像中使用GaussianBlur函数找到变化部分
    
     gray_frame = cv2.GaussianBlur(gray_image, (21, 21), 0)
    
     
    
     # 在第一次迭代时进行条件检查
    
     # 如果为None,则把grayFrame赋值给变量initalState
    
     if initialState is None:
    
     initialState = gray_frame
    
     continue
    
     
    
     # 计算静态(或初始)帧与我们创建的灰色帧之间的差异
    
     differ_frame = cv2.absdiff(initialState, gray_frame)
    
     
    
     # 静态或初始背景与当前灰色帧之间的变化将突出显示 
    
     
    
     thresh_frame = cv2.threshold(differ_frame, 30, 255, cv2.THRESH_BINARY)[1]
    
     thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2)
    
     
    
     #对于帧中的移动对象,查找轮廓
    
     cont,_ = cv2.findContours(thresh_frame.copy(), 
    
    cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
     
    
     for cur in cont:
    
     if cv2.contourArea(cur) < 10000:
    
     continue
    
     var_motion = 1
    
     (cur_x, cur_y,cur_w, cur_h) = cv2.boundingRect(cur)
    
     
    
     # 在移动对象周围创建一个绿色矩形
    
     cv2.rectangle(cur_frame, (cur_x, cur_y), (cur_x + cur_w, cur_y + cur_h), (0, 255, 0), 3)
    
     
    
    # 从帧中添加运动状态 
    
     motionTrackList.append(var_motion)
    
     motionTrackList = motionTrackList[-2:]
    
     
    
     # 添加运动的开始时间 
    
     if motionTrackList[-1] == 1 and motionTrackList[-2] == 0:
    
     motionTime.append(datetime.now())
    
     
    
    # 添加运动的结束时间 
    
     if motionTrackList[-1] == 0 and motionTrackList[-2] == 1:
    
     motionTime.append(datetime.now())
    
     
    
    # 在显示捕获图像的灰度级中 
    
     cv2.imshow("The image captured in the Gray Frame is shown below: ", gray_frame)
    
     
    
     # 显示初始静态帧和当前帧之间的差异 
    
     cv2.imshow("Difference between theinital static frame and the current frame: ", differ_frame)
    
     
    
     # 在框架屏幕上显示视频中的黑白图像 
    
     cv2.imshow("Threshold Frame created from the PC or Laptop Webcam is: ", thresh_frame)
    
     
    
     #通过彩色框显示物体的轮廓
    
     cv2.imshow("From the PC or Laptop webcam, this is one example of the Colour Frame:", cur_frame)
    
     
    
     # 创建处于等待状态的键盘按键 
    
     wait_key = cv2.waitKey(1)
    
     
    
     # 借助'm'键结束我们系统的整个进行 
    
     if wait_key == ord('m'):
    
     # 当屏幕上有物体运行时把运动变量值添加到列表motiontime中
    
     if var_motion == 1:
    
     motionTime.append(datetime.now())
    
     break 
    
    # 最后,我们在数据帧中添加运动时间 
    for a in range(0, len(motionTime), 2):
    
     dataFrame = dataFrame.append({"Initial" : time[a], "Final" : motionTime[a + 1]}, ignore_index = True)
    
     
    # 记录下所有运行,并创建到一个CSV文件中 
    dataFrame.to_csv("EachMovement.csv")
    
    # 释放视频内存
    video.release()
    
    #现在,在openCV的帮助下关闭或销毁所有打开的窗口
    cv2.destroyAllWindows()

    运行结果

    运行上述代码后得到的结果与下面看到的结果类似。

    Python实战:运动检测编程演练详解

    从这个动画中,我们可以看到该男子在视频中的动作已经被跟踪。因此,可以相应地看到输出结果。

    然而,在这段代码中,跟踪是在移动对象周围的矩形框的帮助下完成,类似于下面动画中所示的。这里要注意的一件有趣的事情是,这段视频是一个实际的安全摄像头的镜头,已经对其进行了检测处理。

    Python实战:运动检测编程演练详解

    结论

    • Python编程语言是一种开源的且有丰富的开源库支持的语言,目前已经为用户提供了许多现成的应用程序。
    • 当一个物体静止不动且没有速度时,则认为它处于静止状态;反之,当一个对象未完全静止时,则视为它处于运动状态。
    • OpenCV是一个开源库,可用于多种编程语言,通过将其与Python的Panda/NumPy库集成,我们可以充分发挥OpenCV的功能。

    最后来归纳一下。本文中所介绍的运动检测的主要思想是,每个视频只是许多静态图像(称为帧)的组合,我们是通过判断帧之间的差异来实现运行检测的。

    译者介绍

    朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。早期专注各种微软技术(编著成ASP.NET AJX、Cocos 2d-X相关三本技术图书),近十多年投身于开源世界(熟悉流行全栈Web开发技术),了解基于OneNet/AliOS+Arduino/ESP32/树莓派等物联网开发技术与Scala+Hadoop+Spark+Flink等大数据开发技术。

    原文标题:​​How to Perform Motion Detection Using Python​​​,作者:Vaishnavi Amira Yada​

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Postman macOS版
    Postman macOS版

    Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

    Docker Desktop macOS版
    Docker Desktop macOS版

    Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

    Android Studio macOS版
    Android Studio macOS版

    Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

    Xcode macOS版
    Xcode macOS版

    Xcode 是苹果面向 Mac 提供的官方集成开发环境,将代码编辑、项目构建、SwiftUI 实时预览、设备模拟、自动化测试、断点调试、性能分析和应用分发整合在同一套工作流中,适合开发与维护 iPhone、iPad、Mac、Apple Wa

    JetBrains WebStorm macOS版
    JetBrains WebStorm macOS版

    JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

    PhpStorm macOS版
    PhpStorm macOS版

    PhpStorm 是 JetBrains 推出的专业 PHP 集成开发环境,可在 Mac 上完成代码编写、智能检查、重构、调试、测试和数据库管理。它支持主流 PHP 框架、Composer、Git、Docker 与远程解释器。

    JetBrains PyCharm macOS版
    JetBrains PyCharm macOS版

    JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

    JetBrains IntelliJ IDEA macOS版
    JetBrains IntelliJ IDEA macOS版

    IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

    Visual Studio Code macOS版
    Visual Studio Code macOS版

    Visual Studio Code 是微软提供的免费代码编辑器,支持 macOS,并为 Intel 与 Apple 芯片 Mac 提供适配版本。软件集代码编辑、调试、Git 源代码管理、集成终端和扩展市场于一体。

    REAPER macOS版
    REAPER macOS版

    REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

    Adobe Audition macOS版
    Adobe Audition macOS版

    Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

    Pro Tools macOS版
    Pro Tools macOS版

    Pro Tools 是 Avid 推出的专业数字音频工作站,覆盖多轨录音、无损剪辑、MIDI 编曲、插件处理、自动化混音及声音与画面同步等工作。它拥有 Intro、Artist、Studio 和 Ultimate 等方案。

    WINDOWS 更多
    PixPix 网页版
    PixPix 网页版

    PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

    Postman Windows版
    Postman Windows版

    Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

    Docker Desktop Windows版
    Docker Desktop Windows版

    Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

    Android Studio Windows版
    Android Studio Windows版

    Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,

    JetBrains WebStorm Windows版
    JetBrains WebStorm Windows版

    WebStorm 是 JetBrains 面向 JavaScript、TypeScript 和现代 Web 技术打造的集成开发环境。它提供项目级代码分析、智能补全、安全重构、导航搜索,并集成调试、测试、终端、Git 与常用前端工具,

    JetBrains PhpStorm Windows版
    JetBrains PhpStorm Windows版

    PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

    JetBrains PyCharm Windows版
    JetBrains PyCharm Windows版

    PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,

    JetBrains IntelliJ IDEA Windows版
    JetBrains IntelliJ IDEA Windows版

    JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

    Visual Studio Code Windows版
    Visual Studio Code Windows版

    Visual Studio Code 是微软推出的免费代码编辑器,Windows 版集成智能补全、代码导航、调试、终端和版本控制,并可通过扩展添加语言、格式化及远程开发能力。它启动较快、配置灵活,

    REAPER Windows版
    REAPER Windows版

    REAPER 是 Cockos 推出的数字音频工作站,适用于录音、MIDI 编曲、音频编辑、混音、母带制作及声音设计。软件安装包小巧,支持多轨录制、灵活路由、自动化、第三方插件和脚本扩展,并提供完整功能的 60 天免费评估期。

    Adobe Audition Windows版
    Adobe Audition Windows版

    Adobe Audition 是面向播客、影视后期、广播与音乐制作的专业音频工作站,提供波形编辑、多轨混音、频谱分析、录音、降噪修复和效果处理等功能。Windows 版通过 Adobe Creative Cloud 安装和管理,

    Pro Tools Windows版
    Pro Tools Windows版

    Pro Tools 是 Avid 推出的专业数字音频工作站,提供多轨录音、音频剪辑、MIDI编曲、插件处理、自动化混音及影视声音制作能力。它适合音乐人、录音师、制作人和音频后期团队使用,并提供免费入门版、订阅方案及永久授权选择。