当前位置: 首页 > news >正文

OpenCV的grabCut算法分割图像

OpenCV计算机视觉开发实践:基于Qt C++ - 商品搜索 - 京东

基本概念

使用grabCut算法可以用最小程度的用户交互来分解前景。从用户角度来看,grabCut算法是怎么工作的呢?首先画一个矩形方块把前景图圈起来,前景区域应该完全在矩形内;然后算法反复进行分割以达到最好的效果。但是,有些情况下分割得不是很好,比如把前景标成背景了,这种情况下用户需要再润色,就是在图像上有缺陷的地方画几笔。这几笔的意思是说“嘿,这个区域应该是前景,你把它标成背景了,下次迭代改过来”或者是反过来。那么下次迭代的结果会更好。比如图9-14所示的图像。

图9-14

 

首先将球员和足球包含在蓝色矩形框里,然后用白色笔(指出前景)和黑色笔(指出背景)来做一些润色。后台会发生什么呢?

(1)用户输入矩形,矩形外的所有东西都被确认是背景,矩形内的所有东西都是未知的。同样地,任何用户输入指定的前景和背景也都被认为是硬标记,在处理过程中不会变。

(2)计算机会根据我们给的数据做初始标记,它会标记出前景和背景像素。

(3)现在会使用高斯混合模型(GMM)来为前景和背景建模。

(4)根据我们给的数据,GMM学习和创建新的像素分布,未知像素被标为可能的前景或可能的背景(根据其他硬标记像素的颜色统计和它们之间的关系)。根据这个像素分布创建一幅图,图中的节点是像素。另外还有两个节点,即源节点和汇节点,每个前景像素和源节点相连,每个背景像素和汇节点相连。

(5)源节点和汇节点连接的像素的边的权重由像素是前景或者背景的概率决定。像素之间的权重是由边的信息或者像素的相似度决定。如果像素颜色有很大差异,它们之间的边的权重就比较低。

(6)最小分割算法是用来分割图的,它用最小成本函数把图切成两个分开的源节点和汇节点,成本函数是被切的边的权重之和。切完以后,所有连到源节点的像素称为前景,所有连到汇节点的像素称为背景。

(7)过程持续进行,直到分类覆盖。

整个过程如图9-15所示。

 grabCut函数

grabCut算法是Graphcut算法的改进,Graphcut是一种直接基于图割算法的图像分割技术,只需确认前景和背景的输入,该算法就可以完成前景和背景的最优分割。grabCut算法利用图像中的纹理(颜色)信息和边界(反差)信息,只需少量的用户交互操作,即可获得较好的分割结果。与分水岭算法相比,grabCut的计算速度较慢,但能够提供更精确的分割结果。如果要从静态图像中提取前景物体(如从一幅图像剪切物体到另一幅图像),采用grabCut算法是最好的选择。其用法很简单,只需输入一幅图像,并对一些像素进行标记,指明其属于背景或前景,算法就会根据这些局部标记计算出整个图像中前景和背景的分割线。现在我们用OpenCV来实现grabCut算法。OpenCV中有一个函数grabCut,其声明如下:

void grabCut( InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode = GC_EVAL );

参数说明如下:

  • img:表示输入图像。
  • mask:表示输出掩码,如果使用掩码进行初始化,那么mask保存初始化掩码信息。在执行分割的时候,也可以将用户交互所设定的前景与背景保存到mask中,然后再传入grabCut函数,在处理结束之后,mask中会保存结果。mask只能取以下4种值:GCD_BGD(=0)表示背景,GCD_FGD(=1)表示前景,GCD_PR_BGD(=2)表示可能的背景,GCD_PR_FGD(=3)表示可能的前景。如果没有手动标记GCD_BGD或者GCD_FGD,那么结果只会有GCD_PR_BGD或GCD_PR_FGD。
  • rect:表示用户选择的前景矩形区域,包含分割对象的矩形ROL,矩形外部的像素为背景,矩形内部的像素为前景,当参数mode= GC_INIT_WITH_RECT时使用。
  • bgModel:表示输出背景图像。
  • fgModel:表示输出前景图像。
  • iterCount:表示迭代次数。
  • mode:表示用于指示grabCut函数进行什么操作,可选的值有GC_INIT_WITH_RECT(=0),表示用矩形窗初始化grabCut;GC_INIT_WITH_MASK(=1)表示用掩码图像初始化GrabCut;GC_EVAL(=2)表示执行分割。

