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

240922-chromadb的基本使用

在这里插入图片描述

A. 背景介绍

ChromaDB 是一个较新的开源向量数据库,专为高效的嵌入存储和检索而设计。与其他向量数据库相比,ChromaDB 更加专注于轻量化、简单性和与机器学习模型的无缝集成。它的核心目标是帮助开发者轻松管理和使用高维嵌入向量,特别是与生成式 AI(如 GPT 系列)集成。

ChromaDB 的优点

  1. 简单易用

    • ChromaDB 提供了简单直观的 API,开发者可以快速上手。其轻量化设计使得在开发环境中运行和集成变得非常便捷。
    • 内置支持文本嵌入,特别适合 NLP 项目,与诸如 OpenAI 的 GPT 模型结合使用效果显著。
  2. 轻量级

    • 相较于 Milvus 和 Vespa 等重量级系统,ChromaDB 是一种轻量级的选择,不需要复杂的配置和大规模基础设施支持。非常适合小型或中型项目。
  3. 内置存储和检索功能

    • 提供了嵌入的持久化和检索功能,能够方便地将计算出的嵌入存储在数据库中,并进行高效的相似度查询。
    • 支持基于向量的最近邻搜索,查询性能相对较好。
  4. 无缝集成机器学习模型

    • ChromaDB 特别强调与各种生成式 AI 和嵌入模型的集成。可以轻松与 Hugging Face 等机器学习库和模型结合使用,用于 NLP、图像嵌入等。
  5. 灵活的存储后端

    • 它可以本地运行,也可以连接到其他数据库或存储后端(例如 SQLite 或 PostgreSQL),从而提供了更多的灵活性。
  6. 社区支持

    • 虽然相对较新,但 ChromaDB 的开发者活跃,社区在不断推动其更新与发展。

ChromaDB 的缺点

  1. 扩展性有限

    • ChromaDB 目前的扩展性不如 Milvus、Vespa 或 FAISS 等专为大规模向量处理设计的数据库。它更适合中小规模的数据集,在大规模场景下可能面临性能瓶颈。
  2. 功能相对较少

    • 相比于 Milvus 和 Weaviate 提供的混合查询功能,ChromaDB 主要专注于嵌入和向量搜索,不具备复杂的查询处理能力。
    • 不具备一些高级功能(如 Weaviate 的分类器或 Vespa 的实时处理能力)。
  3. 集群支持不完善

    • 目前 ChromaDB 不支持多节点集群部署,无法像 Milvus 和 Vespa 那样轻松处理跨多个节点的大规模数据查询。
  4. 成熟度不足

    • ChromaDB 相对较新,虽然社区活跃,但在稳定性、文档完善性和企业级使用上与成熟的向量数据库如 FAISS、Milvus 还有一定差距。
    • 缺少一些企业级功能,比如事务管理、备份和恢复等。
  5. 缺少 GPU 加速

    • 与 FAISS 的 GPU 支持不同,ChromaDB 当前主要是 CPU 驱动的,没有内置的 GPU 加速选项,在处理大型向量数据集时性能会受到限制。

与其他向量数据库的比较

数据库优点缺点适用场景
Milvus高可扩展性、支持多种向量索引、混合查询配置复杂、资源消耗较高大规模数据、复杂查询场景
FAISS支持 GPU 加速、高效的相似性搜索缺少数据库功能、没有持久化和集群支持高效向量搜索、需要 GPU 加速的场景
Weaviate支持混合查询、集成外部机器学习模型大规模处理能力有限语义搜索、知识图谱
Pinecone托管服务、简单易用、实时查询非开源、灵活性较低快速开发、无需自建基础设施
Vespa实时数据处理、复杂查询、机器学习集成系统复杂、维护成本高大规模数据实时处理
ChromaDB简单易用、轻量级、与生成式 AI 无缝集成、灵活存储选项扩展性有限、功能较少、缺少集群和 GPU 支持小中型项目、NLP 项目和嵌入管理

总结

ChromaDB 的优势在于轻量级、易于使用和与生成式 AI 的无缝集成,适合中小规模项目,尤其是需要处理嵌入和高维向量的 NLP 和图像嵌入任务。对于需要处理大规模数据、复杂查询、或 GPU 加速的应用,可能 Milvus 或 FAISS 会是更好的选择。如果你需要在快速开发环境中部署向量搜索或嵌入管理,ChromaDB 是一个简单有效的选择。

