Python OpenCV 计算机视觉:6~7
原文:OpenCV Computer Vision with Python
协议:CC BY-NC-SA 4.0
译者:飞龙
本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。
当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。
附录 A:与 Pygame 集成
本附录显示了如何在 OpenCV 应用中设置 Pygame 库以及如何使用 Pygame 进行窗口管理。 此外,附录还概述了 Pygame 的其他功能以及一些学习 Pygame 的资源。
注意
本章的所有完成代码都可以从我的网站下载。
安装 Pygame
假设我们已经根据第 1 章,“设置 OpenCV”中描述的方法之一设置了 Python。 根据我们现有的设置,我们可以通过以下方式之一安装 Pygame:
-
带有 32 位 Python 的 Windows:从以下位置下载并安装 Pygame 1.9.1。
-
带有 64 位 Python 的 Windows:从以下位置下载并安装 Pygame 1.9.2 预览版。
-
带有 Macports 的 Mac:打开“终端”并运行以下命令:
$ sudo port install py27-game -
带有 Homebrew 的 Mac:打开终端并运行以下命令来安装 Pygame 的依赖项,然后安装 Pygame 本身
$ brew install sdl sdl_image sdl_mixer sdl_ttf smpeg portmidi $ /usr/local/share/python/pip install \ > hg+http://bitbucket.org/pygame/pygame -
Ubuntu 及其衍生版本:打开“终端”并运行以下命令:
$ sudo apt-get install python-pygame -
其他类似 Unix 的系统:Pygame 在许多系统的标准存储库中可用。 典型的包名称包括
pygame,pygame27,py-game,py27-game,python-pygame,和python27-pygame.。
现在,Pygame 应该可以使用了。
文档和教程
Pygame 的 API 文档和一些教程可以在以下网址在线找到。
Al Sweigart 的《使用 Python 和 Pygame 制作游戏》是一本烹饪手册,用于在 Pygame 1.9.1 \中重新创建几个经典游戏。 免费的电子版本可从以下网站在线获得。或在以下网站下载 PDF 文件。
派生Manager.WindowManager
如第 2 章,“处理照相机,文件和 GUI”中所述,我们的面向对象设计使我们可以轻松地将 OpenCV 的 HighGUI 窗口管理器切换为另一个窗口管理器,例如 Pygame。 为此,我们只需要继承我们的managers.WindowManager类的子类,并覆盖四个方法:createWindow(),show(),destroyWindow()和processEvents()。 另外,我们需要导入一些新的依赖项。
要继续,我们需要第 2 章“处理照相机,文件和 GUI”中的managers.py文件,和第 4 章“用 Haar 级联跟踪人脸”中的utils.py文件。 在utils.py中,我们只需要一个函数isGray(),我们在第 4 章,“用 Haar 级联跟踪人脸”中实现。 让我们编辑managers.py以添加以下导入:
import pygame
import utils
同样在managers.py中,在执行WindowManager之后的某个位置,我们想添加名为PygameWindowManager的新子类:
class PygameWindowManager(WindowManager):def createWindow(self):pygame.display.init()pygame.display.set_caption(self._windowName)self._isWindowCreated = Truedef show(self, frame):# Find the frame's dimensions in (w, h) format.frameSize = frame.shape[1::-1]# Convert the frame to RGB, which Pygame requires.if utils.isGray(frame):conversionType = cv2.COLOR_GRAY2RGBelse:conversionType = cv2.COLOR_BGR2RGBrgbFrame = cv2.cvtColor(frame, conversionType)# Convert the frame to Pygame's Surface type.pygameFrame = pygame.image.frombuffer(rgbFrame.tostring(), frameSize, 'RGB')# Resize the window to match the frame.displaySurface = pygame.display.set_mode(frameSize)# Blit and display the frame.displaySurface.blit(pygameFrame, (0, 0))pygame.display.flip()def destroyWindow(self):pygame.display.quit()self._isWindowCreated = Falsedef processEvents(self):for event in pygame.event.get():if event.type == pygame.KEYDOWN and \self.keypressCallback is not None:self.keypressCallback(event.key)elif event.type == pygame.QUIT:self.destroyWindow()return
注意,我们使用了两个 Pygame 模块:pygame.display和pygame.event。
调用pygame.display.init()创建一个窗口,调用pygame.display.quit()销毁一个窗口。 重复调用display.init()无效,因为 Pygame 仅适用于单窗口应用。 Pygame 窗口的绘图表面类型为pygame.Surface。 为了获得对该Surface的引用,我们可以调用pygame.display.get_surface()或pygame.display.set_mode()。 后一个函数在返回实体之前修改Surface实体的属性。 一个Surface实体具有一个blit()方法,该方法将另一个Surface和一个坐标对作为参数,其中后一个Surface应被“变白”(绘制)到第一个上。 完成当前帧的窗口Surface的更新后,我们应该通过调用pygame.display.flip()来显示它。
通过调用pygame.event.get()可以轮询诸如keypresses之类的事件,该函数将返回自上次调用以来发生的所有事件的列表。 每个事件的类型均为pygame.event.Event,并具有属性 type,它指示事件的类别,例如pygame.KEYDOWN表示按键,pygame.QUIT 表示窗口的关闭按钮被点击。 取决于type的值,Event实体可能具有其他属性,例如,KEYDOWN事件的key(ASCII 键代码)。
相对于使用 HighGUI 的基本WindowManager而言,PygameWindowManager通过在每帧 OpenCV 的图像格式和 Pygame 的Surface格式之间进行转换而产生一些间接费用。 但是,PygameWindowManager提供正常的窗口关闭行为,而基础WindowManager不提供。
修改应用
让我们将cameo.py文件修改为使用PygameWindowManager而不是WindowManager。 在cameo.py中找到以下行:
from managers import WindowManager, CaptureManager
将其替换为:
from managers import PygameWindowManager as WindowManager, \CaptureManager
就这样! 现在,cameo.py使用一个 Pygame 窗口,当单击标准“关闭”按钮时,该窗口应该关闭。
Pygame 的进一步使用
我们仅使用了pygame.display和pygame.event模块的一些基本功能。 Pygame 提供了更多功能,包括:
- 绘制 2D 几何
- 绘制文字
- 管理可绘制 AI 实体(精灵)的分组
- 捕获与窗口,键盘,鼠标和操纵杆/游戏手柄相关的各种输入事件
- 创建自定义事件
- 播放和合成声音和音乐
例如,Pygame 可能是使用计算机视觉的游戏的合适后端,而 HighGUI 则不是。
总结
到现在为止,我们应该有一个应用,该应用使用 OpenCV 捕获(并可能操纵)图像,同时使用 Pygame 显示图像和捕获事件。 从这个基本的集成示例开始,您可能想扩展PygameWindowManager来包装其他 Pygame 功能,或者您想创建另一个WindowManager子类来包装另一个库。
附录 B:为自定义目标生成 Haar 级联
本附录显示了如何生成 Haar 级联 XML 文件,如第 4 章“使用 Haar 级联跟踪面部”中所使用的文件。 通过生成自己的级联文件,我们可以潜在地跟踪任何模式或对象,而不仅仅是面部。 但是,好的结果可能不会很快出现。 我们必须仔细收集图像,配置脚本参数,执行实际测试并进行迭代。 可能涉及大量的人工时间和处理时间。
收集正面和负面的训练图像
你知道抽认卡的教学法吗? 这是一种向幼儿教授单词和识别技巧的方法。 老师给全班同学展示了一系列图片,并说了以下内容:
“这是牛。Mo!这是马。Neigh!”
级联文件的生成方式类似于抽认卡教学法。 要学习如何识别母牛,计算机需要预先识别为母牛的正训练图像和预先识别为“非母牛”的负训练图像。 作为训练师,我们的第一步是收集这两套图像。
在确定要使用多少个正面训练图像时,我们需要考虑用户查看目标的各种方式。 理想,最简单的情况是目标是始终在平坦表面上的 2D 图案。 在这种情况下,一个正面的训练图像可能就足够了。 但是,在其他情况下,可能需要数百甚至数千张训练图像。 假设目标是您所在国家的国旗。 当在文档上打印时,标志的外观可能可预测,但是当在顺风飘扬的织物上打印时,标志的外观变化很大。 诸如人脸之类的自然 3D 目标的外观范围可能更大。 理想情况下,我们的一组正面训练图像应代表我们的相机可能捕获的许多变化。 可选地,我们的任何正面训练图像都可以包含目标的多个实例。
对于我们的负面训练集,我们需要大量图像,这些图像不包含目标的任何实例,但确实包含相机可能捕获的其他内容。 例如,如果一面旗帜是我们的目标,那么我们的负面训练集可能包括各种天气情况下的天空照片。 (天空不是旗帜,但经常在旗帜后面看到。)不过不要假设太多。 如果相机的环境无法预测,并且目标出现在许多设置中,请使用各种各样的负面训练图像。 考虑构建一套通用的环境图像,您可以在多个训练方案中重复使用这些图像。、
查找训练可执行文件
为了使级联训练尽可能自动化,OpenCV 提供了两个可执行文件。 它们的名称和位置取决于操作系统和 OpenCV 的特定设置,如以下两节所述。
在 Windows 上
Windows 上的两个可执行文件称为ONopencv_createsamples.exe和ONopencv_traincascade.exe。 它们不是预建的。 而是,仅当您从源代码编译 OpenCV 时,它们才存在。 根据您在第 1 章“设置 OpenCV”中选择的编译方法,它们的父文件夹是以下文件夹之一:
- MinGW:
<unzip_destination>\bin - Visual Studio 或 Visual C++ Express:
<unzip_destination>\bin\Release
如果要将可执行文件的文件夹添加到系统的Path变量中,请参考第 1 章,“设置 OpenCV”的“在 Windows XP,Windows Vista,Windows 7 和 Windows 8 上进行选择”部分的信息框中的说明。 否则,请注意可执行文件的完整路径,因为我们将需要在运行它们时使用它。
在 Mac,Ubuntu 和其他类似 Unix 的系统上
Mac,Ubuntu 和其他类似 Unix 的系统上的两个可执行文件称为opencv_createsamples和opencv_traincascade。 它们的父文件夹是以下文件夹之一,具体取决于您的系统和在第 1 章“设置 OpenCV”中选择的方法:
- 带有 MacPorts 的 Mac:
/opt/local/bin - 带有 Homebrew 的 Mac:
/opt/local/bin或/opt/local/sbin - 具有 Apt 的 Ubuntu:
/usr/bin - 使用我的自定义安装脚本的 Ubuntu:
/usr/local/bin - 其他类 Unix 系统:
/usr/bin和/usr/local/bin
除 Mac 带有 Homebrew 的情况外,默认情况下,可执行文件的文件夹应位于PATH中。 对于 Homebrew,如果要将相关文件夹添加到PATH,请参阅第 1 章,“设置 OpenCV”的“使用 Homebrew 和现成的包(不支持深度摄像头)”第二部分中的说明。 否则,请注意可执行文件的完整路径,因为我们需要在运行它们时使用它。
创建训练集和级联
此后,我们将这两个可执行文件称为<opencv_createsamples>和<opencv_traincascade>。 切记替换适合您的系统和设置的路径和文件名。
这些可执行文件具有某些数据文件作为输入和输出。 以下是生成这些数据文件的典型方法:
- 手动创建一个描述负面训练图像集的文本文件。 我们将此文件称为
<negative_description>。 - 手动创建一个描述正面训练图像集的文本文件。 我们将此文件称为
<positive_description>。 - 以
<negative_description>和<positive_description>作为参数运行<opencv_createsamples>。 该可执行文件将创建一个描述训练数据的二进制文件。 我们将后一个文件称为<binary_description>。 - 以
<binary_description>作为参数运行<opencv_traincascade>。 该可执行文件创建二进制级联文件,我们将其称为<cascade>。
我们可以选择<negative_description>,<positive_description>,<binary_description>和<cascade>的实际名称和路径。
现在,让我们详细了解三个步骤。
创建<negative_description>
<negative_description>是一个文本文件,列出了所有负面训练图像的相对路径。 路径应由换行符分隔。 例如,假设我们具有以下目录结构,其中<negative_description>是negative/desc.txt:
negativedesc.txtimagesnegative 0.pngnegative 1.png
然后,negative/desc.txt的内容可能如下:
"images/negative 0.png"
"images/negative 1.png"
对于少量图像,我们可以手动编写这样的文件。 对于大量图像,我们应该改用命令行来查找与特定模式匹配的相对路径,并将这些匹配输出到文件中。 继续我们的示例,我们可以通过在 Windows 的“命令提示符”中运行以下命令来生成negative/desc.txt:
> cd negative
> forfiles /m images\*.png /c "cmd /c echo @relpath" > desc.txt
请注意,在这种情况下,相对路径的格式为.\images\negative 0.png,这是可以接受的。
另外,在类似 Unix 的外壳中,例如 Mac 或 Ubuntu 上的 Terminal,我们可以运行以下命令:
$ cd negative
$ find images/*.png | sed -e "s/^/\"/g;s/$/\"/g" > desc.txt
创建<positive_description>
如果我们有多个正面训练图像,则需要使用<positive_description>。 否则,请继续下一节。 <positive_description>是一个文本文件,列出了所有积极训练图像的相对路径。 在每个路径之后,<positive_description>还包含一系列数字,这些数字指示在图像中找到了多少个目标实例,以及哪些子矩形包含了这些目标实例。 对于每个子矩形,数字按以下顺序排列:x,y,宽度和高度。 考虑以下示例:
"images/positive 0.png" 1 120 160 40 40
"images/positive 1.png" 2 200 120 40 60 80 60 20 20
在此,images/positive 0.png包含子矩形中目标的一个实例,该子矩形的左上角为(120, 160),右下角为(160, 200)。 同时,images/positive 1.png包含目标的两个实例。 一个实例位于子矩形中,该子矩形的左上角为(200, 120),而其右下角为(240, 180)。 另一个实例位于子矩形中,该子矩形的左上角为(80, 60),右下角为(100, 80)。
要创建这样的文件,我们可以以与<negative_description>相同的方式开始生成图像路径列表。 然后,我们必须基于对图像的专家(人类)分析,手动添加有关目标实例的数据。
通过运行<opencv_createsamples>创建<binary_description>
假设我们有多个正面训练图像,因此,我们创建了<positive_description>,现在可以通过运行以下命令来生成<binary_description>:
$ <opencv_createsamples> -vec <binary_description> -info <positive_description> -bg <negative_description>
另外,如果我们有一个正面的训练图像,我们将其称为<positive_image>,则应改为运行以下命令:
$ <opencv_createsamples> -vec <binary_description> -image <positive_image> -bg <negative_description>
对于其他<opencv_createsamples>标志(可选),请参见官方文档。
通过运行<opencv_traincascade>创建<cascade>
最后,我们可以通过运行以下命令生成<cascade>:
$ <opencv_traincascade> -data <cascade> -vec <binary_description> -bg <negative_description>
有关<opencv_traincascade>的其他(可选)标志的信息,请参见官方文档。
提示
发声
为了好运,在运行<opencv_traincascade>时发出模仿声音。 例如,说“ Moo!” 如果正面训练图像是母牛。
测试和改进<cascade>
<cascade>是与 OpenCV 的CascadeClassifier类的构造器兼容的 XML 文件。 对于如何使用CascadeClassifier的示例,请参考第 4 章“用 Haar 级联跟踪人脸”的FaceTracker实现。 。 通过复制和修改FaceTracker和Cameo,您应该能够创建一个简单的测试应用,该应用在跟踪的自定义目标实例周围绘制矩形。
也许在您第一次尝试级联训练时,您将不会获得可靠的跟踪结果。 要提高训练效果,请执行以下操作:
- 考虑使分类问题更具体。 例如,
bald, shaven, male face without glasses级联可能比普通的face级联更容易训练。 稍后,随着结果的改善,您可以尝试再次扩大问题范围。 - 收集更多的训练图像,更多!
- 确保
<negative_description>包含所有负面训练图像,仅包含负面训练图像。 - 确保
<positive_description>包含所有正面训练图像,仅包含正面训练图像。 - 确保
<positive_description>中指定的子矩形正确。 - 查看并尝试使用
<opencv_createsamples>和<opencv_traincascade>的可选标志。 这些标志在这个页面的官方文档中进行了描述。
祝你好运,寻找图像!
总结
我们已经讨论了用于生成与 OpenCV 的CascadeClassifier兼容的级联文件的数据和可执行文件。 现在,您可以开始收集您喜欢的事物的图像并为其训练分类器!
相关文章:
Python OpenCV 计算机视觉:6~7
原文:OpenCV Computer Vision with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最…...
LabView中数组的使用2-1
在LabView中,数组用来管理相同类型的数据。 1 在前面板中创建数组 1.1 创建空数组 在前面板中创建数组时,首先在前面板中点击鼠标右键,弹出“控件”对话框,之后选择“新式->数组、矩阵与簇->数组”,在前面板中…...
Android 10.0 系统systemui下拉通知栏的通知布局相关源码分析
1.前言 在android10.0的系统rom开发中,在进行systemui中的下拉通知栏的布局自定义的时候,对于原生systemui的 系统的下拉通知栏的通知布局的了解也是非常重要的,接下来就来分析下相关的下拉通知栏的通知布局的相关 源码流程,了解这些才方便对通知栏的布局做修改 2.系统…...
研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型)
研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型) 变量|常量与可变性变量声明案例为什么不可变变量可变(mut关键字)变量可变(覆盖) 常量声明 数据类型标量类型整型整型字面值整型溢出问…...
接口的多继承多实现
接口的多继承多实现 目录 接口的多继承多实现多继承(接口1 extends 接口2,接口3)多实现(实现类 实现 接口1,接口2)总结1.类与类的关系2.类和接口的关系3.接口与接口的关系 多继承(接口1 extends 接口2,接口…...
腾讯-iOS面试题-答案
一面 1、介绍一下实习的项目,任务分工,做了哪些工作?介绍实习内容 2、网络相关的:项目里面使用到什么网络库,用过ASIHTTP库吗 在iOS开发中,常用的网络库包括: URLSession:苹果官方提供的网络…...
SQL Server内存架构
2. 内存架构 所谓内存架构,这里是指SQL Server实例内存管理、使用与相关逻辑设计及实现等方面内容。更具体一点,就是讲SQL Server实例分配、管理和使用其内存空间的内部机制。本书1.1节中我们已经讲过,SQL Server实例包括多个内部机制各不相同的内存区域,在此,我们将讲解…...
有哪些功能强大,但是很小众的Python库呢?
Python生态系统中有很多小众但非常强大的库,一般,通俗的规律就是,越是高端,越小众,但是,高端不代表难学,只要理论到了,用起来照样嗖嗖的,以下是一些参考的高端小众库&…...
SpringBoot设计了哪些可拓展的机制?
SpringBoot核心源码 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { ...this.primarySources new LinkedHashSet(Arrays.asList(primarySources));// Servletthis.webApplicationType WebApplicationType.deduceFromClass…...
Layer组件多个iframe弹出层打开与关闭及参数传递
Layer官网地址:http://layer.layui.com/ 1、多个iframe弹出层(非嵌套) 1.打开iframe弹出层js代码 (1)示例一: content参数可传入要打开的页面,type参数传2,即可打开iframe类型的弹层…...
BearPi环境搭建及基本使用
这是一篇总结,一些坑的记录 具体教程请访问: BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com 第一步:安装虚拟机 不做赘述 第二步:下载资源 这里要用到ubuntu的一些基础知识,不会的…...
算法笔记-换根DP
换根DP 一般是给定一棵不定根树,求以每个节点为根的一些信息。可以通过二次扫描: 第一次扫描,任选一点为根,在有根树上,自底向上转移第二次扫描,从上一次扫描的根开始,自顶向下计算 P3478 [P…...
LeetCode 785. Is Graph Bipartite【DFS,二分图】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
【微信小程序】-- 分包 - 独立分包 分包预下载(四十五)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
2.3 连续性随机变量
思维导图: 学习目标: 我会按照以下步骤学习连续型随机变量: 复习概率论的基础知识,包括概率、期望、方差等概念和公式,以及离散型随机变量的概率分布函数和概率质量函数的概念和性质。 学习连续型随机变量的概念和性…...
【DES详解】(一)处理input block(64 bits)
一、DES 加密算法总览 0-1、初识置换 IP(Initial Permutation) 输入:明文(64 bits) 过程:初识置换 输出:处理后的明文permuted input(64 bits) 首先,对需要解…...
redis笔记——三种特殊的数据结构
三种特殊数据类型 geospatial(地理位置) 用于定位,附近的人,距离计算 添加元素 geoadd key 经度 纬度 描述名称,可一次添加多个元素 127.0.0.1:6379> geoadd china:city 113.28 23.12 guangzhou (integer) 1 1…...
网络安全之编码加密算法
网络安全之编码加密算法 一、ROT5/13/18/47编码转换二、MD5加密 一、ROT5/13/18/47编码转换 ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码,属于凯撒密码的一种。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览&…...
mp4视频无法播放的解决方法
mp4视频是我们日常工作生活中经常会遇到的视频格式,但如果遇到重要的mp4视频无法播放了,该怎么办呢?有mp4视频无法播放的解决方法吗?下面小编为大家整理了这个问题产生的原因以及相应的解决方法,让我们看一看。 什么情况下会导致mp4视频无法…...
搭建Mysql
登录root账号 su root #上传 mysql-advanced-5.7.17-linux-glibc2.5-x86_64.tar.gz #创建mysql的用户组/用户, data目录及其用户目录 groupadd mysql useradd -g mysql -d /home/mysql mysql mv mysql-advanced-5.7.17-linux-glibc2.5-x86_64 mysql mkdir /home/mysql/data…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