可以按以下方式来使用grabCut函数:

(1)用矩形窗或掩码图像初始化grabCut。

(2)执行分割。

(3)如果对结果不满意,在掩码图像中设定前景和(或)背景,再次执行分割。

(4)使用掩码图像中的前景或背景信息。

利用grabCut函数做图像分割时,通常还需要和compare函数联合作战。compare函数主要用于在两个图像之间进行逐像素的比较,并输出比较的结果,其声明如下:

void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop);

其中参数src1表示原始图像1(必须是单通道)或者一个数值,比如是一个Mat或者一个单纯的数字n;src2表示原始图像2(必须是单通道)或者一个数值,比如是一个Mat或者一个单纯的数字n;dst表示结果图像,类型是CV_8UC1,即单通道8位图,大小和src1、src2中最大的那个一样,比较结果为真的地方值为255,否则为0;cmpop表示操作类型,有以下几种类型:

enum { CMP_EQ=0,    // 相等CMP_GT=1,       // 大于CMP_GE=2,       // 大于或等于CMP_LT=3,       // 小于CMP_LE=4,       // 小于或等于CMP_NE=5 };     // 不相等

从参数的要求可以看出,compare函数只对以下3种情况进行比较:

1)array和array

此时输入的src1和src2必须是相同大小的单通道图,否则没办法进行比较。计算过程如下:

dst(i) = src1(i) cmpop src2(i)

也就是对src1和src2逐像素进行比较。

2)array和scalar

此时array仍然要求是单通道图,大小无所谓,因为scalar只是一个单纯的数字而已。比较过程是把array中的每个元素逐一和scalar进行比较,所以此时的dst大小和array是一样的。计算过程如下:

dst(i) = src1(i) cmpop scalar

3)scalar和array

这个就是第2种情况的反过程了,只是比较运算符cmpop左右的参数顺序不一样而已。计算过程如下:

dst(i) = scalar cmpop src2(i)

这个函数有一个很有用的地方就是:当你需要从一幅图像中找出某些特定像素值的像素时,可以用这个函数。它与threshold()函数类似,但是threshold()函数是对某个区间内的像素值进行操作,而compare()函数可以只是对某一个单独的像素值进行操作。比如我们要从图像中找出像素值为50的像素点,可以像下面这样做:

Mat result;compare(image,50, result, cv::CMP_EQ);

【例9.6】利用grabCut做分割

   新建一个控制台工程,工程名是test。

   打开main.cpp,输入如下代码:

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/imgproc/types_c.h>
#include <iostream>
using namespace std;
using namespace cv;int main()
{Mat src = imread("bird.jpg");Rect rect(84, 84, 406, 318);// 左上坐标(X,Y)和长宽Mat result, bg, fg;grabCut(src, result, rect, bg, fg, 1, GC_INIT_WITH_RECT);imshow("grab", result);/*threshold(result, result, 2, 255, CV_THRESH_BINARY);imshow("threshold", result);*/// result和GC_PR_FGD对应像素相等时,目标图像中该像素值置为255compare(result, GC_PR_FGD, result, CMP_EQ);imshow("result", result);Mat foreground(src.size(), CV_8UC3, Scalar(255, 255, 255));src.copyTo(foreground, result);// copyTo有两种形式,此形式表示result为maskimshow("foreground", foreground);waitKey(0);return 0;
}