B. 基本使用

ChromaDB 是一个专门为向量数据库和嵌入查询优化的数据库。它可以与嵌入模型结合使用,存储和查询高维向量数据,通常用于大规模语义搜索、推荐系统等领域。

以下是使用 ChromaDB 的步骤:

1. 安装 ChromaDB

你可以通过 pip 安装 ChromaDB:

pip install chromadb

2. 创建一个数据库并插入数据

你需要创建一个 Chroma 的实例,然后可以在这个实例中创建一个集合并添加向量数据。

import chromadb# 创建 ChromaDB 客户端
client = chromadb.Client()# 创建一个集合,用于存储向量数据
collection = client.create_collection(name="my_collection")# 插入向量数据
documents = ["Document 1", "Document 2", "Document 3"]
embeddings = [[0.1, 0.2, 0.3],  # 向量 1[0.4, 0.5, 0.6],  # 向量 2[0.7, 0.8, 0.9],  # 向量 3
]
metadata = [{"source": "A"}, {"source": "B"}, {"source": "C"}]collection.add(documents=documents,    # 文本embeddings=embeddings,  # 对应的嵌入向量metadatas=metadata      # 附加的元数据
)

3. 查询向量

你可以根据提供的查询向量进行相似性搜索,查找与查询向量相似的文档。

query_embedding = [0.2, 0.3, 0.4]  # 你的查询向量# 搜索最相似的文档
results = collection.query(query_embeddings=[query_embedding],n_results=2  # 返回最相似的 2 个文档
)# 输出结果
print(results)

4. 更新与删除数据

你可以根据需要更新或删除某些向量或文档:

更新:
collection.update(ids=["id_of_document"],  # 要更新的文档的 iddocuments=["Updated document"],embeddings=[[0.9, 0.8, 0.7]],  # 更新后的嵌入向量
)
删除:
collection.delete(ids=["id_of_document"])  # 删除特定 ID 的文档

5. 获取集合中的数据

如果你想获取某个集合中的所有数据,可以使用以下方法:

all_docs = collection.get()
print(all_docs)

6. 使用 OpenAI 生成的嵌入向量

你还可以结合 OpenAI 等模型生成文本的嵌入向量,然后存储到 ChromaDB 中:

import openai# 使用 OpenAI 模型生成嵌入
response = openai.Embedding.create(model="text-embedding-ada-002",input="This is a sample document."
)embedding = response['data'][0]['embedding']

生成嵌入后,你可以将其插入到 ChromaDB 中,用于后续的查询和分析。

总结

ChromaDB 的主要功能包括:

  • 存储和管理高维向量数据。
  • 快速进行相似性搜索。
  • 结合嵌入模型,用于语义搜索、推荐等应用。

如果你有更具体的需求或场景,可以进一步定制使用 ChromaDB 的操作。

C. 持久化与增量更新

在 ChromaDB 中,要实现持久化增量更新,可以利用以下机制:

1. 持久化存储

ChromaDB 默认使用内存中的数据库来存储数据,但它也支持将数据持久化到磁盘,以便在应用重启后仍然保留数据。要实现持久化存储,你可以指定一个路径来保存数据。

import chromadb# 创建持久化的 ChromaDB 客户端,指定存储路径
client = chromadb.Client(persist_directory="./chromadb_data")# 创建或加载集合
collection = client.create_collection(name="my_collection")# 插入文档和向量
documents = ["Document 1", "Document 2"]
embeddings = [[0.1, 0.2, 0.3],[0.4, 0.5, 0.6],
]
metadata = [{"source": "A"}, {"source": "B"}]collection.add(documents=documents,embeddings=embeddings,metadatas=metadata
)# 调用这个方法来保存数据到磁盘
client.persist()

每当你更新或插入数据后,可以调用 client.persist() 将数据写入磁盘,这样即使程序关闭后,数据依然存在。

2. 增量更新

增量更新指的是当有新数据时,不必重写整个数据库,而只对新数据进行添加或修改。

增量插入新数据

你可以使用 collection.add() 方法来增量添加新文档和嵌入向量:

# 插入新的文档和嵌入
new_documents = ["Document 3"]
new_embeddings = [[0.7, 0.8, 0.9]]
new_metadata = [{"source": "C"}]# 增量添加到现有的集合中
collection.add(documents=new_documents,embeddings=new_embeddings,metadatas=new_metadata
)# 持久化保存增量更新的数据
client.persist()
更新现有的数据

如果你需要更新现有的文档或向量,可以使用 collection.update()

# 更新已有的文档,假设你要更新 ID 为 "doc_id_1" 的文档
collection.update(ids=["doc_id_1"],  # 更新文档的 IDdocuments=["Updated Document 1"],  # 新的文档内容embeddings=[[0.3, 0.4, 0.5]]  # 新的向量
)# 持久化保存更新
client.persist()
删除文档

如果需要删除某些文档,可以使用 collection.delete() 方法:

# 删除 ID 为 "doc_id_1" 的文档
collection.delete(ids=["doc_id_1"])# 持久化保存更新
client.persist()

3. 加载已有数据

当你启动应用时,ChromaDB 可以从指定的持久化路径中加载已经保存的数据:

# 创建持久化的 ChromaDB 客户端并加载数据
client = chromadb.Client(persist_directory="./chromadb_data")# 加载已有的集合
collection = client.get_collection(name="my_collection")# 现在你可以查询、更新或删除集合中的数据

总结

  1. 持久化:通过指定 persist_directory 来保存数据到磁盘,并使用 client.persist() 确保更新写入磁盘。
  2. 增量更新:可以使用 collection.add() 插入新数据,collection.update() 更新现有数据,或 collection.delete() 删除数据,增量更新不会影响已有数据。
  3. 加载持久化数据:在应用启动时,通过指定路径加载已经保存的数据库集合。

这种方式确保数据的持久性,并且支持高效的增量更新。

D. 其它向量数据库

向量数据库是一种专门用于存储和查询高维向量数据的数据库,广泛用于自然语言处理、图像检索、推荐系统等场景。常见的开源向量数据库包括 MilvusFAISSWeaviatePineconeVespa。下面是这些数据库的优点和缺点比较:

1. Milvus

Milvus 是一种高度可扩展的开源向量数据库,专为海量非结构化数据管理而设计,支持数十亿级别的向量数据管理。

  • 优点

    • 支持多种向量搜索算法(例如 IVF、HNSW 等),提供灵活的搜索选项。
    • 支持混合查询,可以对结构化和非结构化数据进行联合查询。
    • 高可扩展性,能够处理大规模数据。
    • 与其他大数据工具如 Spark 和 Kafka 集成良好。
    • 提供了完善的社区支持和丰富的 API(Python、Java、Go 等)。
  • 缺点

    • 资源消耗较高,部署和维护成本较大。
    • 相对较新的项目,尽管发展迅速,但某些高级功能可能还不如更成熟的系统稳定。

2. FAISS

FAISS 是 Facebook AI Research 团队开发的开源库,用于高效的相似性搜索和密集向量的聚类。

  • 优点

    • 支持大规模、高维向量搜索,并在 CPU 和 GPU 上都能高效运行。
    • 在搜索速度和精度上表现优异,尤其是在 GPU 加速下。
    • 支持多种索引类型,能够根据不同的场景选择合适的索引结构。
  • 缺点

    • 主要是一个库而非数据库,没有持久化存储机制,需要与其他存储系统结合使用。
    • 缺乏内置的多节点集群支持,扩展性不如 Milvus 等数据库。
    • 功能较单一,主要专注于向量相似度搜索,不支持混合查询或其他高级数据库功能。

3. Weaviate

Weaviate 是一个基于 GraphQL 和 RESTful API 的开源向量数据库,设计用于支持向量和结构化数据的混合查询。

  • 优点

    • 提供了向量搜索与结构化数据查询的强大结合,适合知识图谱和语义搜索。
    • 内置分类器,可以自动处理非结构化数据并生成向量表示。
    • 拥有高度扩展的插件系统,能够轻松集成外部机器学习模型或其他第三方工具。
  • 缺点

    • 对大规模数据集的处理能力较为有限,性能不如 Milvus 和 FAISS 强大。
    • 社区活跃度相对较低,功能更新速度和文档支持可能不足。

4. Pinecone