在上述代码中,首先加载了图片test.jpg,然后使用函数grabCut从原图中复制可能的前景到结果图像中。函数compare在两个图像之间进行逐像素的比较,并输出比较的结果。这里result和GC_PR_FGD对应像素相等时,目标图像的像素值置为255。最后把前景复制到矩阵foreground中,并进行显示。

​​​​​​​    保存工程并运行,结果如图9-16所示。

图9-16

 

相关文章:

OpenCV的grabCut算法分割图像

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 基本概念 使用grabCut算法可以用最小程度的用户交互来分解前景。从用户角度来看&#xff0c;grabCut算法是怎么工作的呢&#xff1f;首先画一个矩形方块把前景图圈起来&#xff0c;前景区域应该完全在矩形内…...

[计算机科学#6]:从锁存器到内存,计算机存储的构建与原理

【核知坊】&#xff1a;释放青春想象&#xff0c;码动全新视野。 我们希望使用精简的信息传达知识的骨架&#xff0c;启发创造者开启创造之路&#xff01;&#xff01;&#xff01; 内容摘要&#xff1a;在上一篇文章中&#xff0c;我们深入了解了计算机如…...

练习001

目录 前言 数字诗意 分析 代码 封闭图形个数 分析 代码 回文数组 分析 代码 商品库存管理 分析 代码 挖矿 分析 代码 回文字符串 分析 代码 前言 好久不更新了&#xff0c;今天来更新一下。 当然不是主包偷懒啊&#xff0c;是最近的事情实在是有点多QAQ。…...

【Linux调整FTP端口】

Linux调整FTP端口 一、确保新端口未被占用在修改端口之前&#xff0c;可以使用以下命令检查端口是否被占用&#xff1a; 二、修改vsftpd配置文件1. 打开vsftpd配置文件2. 找到并修改端口配置3. 保存并退出4. 重启vsftpd服务 三、配置防火墙 在Linux系统中修改FTP端口&#xff0…...

spring中的@Configuration注解详解

一、概述与核心作用 Configuration是Spring框架中用于定义配置类的核心注解&#xff0c;旨在替代传统的XML配置方式&#xff0c;通过Java代码实现Bean的声明、依赖管理及环境配置。其核心作用包括&#xff1a; 标识配置类&#xff1a;标记一个类为Spring的配置类&#xff0c;…...

AI中常用概念的理解

1. RAG&#xff08;检索增强生成&#xff09; 通俗理解&#xff1a;就像你写作业时&#xff0c;先查课本 / 百度找资料&#xff0c;再根据资料写答案&#xff0c;而不是纯靠记忆瞎编。 AI 模型&#xff08;比如 ChatGPT&#xff09;回答问题时&#xff0c;先去 “数据库 / 互联…...

JWT GenTokenParseToken

JWT(Json Web Token) 获取Token、解密Token jwt.go package jwtimport ("errors""time""github.com/golang-jwt/jwt/v5" )var jwtSecret []byte("secret")type CustomClaims struct {Username string json:"username"jw…...

ROS:发布相机、IMU等设备消息主题

文章目录 📚简介📷发布相机消息主题🌐网络相机🚀RTSP🔌串口设备🧩 踩坑📚简介 使用ROS系统录制rosbag包,需要发布设备消息主题,才能使用rosbag record命令录制rosbag包。 📷发布相机消息主题 获取相机视频流的方式有多种,主要包含: 网络相机,使用RTSP…...

C++好用的打印日志类

在项目中,调试打印十分重要,这里分享一个自己写的简单但是实用的打印日志类,控制台打印时间戳具体内容保存文件 1.相关库介绍及其基本用法 a.<iostream> 功能&#xff1a;提供基本的输入输出流功能&#xff0c;如std::cout用于控制台输出&#xff0c;std::cin用于控制台输…...

晶振:从消费电子到航天领域的时间精度定义者

从手表到卫星&#xff1a;晶振如何在不同领域定义时间精度 在时间的长河中&#xff0c;人类对时间精度的追求永无止境。从古老的日晷到如今精密的计时仪器&#xff0c;每一次进步都离不开技术的革新。而晶振&#xff0c;作为现代计时的核心元件&#xff0c;在不同领域发挥着至…...

huggingface下载数据和模型,部分下载,本地缓存等常见问题踩坑

huggingface 注&#xff1a;系统环境为windows11 23H2&#xff0c;macOS和Linux用户可以查看下【参考】里的链接文档&#xff0c;差异不大 安装huggingface-cli 虽然可以通过代码下载模型和数据集&#xff08;下文会提及&#xff09;&#xff0c;但我依然推荐你用此方法来管理…...

分布式架构:Dubbo 协议如何做接口测试

传统单体架构是一个应用程序进程内处理完所有的逻辑&#xff1a;一个系统糅合了多个功能&#xff0c;如注册 --登录–充值–余额管理–用户积分等&#xff0c;所有的功能模块都是在一个应用程度里处理完的&#xff1b;一个请求过来–> 到应用程序系统–>数据库处理–>…...

Python math 库教学指南

Python math 库教学指南 一、概述 math 库是 Python 标准库中用于数学运算的核心模块&#xff0c;提供以下主要功能&#xff1a; 数学常数&#xff08;如 π 和 e&#xff09;基本数学函数&#xff08;绝对值、取整等&#xff09;幂与对数运算三角函数双曲函数特殊函数&…...

Antd Upload组件连续回车会多次触发文件夹弹窗的bug修复

看了看issue一大堆&#xff0c;没一个解决的&#xff0c;真恼火&#xff1a;Upload 上传组件&#xff0c;当上传完一个文件后&#xff0c;我按下键盘回车键&#xff0c;自动又打开了“选择文件窗口”&#xff0c;点击“选择文件窗口”下面的取消按钮&#xff0c;再次打开了“选…...

数据仓库与数据湖的对比分析

目录 一、数据来源 数据仓库 数据湖 二、数据模式转换时机 数据仓库 数据湖 三、数据存储成本 数据仓库 数据湖 四、数据质量 数据仓库 数据湖 五、面向用户 数据仓库 数据湖 六、主要支撑的应用类型 数据仓库 数据湖 在企业数据管理领域&#xff0c;数据仓库…...

Windows系统下MinerU的CUDA加速配置指南

Windows系统下MinerU的CUDA加速配置指南 快速解锁GPU性能,提升文档解析效率 1、简介 MinerU是一款高效的文档解析工具,支持通过CUDA加速显著提升处理速度。本指南详细说明如何在Windows系统中配置CUDA环境,并启用MinerU的GPU加速功能,帮助用户充分利用NVIDIA显卡的计算能…...

LeetCode路径总和系列问题解析:I、II、III的解决方案与优化

文章目录 引言一、路径总和 I&#xff08;LeetCode 112&#xff09;问题描述方法思路Java代码实现复杂度分析 二、路径总和 II&#xff08;LeetCode 113&#xff09;问题描述方法思路Java代码实现复杂度分析 三、路径总和 III&#xff08;LeetCode 437&#xff09;问题描述方法…...

【漫话机器学习系列】233.激活阈(Threshold Activation)

深度学习入门&#xff1a;了解“阈值激活函数”&#xff08;Threshold Activation Function&#xff09; 激活函数是神经网络中至关重要的一环。今天&#xff0c;我们通过一幅简单直观的手绘图&#xff0c;一起理解最早期也最基础的激活函数之一 —— 阈值激活函数&#xff08;…...

使用vue开发electron

1.全局安装electron npm i electron -g 查看是否安装成功 electron -v 在vue项目中添加electron模块 vue add electron-builder 添加成功后&#xff0c;目录中多了background.js文件 可以在background.js配置 例如 窗口大小&#xff0c;是否可以缩放&#xff0c;是否可以移…...

安全企业内部im,BeeWorks即时通讯

BeeWorks企业即时通讯软件具备哪些优势&#xff1f; 1. 多样的沟通方式 文本消息&#xff1a;支持发送文字消息&#xff0c;包括富文本格式&#xff08;如加粗、斜体、下划线、颜色等&#xff09;。 语音消息&#xff1a;支持发送语音消息&#xff0c;方便快捷&#xff0c;适…...

网易爆米花 1.8.8 | 免费无广告,支持多网盘聚合和智能刮削技术,提供顶级画质和逼真音效的影视管理应用

网易爆米花TV是一款专为家庭设计的影视管理应用&#xff0c;旨在提供一个简洁易用的家庭影视库。它支持从多个网盘&#xff08;如阿里、百度、天翼等&#xff09;、WebDAV以及本地资源导入&#xff0c;聚合用户的影视资源&#xff0c;并通过智能刮削技术将视频信息形成精美的影…...

蓝牙语音遥控国产适用芯片HS6621

蓝牙语音遥控器一般是通过按下语音键&#xff0c;遥控器会发送一个 HID 编码通知智能电视或者机顶盒打开识音功能&#xff0c;此时&#xff0c;遥控器LED灯保持闪烁或者长亮&#xff0c;用户开始录音同时将语音数据上传给智能电视或者机顶盒。而智能电视或者机顶盒&#xff0c;…...

【Vue2】1-创建一个Vue实例

Vue2官方文档 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…...

销售与金融领域的数据处理与分析方法

一、引言 在销售和金融领域&#xff0c;除了常见的同比、环比和移动平均等数据处理方法外&#xff0c;还有众多方法可供选择&#xff0c;这些方法分布于不同的专业方向&#xff0c;旨在帮助分析和解决问题&#xff0c;以下将按类别对这些方法进行详细梳理。 二、按类别划分的…...

DataWorks Copilot 集成 Qwen3-235B-A22B混合推理模型,AI 效能再升级!

刚刚&#xff0c;阿里云一站式智能大数据开发治理平台 DataWorks 正式接入 Qwen3 模型&#xff0c;可支持235B最大尺寸。用户通过 DataWorks Copilot 智能助手即可调用该模型&#xff0c;通过自然语言交互完成多种代码操作&#xff0c;实现数据开发、数据分析的快速实现。 Qwen…...

芯片软错误概率探究:基于汽车芯片安全设计视角

摘要&#xff1a; 本文深入剖析了芯片软错误概率问题&#xff0c;结合 AEC-Q100 与 IEC61508 标准&#xff0c;以 130 纳米工艺 1Mbit RAM 芯片为例阐述其软错误概率&#xff0c;探讨汽车芯片安全等级划分及软错误对汽车关键系统的影响&#xff0c;分析先进工艺下软错误变化趋势…...

青少年抑郁症患者亚群结构和功能连接耦合的重构

目录 1 研究背景及目的 2 研究方法 2.1 数据来源与参与者 2.1.1 MDD患者&#xff1a; 2.1.2 健康对照组&#xff1a; 2.2 神经影像分析流程 2.2.1 图像采集与预处理&#xff1a; 2.2.2 网络构建&#xff1a; 2.2.3 区域结构-功能耦合&#xff08;SC-FC耦合&#xff09…...

汽车OTA在线升级法规分析

摘要 本文介绍了R156法规即《关于批准车辆的软件升级和软件升级管理体系统一规定的法规》、该法规专注于汽车软件升级功能&#xff0c;并为此提出了一系列具体要求&#xff0c;旨在确保软件升级流程的安全性、可控性和合规性&#xff0c;从而顺应汽车行业智能化、联网化的发展趋…...

【上海大学数据库原理实验报告】MySQL基础操作

实验目的 熟悉MySQL基础操作。 实验内容 创建四张工程项目的关系表。 图 1 四张工程项目关系表的结构 检索供应零件编号为J1的工程的供应商编号SNO。检索供应零件给工程J1&#xff0c;且零件编号为P1的供应商编号SNO。查询没有正余额的工程编号、名称及城市&#xff0c;结果…...

FUSE 3.0.0 | 聚合7大直播平台的免费电视直播软件,支持原画清晰度及弹幕、收藏功能

FUSE是一款第三方娱乐直播软件&#xff0c;它聚合了多个直播平台的内容&#xff0c;为用户提供丰富的观看选择。首次进入软件后点击左上角logo&#xff0c;然后点击‘我已诚信付款&#xff0c;解锁LIVEPRO’按钮即可解锁所有功能。该软件聚合了7大直播平台&#xff0c;每个平台…...

在企业微信中,回调地址 redirect_uri 是允许包含端口号

在企业微信中&#xff0c;回调地址&#xff08;redirect_uri&#xff09;允许包含端口号的原因主要有以下几点&#xff1a; 1. 企业微信的开放设计 企业微信对回调地址的校验相对灵活&#xff0c;允许开发者根据实际业务需求配置带端口号的域名。这与部分严格限制端口的平台&a…...

Rust 学习笔记:枚举与模式匹配

Rust 学习笔记&#xff1a;枚举与模式匹配 Rust 学习笔记&#xff1a;枚举与模式匹配定义枚举&#xff08;Enum&#xff09;枚举变量Option 枚举及其相对于 NULL 的优势match 和枚举与 Option\<T\> 匹配match 应该是详尽的Catch-all 模式和 _ 占位符使用 if let 和 let e…...

UI自动化测试的优势

1. UI自动化测试的优势(提升效率的场景) ✅ 适合自动化的场景 (1) 高频回归测试 典型场景:每次版本迭代都要验证的核心功能(如登录、支付流程)。 效率提升:自动化脚本执行速度远高于手动测试,尤其适合敏捷开发中的快速验证。 (2) 跨平台/多环境测试 典型场景:需要在不…...

【Android】轻松实现实时FPS功能

文章目录 实时FPS 实时FPS 初始化 choreographer Choreographer.getInstance();lastFrameTimeNanos System.nanoTime();choreographer.postFrameCallback(frameCallback);监听并显示 Choreographer.FrameCallback frameCallback new Choreographer.FrameCallback() {Overri…...

BI平台是什么意思?一文讲清BI平台的具体应用!

目录 一、BI平台是什么意思 1. 基本概念 2. 核心功能 3. 重要性 二、BI平台的分类 1. 按部署方式分类 2. 按功能特点分类 3. 按行业应用分类 三、BI平台的使用场景 1. 销售与营销分析 2. 财务分析 3. 人力资源管理 4. 供应链管理 5. 运营管理 总结 “BI 平台是什…...

玩转MCP

玩转MCP 0.环境1.自定义stdio交互1.1.server1.2.client1.3.效果 2.自定义sse交互2.1.server2.2.client2.3.效果 3.使用官方文件 mcp火了好一阵了&#xff0c;最近一直在大院干活儿&#xff0c;好不容易抽出时间&#xff0c;赶紧来学习学习。 官方文档&#xff0c; mcp广场可以…...

2025华东杯A/B/C题解题思路+可运行代码参考

A题:跳台滑雪问题 选题分析: 跳台滑雪问题涉及物理学、运动学和优化算法。需要建立数学模型来分析运动员在不同阶段的最佳姿势和策略,以提高运动成绩。问题分为三个小问,分别是助滑坡姿势、空中飞行控制和着陆策略。 解题思路: 1. 助滑坡姿势: 分析助滑坡的物理特性,…...

IsaacLab最新2025教程(7)-创建Interactive Scene

在isaaclab中创建的强化学习训练环境有两种&#xff1a;direct workflow&#xff0c;风格与isaacgym一样。另外一种是manager-based workflow更加模块化&#xff0c;它主要是两部分包括仿真环境也就是即将介绍的interactive scene&#xff0c;与mdp的内容&#xff0c;比如奖励函…...

Linux远程管理

1.网络管理获取计算机的网络信息基本语法&#xff1a;windows ipconfig<img src"ReadMe.assets/image-20250318152355476.png" alt"image-20250318152355476" style"zoom:33%;" />powershell ifconfig 也可以通过上面的网络处获取powershe…...

双指针(4)——盛水最多的容器

题目&#xff1a; 这题可以暴力枚举&#xff0c;但会超时&#xff0c;所以我们要用其他方法。 我们就用示例1的数组为例&#xff0c;我们先取出一部分研究。 虽然我们不能用暴力枚举&#xff0c;但可以借用其思想。 对于6和4组成的容器&#xff0c;它可以储存24个单位的水。…...

sd webui 安装插件sd-webui-EasyPhoto依赖安装失败解决办法

在最新版的SD webui中&#xff0c;可以安装easyphoto插件&#xff0c;官方建议通过github安装&#xff0c;对无法科学上网的用户很不友好。对我自己来说是通过地址&#xff1a; https://gitee.com/wowai/sd-webui-EasyPhoto.git 分支&#xff1a;anyid 点击安装即可。 在安装…...

虚拟机对前端开发的实用价值:提升效率与解决痛点的完整指南

作为前端开发者&#xff0c;虚拟机可能不是你日常工作的核心工具&#xff0c;但它确实能在多个方面为前端开发提供强大支持。下面我将详细解析虚拟机如何帮助前端开发者提升工作效率、解决开发难题。 一、跨浏览器/跨平台测试环境搭建 1.1 多浏览器测试 真实IE测试&#xff…...

用Playwright自动化网页测试,不只是“点点点”

如果你接触过网页自动化测试&#xff0c;可能听说过 Selenium、Puppeteer 这些工具。但最近几年&#xff0c;一个新的开源项目在测试圈子里悄然兴起——它就是 Playwright 。 Playwright 是微软开发的一个自动化库&#xff0c;支持多种浏览器&#xff08;包括 Chrome、Firefox…...

合并两个有序数组

题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并…...

系统思考:局部最优与全局失衡

最近遇到一家创业公司的创始人&#xff0c;在复盘时说了一句扎心的话&#xff1a;“我们真的已经很努力了&#xff0c;大家每天都在拼&#xff0c;连周末都不休息……但事还是做不完&#xff0c;进展还是很慢。” 我和几个关键岗位员工聊了聊&#xff0c;他们也说&#xff1a;“…...

Windows 系统中安装 flash - attn

#工作记录 一、下载 flash_attn 在 Windows 系统中&#xff0c;直接使用 pip 在线安装 flash_attn 很可能失败。 建议从 kingbri1/flash-attention 的 GitHub 发布页面 下载与当前 Python、torch 和 CUDA 版本匹配的 .whl 文件&#xff0c;并从本地进行安装。 Linux版本&am…...

理想药用植物的特征综述-理想中药材”的系统定义-文献精读125

Decoding and designing: Promising routes to tailor-made herbs 解码与设计&#xff1a;定制化草药的潜力路径 摘要 理想药用植物的特征可归纳为高次生代谢产物含量、高抗逆性、理想的形态以及高产量。本研究提出了两种策略&#xff0c;用于解析中药活性成分的生物合成与质…...

Cline原理分析-prompt

Cline 抓包-prompt原文 You are Cline, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. TOOL USE You have access to a set of tools that are executed upon the user’s…...

allegro 怎样显示/隐藏铜皮shape?

1、setup–>User preferences&#xff1b; 2、Display -->shape_fill &#xff1b; 3、5个方框打“√”代表隐藏铜皮&#xff1b; 4、不打√代表显示铜皮;...

URP - 公告牌的效果实现

效果&#xff1a; 【太妃糖耶】我的最新作品&#xff0c;快来一睹为快&#xff01; 原理&#xff1a;使面片的正面永远跟随摄像机的旋转 首先我们可以了解一下顶点旋转的原理 B点是由原坐标系中的基向量和A点坐标值相乘得到的 当旋转此基向量后&#xff0c;B点的坐标值会发生…...