Pinecone 是一个向量数据库,尽管不是完全开源,但仍然在向量搜索领域有着广泛应用。其目标是提供一个托管的、可扩展的向量搜索平台。

  • 优点

    • 提供托管服务,开发者无需担心底层基础设施的维护和管理。
    • 高度可扩展,支持实时查询和批量插入大规模数据。
    • 提供简单易用的 API 和集成工具。
  • 缺点

    • 非完全开源,某些高级功能可能需要付费版本。
    • 灵活性较低,因为它是托管服务,用户无法直接控制底层架构。
    • 依赖于第三方服务,可能面临服务商锁定的风险。

5. Vespa

Vespa 是 Verizon Media 推出的一个开源的、大规模实时搜索和推荐引擎,适合复杂的向量搜索和大规模数据处理。

  • 优点

    • 支持实时和批量数据的处理,适合实时性要求高的场景。
    • 除了向量搜索,还支持结构化查询、机器学习模型推理等多种功能。
    • 高度可扩展,适合处理数十亿级别的文档和查询。
  • 缺点

    • 架构复杂,配置和维护成本较高。
    • 相对较重的系统,适用于大规模工业应用,可能不适合较小的数据集或简单的应用场景。

总结:

  • Milvus 适合大规模向量数据的处理,且支持混合查询,适合需要高可扩展性的场景。
  • FAISS 适合需要在 CPU/GPU 上进行高效向量相似性搜索的场景,但不具备数据库功能。
  • Weaviate 适合处理向量和结构化数据的混合查询,且易于扩展和集成。
  • Pinecone 适合需要托管服务并希望避免基础设施管理的用户,但它不是完全开源的。
  • Vespa 适合大规模复杂查询和实时处理场景,功能强大但架构复杂。

根据你的应用场景和需求,选择合适的向量数据库可以帮助你更好地处理高维向量数据和优化查询性能。

E. 参考文献

  • chroma-core/chroma: the AI-native open-source embedding database
  • alejandro-ao/langchain-ask-pdf: An AI-app that allows you to upload a PDF and ask questions about it. It uses OpenAI’s LLMs to generate a response.
  • VikParuchuri/marker: Convert PDF to markdown quickly with high accuracy
  • 240922-Ollama使用Embedding实现RAG-CSDN博客

相关文章:

240922-chromadb的基本使用

A. 背景介绍 ChromaDB 是一个较新的开源向量数据库,专为高效的嵌入存储和检索而设计。与其他向量数据库相比,ChromaDB 更加专注于轻量化、简单性和与机器学习模型的无缝集成。它的核心目标是帮助开发者轻松管理和使用高维嵌入向量,特别是与生…...

工厂模式和抽象工厂模式的实验报告

1. 实验结果: 记录并附上不同模型对象(例如:士兵、机器人、骑士)的展示效果截图。 2. 性能分析: 记录并比较抽象工厂模式与直接实例化的性能测试结果,分析它们在不同数量级对象创建时的开销与效益。 2.1…...

C标准库<string.h>-str、strn开头的函数

char *strcat(char *dest, const char *src) 函数功能 strcat 函数用于将一个字符串追加到另一个字符串的尾部。 参数解释 dest:指向目标字符串的指针,这个字符串的尾部将被追加 src 字符串的内容。src:指向源字符串的指针,其…...

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。 删除 Anaconda/Miniconda 1. 删除 Anaconda/Miniconda 文件和目录 打开 终端 并运行以下命令来删除安装目录。 对于 Anaconda,通常安装在 ~/anaconda3: rm -rf ~/anaconda3对于…...

【Harmony】轮播图特效,持续更新中。。。。

效果预览 swiper官网例子 Swiper 高度可变化 两边等长露出,跟随手指滑动 Swiper 指示器导航点位于 Swiper 下方 卡片楼层层叠一 一、官网 例子 参考代码: // xxx.ets class MyDataSource implements IDataSource {private list: number[] []cons…...

Go 并发模式:管道的妙用

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在编写程序时,我们通常不会一口气写出一个冗长的函数。相反,我们通过构建函数、结构体和方法等抽象来简化代码。这不仅有助于隐藏不重要的细节,还使我们能够专注于某一部分代码,而不必担心影响其他部分。然而…...

CAN通信详解

1、CAN介绍 1.1、什么是CAN? CAN(Controller Area Network) 即控制器局域网,是ISO国际标准化的串行通信协议。 开发目的:为了满足汽车产业的“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”…...

52 文本预处理_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录一、理论部分二、代码读取数据集词元化词表整合所有功能小结练习 一、理论部分 对于序列数据处理问题,我们在序列处理中评估了所需的统计工具和预测时面临的挑战。 …...

【python】字符串扩展-格式化的精度控制

字符串扩展 字符串的三种定义方式字符串拼接字符串格式化格式化的精度控制字符串格式化方式2对表达式进行格式化 学习目标 掌握格式化字符串的过程中做数字的精度控制 字符串格式化 name "小明" set_up_year 2006 stock_price 19.99 message "我是&…...

C++第一次练习

题目1 class Solution { public:bool isletter(char s){if(s<z&&s>a)return true;if(s>A&&s<Z)return true;return false;}string reverseOnlyLetters(string s) {if(s.empty()){return s;}int left,right;left0;rights.size()-1;while(left<ri…...

计算机毕业设计 基于Python的医疗预约与诊断系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

JAVA基础:正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点

1 String中的常用方法2 1.1 split方法 将字符串按照指定的内容进行分割&#xff0c;将分割成的每一个子部分组成一个数组 分割内容不会出现在数组中 实际上该方法不是按照指定的简单的符号进行分割的&#xff0c;而是按照正则表达式进行分割 1.2 正则表达式 用简单的符号组合…...

前端接口报错302 [已解决]

前端接口报错302 [已解决] 在前端开发中&#xff0c;与后端接口的交互是项目成功的关键。然而&#xff0c;遇到如302这样的状态码报错时&#xff0c;可能会让开发者感到困惑。本文将通过详细解析和多个代码案例&#xff0c;帮助你深入理解前端接口报错302&#xff0c;并提供有效…...

【网络安全】利用未授权API接口实现创建Support Ticket

未经许可,不得转载。 文章目录 正文目标为一个技术平台,客户可以通过该平台预订不同类型的服务。 正文 redacted.com 是主域,但所有流量都通过 api.redacted.com。我过去曾使用该公司预订了一些服务,因此我的帐户中有预订历史。 我对我的订单开具了 Support Ticket,此时…...

气压高度加误差的两种方法(直接添加 vs 换算到气压误差),附MATLAB程序

在已知高度真实值时,如果需要计算此高度下的气压计误差,可考虑本文所述的两种方法 气压高度 气压与高度之间的关系可以用大气压的垂直变化来描述。随着高度的增加,气压通常会下降。这是因为空气的密度在高度增加时减少,导致上方空气柱对下方空气施加的压力减小。 主要关系…...

Word 制作会议名牌教程

文章目录 Part.I IntroductionPart.II 制作步骤 Part.I Introduction 本文详细介绍了如何用 Word 制作会议名牌&#xff0c;附有笔者制作好的一个成品&#xff08;戳我下载~&#xff09;。 下面是一些常识 会议名牌尺寸&#xff1a;100mm 180mm Part.II 制作步骤 1、新建文…...

浮动静态路由

浮动静态路由 首先我们知道静态路由的默认优先级是60&#xff0c;然后手动添加一条静态路由优先级为80的路由作为备份路由。当主路由失效的备份路由就会启动。 一、拓扑图 二、基本配置 1.R1: <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet…...

JavaWeb初阶 day1

目录 tomcat目录结构 tomcat:web服务器软件 项目部署的方式 直接将项目放到webapps下 配置conf/server.xml文件 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写 静态项目和动态项目 Servlet Servlet执行原理 Servlet方法&#xff08;生命周期&#x…...

OpenAPI鉴权(二)jwt鉴权

一、思路 前端调用后端可以使用jwt鉴权&#xff1b;调用三方接口也可以使用jwt鉴权。对接多个三方则与每个third parth都约定一套token规则&#xff0c;因为如果使用同一套token&#xff0c;token串用可能造成权限越界问题&#xff0c;且payload交叉业务不够清晰。下面的demo包…...

【Rust练习】16.模式

文章题目来自&#xff1a;https://practice-zh.course.rs/pattern-match/patterns.html 1 &#x1f31f;&#x1f31f; 使用 | 可以匹配多个值, 而使用 … 可以匹配一个闭区间的数值序列 fn main() {} fn match_number(n: i32) {match n {// 匹配一个单独的值1 > println!(…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...