opencv基础47 查找图像轮廓cv2.findContours()详解

news2024/12/23 13:30:16

什么是图像轮廓?

图像轮廓是指图像中物体边缘的连续性曲线。在计算机视觉和图像处理中,轮廓通常被用于检测物体、分割图像以及提取物体特征。

图像轮廓是由一系列连续的像素点组成,这些像素点位于物体边界上。轮廓的特点是在物体和背景之间的边界位置,因此可以用来表示物体的形状和结构。轮廓可以是闭合的,也可以是开放的,具体取决于物体的形状。

图像轮廓的应用场景?

图像轮廓在许多应用场景中都发挥着重要作用,下面列举了一些常见的应用场景:

目标检测与识别: 图像轮廓可以用于检测和定位图像中的物体。通过检测物体的轮廓,可以识别出图像中的不同物体并进行分类。

图像分割: 轮廓可以用来分割图像中的不同区域或物体。通过提取物体的轮廓,可以将图像分成多个不同的部分,方便进一步分析和处理。

医学图像分析: 在医学图像中,轮廓可以用来标记器官、病变或细胞等结构。这对于诊断和治疗决策具有重要意义。

工业自动化: 在工业自动化中,轮廓可以用于检测产品的缺陷、测量尺寸和定位部件,从而实现自动化生产和质量控制。

机器人视觉: 机器人可以利用图像轮廓来感知环境和物体,从而实现自主导航、抓取物体等任务。

计算机辅助设计(CAD): 在CAD领域,图像轮廓可以用于从实际物体中获取几何信息,以便在计算机上进行建模和设计。

虚拟现实与增强现实: 图像轮廓可以用来实时跟踪物体,将虚拟对象与实际场景进行交互,从而创建更加逼真的虚拟现实或增强现实体验。

图像重建与三维建模: 利用物体的轮廓可以进行图像的重建和三维建模,从而生成立体的物体模型。

边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。
OpenCV 提供了查找图像轮廓的函数 cv2.findContours(),该函数能够查找图像内的轮廓信息,而函数 cv2.drawContours()能够将轮廓绘制出来。
图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的操作,我们能够获取目标图像的大小、位置、方向等信息。

查找图像轮廓:findContours函数

函数 cv2.findContours()的语法格式为:

image, contours, hierarchy = cv2.findContours( image, mode, method)

式中的返回值为:

  • image:与函数参数中的原始图像 image 一致。
  • contours:返回的轮廓。
  • hierarchy:图像的拓扑信息(轮廓层次)。

式中的参数为:

  • image:原始图像。8 位单通道图像,所有非零值被处理为 1,所有零值保持不变。也就是说灰度图像会被自动处理为二值图像。在实际操作时,可以根据需要,预先使用阈值处理等函数将待查找轮廓的图像处理为二值图像。
  • mode:轮廓检索模式。
  • method:轮廓的近似方法。

函数 cv2.findContours()的返回值及参数的含义比较丰富,下面对上述返回值和参数逐一做出说明。

1. 返回值image
该返回值与参数 image 是一致的,就是原始输入图像。在 OpenCV 4.X 中,该返回值已经被取消。在 OpenCV 4.X 中,函数 cv2.findContours()仅有两个返回值,其语法格式为:

contours, hierarchy = cv2.findContours( image, mode, method)

2. 返回值contours
该返回值返回的是一组轮廓信息,每个轮廓都是由若干个点所构成的。例如,contours[i] 是第 i 个轮廓(下标从 0 开始),contours[i][j]是第 i 个轮廓内的第 j 个点。

图 12-1 所示为提取的轮廓示例,函数 cv2.findContours()提取出左图的 3 个轮廓,每一个轮廓都是由若干个像素点构成的。

在这里插入图片描述
下面针对图 12-1 来简单介绍一下 contours 的基本属性。

(1)type 属性
返回值 contours 的 type 属性是 list 类型,list 的每个元素都是图像的一个轮廓,用 Numpy中的 ndarray 结构表示。
例如,使用如下语句获取轮廓 contours 的类型:

print (type(contours))

结果为<class ‘list’>。

使用如下语句获取轮廓 contours 中每个元素的类型:

print (type(contours[0]))

结果为<class ‘numpy.ndarray’>。

(2)轮廓的个数
使用如下语句可以获取轮廓的个数:

print (len(contours))

结果为“3”,表示在图 12-1 中,存在 3 个轮廓。

(3)每个轮廓的点数

每一个轮廓都是由若干个像素点构成的,点的个数不固定,具体个数取决于轮廓的形状。
例如,使用如下语句,可以获取每个轮廓内点的个数:

print (len(contours[0])) #打印第 0 个轮廓的长度(点的个数):4
print (len(contours[1])) #打印第 1 个轮廓的长度(点的个数):60
print (len(contours[2])) #打印第 2 个轮廓的长度(点的个数):184

(4)轮廓内的点
使用如下语句,可以获取轮廓内第 0 个轮廓中具体点的位置属性:

print (contours[0]) #打印第 0 个轮廓中的像素点

contours[0]对应着图 12-1 中右图左下角矩形轮廓的点,输出结果如下:

[[[ 79 270]]
[[ 79 383]]
[[195 383]]
[[195 270]]]
  1. 返回值hierarchy
    图像内的轮廓可能位于不同的位置。比如,一个轮廓在另一个轮廓的内部。在这种情况下,
    我们将外部的轮廓称为父轮廓,内部的轮廓称为子轮廓。按照上述关系分类,一幅图像中所有轮廓之间就建立了父子关系。

根据轮廓之间的关系,就能够确定一个轮廓与其他轮廓是如何连接的。比如,确定一个轮廓是某个轮廓的子轮廓,或者是某个轮廓的父轮廓。上述关系被称为层次(组织结构),返回值 hierarchy 就包含上述层次关系。
每个轮廓 contours[i]对应 4 个元素来说明当前轮廓的层次关系。其形式为:

[Next,Previous,First_Child,Parent]

式中各元素的含义为:

  • Next:后一个轮廓的索引编号。

  • Previous:前一个轮廓的索引编号。

  • First_Child:第 1 个子轮廓的索引编号。

  • Parent:父轮廓的索引编号。

如果上述各个参数所对应的关系为空时,也就是没有对应的关系时,则将该参数所对应的值设为“-1”。
使用 print 语句可以查看 hierarchy 的值:

print(hierarchy)

需要注意,轮廓的层次结构是由参数 mode 决定的。也就是说,使用不同的 mode,得到轮廓的编号是不一样的,得到的 hierarchy 也不一样。

  1. 参数image
    该参数表示输入的图像,必须是 8 位单通道二值图像。一般情况下,都是将图像处理为二值图像后,再将其作为 image 参数使用的。

  2. 参数mode
    参数 mode 决定了轮廓的提取方式,具体有如下 4 种:

  • cv2.RETR_EXTERNAL:只检测外轮廓。
  • cv2.RETR_LIST:对检测到的轮廓不建立等级关系。
  • cv2.RETR_CCOMP:检索所有轮廓并将它们组织成两级层次结构。上面的一层为外边界,下面的一层为内孔的边界。如果内孔内还有一个连通物体,那么这个物体的边界仍
    然位于顶层。
  • cv2.RETR_TREE:建立一个等级树结构的轮廓。

下面分别对这四种情况进行简单的说明。

(1)cv2.RETR_EXTERNAL(只检测外轮廓)

例如,在图 12-2 中仅检测到两个外轮廓,轮廓的序号如图中的数字标注所示。

在这里插入图片描述
使用 print 语句可以查看 hierarchy 的值:

print(hierarchy) [[[ 1 -1 -1 -1] [-1 0 -1 -1]]]

其中:

  • 输出值“[ 1 -1 -1 -1]”,表示的是第 0 个轮廓的层次。
  • 它(即第 0 个轮廓)的后一个轮廓就是第 1 个轮廓,因此第 1 个元素的值是“1”。
  • 它的前一个轮廓不存在,因此第 2 个元素的值是“-1”。
  • 它不存在子轮廓,因此第 3 个元素的值是“-1”。
  • 它不存在父轮廓,因此第 4 个元素的值是“-1”。
  • 输出值“[-1 0 -1 -1]”,表示的是第 1 个轮廓的层次。
  • 它(即第 1 个轮廓)的后一个轮廓是不存在的,因此第 1 个元素的值是“-1”。
  • 它的前一个轮廓是第 0 个轮廓,因此第 2 个元素的值是“0”。
  • 它不存在子轮廓,因此第 3 个元素的值是“-1”。
  • 它不存在父轮廓,因此第 4 个元素的值是“-1”。
    此时,轮廓之间的关系为:

在这里插入图片描述
(2)cv2.RETR_LIST(对检测到的轮廓不建立等级关系)

例如,在图 12-3 中检测到三个轮廓,各个轮廓的序号如图中数字的标注所示。

在这里插入图片描述
使用 print 语句,可以查看 hierarchy 的值:

print(hierarchy) [[[ 1 -1 -1 -1] [ 2 0 -1 -1] [-1 1 -1 -1]]]

其中:

  • 输出值“[ 1 -1 -1 -1]”,表示的是第 0 个轮廓的层次。

  • 它(即第 0 个轮廓)的后一个轮廓是第 1 个轮廓,因此第 1 个元素的值是“1”。

  • 它的前一个轮廓不存在,因此第 2 个元素的值是“-1”。

  • 它不存在子轮廓,因此第 3 个元素的值是“-1”。

  • 它不存在父轮廓,因此第 4 个元素的值是“-1”。

  • 输出值“[2 0 -1 -1]”,表示的是第 1 个轮廓的层次。

  • 它(即第 1 个轮廓)的后一个轮廓是第 2 个轮廓,因此第 1 个元素的值是“2”。

  • 它的前一个轮廓是第 0 个轮廓,因此第 2 个元素的值是“0”。

  • 它不存在子轮廓,因此第 3 个元素的值是“-1”。

  • 它不存在父轮廓,因此第 4 个元素的值是“-1”。

  • 输出值“[-1 1 -1 -1]”,表示的是第 2 个轮廓的层次。

  • 它(即第 2 个轮廓)的后一个轮廓是不存在的,因此第 1 个元素的值是“-1”。

  • 它的前一个轮廓是第 1 个轮廓,因此第 2 个元素的值是“1”。

  • 它不存在子轮廓,因此第 3 个元素的值是“-1”。

  • 它不存在父轮廓,因此第 4 个元素的值是“-1”。
    从上述分析可以看出,当参数 mode 为 cv2.RETR_LIST 时,各个轮廓之间没有建立父子关系。

此时,轮廓之间的关系为:

在这里插入图片描述
(3)cv2.RETR_CCOMP(建立两个等级的轮廓)

当参数 mode 为 cv2.RETR_CCOMP 时,建立两个等级的轮廓。上面的一层为外边界,下面的一层为内孔边界。

例如,在图 12-4 中检测到三个轮廓,各轮廓的序号如图中数字的标注所示。

在这里插入图片描述
使用 print 语句可以查看 hierarchy 的值:

print(hierarchy)
[[[ 1 -1 -1 -1]
 [-1 0 2 -1]
 [-1 -1 -1 1]]]

其中:

  • 输出值“[ 1 -1 -1 -1]”,表示的是第 0 个轮廓的层次。
    它(即第 0 个轮廓)的后一个轮廓是第 1 个轮廓,因此第 1 个元素的值是“1”。
    它的前一个轮廓不存在,因此第 2 个元素的值是“-1”。
    它不存在子轮廓,因此第 3 个元素的值是“-1”。
    它不存在父轮廓,因此第 4 个元素的值是“-1”。

  • 输出值“[-1 0 2 -1]”,表示的是第 1 个轮廓的层次。
    它(即第 1 个轮廓)的后一个轮廓不存在,因此第 1 个元素的值是“-1”。
    它的前一个轮廓是第 0 个轮廓,因此第 2 个元素的值是“0”。
    它的第 1 个子轮廓是第 2 个轮廓,因此第 3 个元素的值是“2”。
    它不存在父轮廓,因此第 4 个元素的值是“-1”。

  • 值“[-1 -1 -1 1]”,表示的是第 2 个轮廓的层次。
    它(即第 2 个轮廓)的后一个轮廓不存在,因此第 1 个元素的值是“-1”。
    它的前一个轮廓也不存在,因此第 2 个元素的值是“-1”。
    它不存在子轮廓,因此第 3 个元素的值是“-1”。
    它的父轮廓是第 1 个轮廓,因此第 4 个元素的值是“1”。
    此时,轮廓关系为:

在这里插入图片描述

(4)cv2.RETR_TREE(建立一个等级树结构的轮廓)

例如,在图 12-5 中检测到三个轮廓,各个轮廓的序号如图中的数字标注所示。

在这里插入图片描述
使用 print 语句可以查看 hierarchy 的值:

print(hierarchy)
[[[ 1 -1 -1 -1]
 [-1 0 2 -1]
 [-1 -1 -1 1]]]

其中:

  • 输出值“[ 1 -1 -1 -1]”,表示的是第 0 个轮廓的层次。
    它(即第 0 个轮廓)的后一个轮廓是第 1 个轮廓,因此第 1 个元素的值为“1”。
    它的前一个轮廓不存在,因此第 2 个元素的值是“-1”。
    它不存在子轮廓,因此第 3 个元素的值是“-1”。
    它不存在父轮廓,因此第 4 个元素的值是“-1”。

  • 输出值“[-1 0 2 -1]”,表示的是第 1 个轮廓的层次。
    它(即第 1 个轮廓)的后一个轮廓不存在,因此第 1 个元素的值是“-1”。
    它的前一个轮廓是第 0 个轮廓,因此第 2 个元素的值是“0”。
    它的第 1 个子轮廓是第 2 个轮廓,因此第 3 个元素的值是“2”。
    它的父轮廓不存在,因此第 4 个元素的值是“-1”。

  • 输出值“[-1 -1 -1 1]”,表示的是第 2 个轮廓的层次。
    它(即第 2 个轮廓)的后一个轮廓不存在,因此第 1 个元素的值是“-1”。
    它的前一个轮廓是不存在的,因此第 2 个元素的值是“-1”。
    它的子轮廓是不存在的,因此第 3 个元素的值是“-1”。
    它的父轮廓是第 1 个轮廓,因此第 1 个元素的值是“1

此时,轮廓之间的关系为:

在这里插入图片描述
需要注意,本例中仅有两层轮廓,所以使用参数 cv2.RETR_CCOMP 和 cv2.RETR_TREE 得到的层次结构是一致的。当有多层轮廓时,使用参数 cv2.RETR_CCOMP 也会得到仅有两层的层次结构;而使用参数 cv2.RETR_TREE 会得到含有多个层次的结构。

6. 参数method
参数 method 决定了如何表达轮廓,可以为如下值:

  • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻两个点的像素位置差不超过 1,即 max(abs(x1-x2),abs(y2-y1))=1。
  • cv2.CHAIN_APPROX_SIMPLE:压缩水平方向、垂直方向、对角线方向的元素,只保留该方向的终点坐标。例如,在极端的情况下,一个矩形只需要用 4 个点来保存轮廓信息。
  • cv2.CHAIN_APPROX_TC89_L1:使用 teh-Chinl chain 近似算法的一种风格。
  • cv2.CHAIN_APPROX_TC89_KCOS:使用 teh-Chinl chain 近似算法的一种风格。

例如,在图 12-6 中,左图是使用参数值 cv2.CHAIN_APPROX_NONE 存储的轮廓,保存了轮廓中的每一个点;右图是使用参数值 cv2.CHAIN_APPROX_SIMPLE 存储的轮廓,仅仅保存了边界上的四个点。

在这里插入图片描述
在使用函数 cv2.findContours()查找图像轮廓时,需要注意以下问题:

  • 待处理的源图像必须是灰度二值图。因此,在通常情况下,都要预先对图像进行阈值分
    割或者边缘检测处理,得到满意的二值图像后再将其作为参数使用。
  • 在 OpenCV 中,都是从黑色背景中查找白色对象。因此,对象必须是白色的,背景必须
    是黑色的。
  • 在 OpenCV 4.x 中,函数 cv2.findContours()仅有两个返回值。

代码示例:

import cv2
o = cv2.imread('lena.png')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
#
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

print("contours=\n",contours)
print("hierarchy=\n",hierarchy)

运行这段代码后会发现报错,因为我用的是opencv4.5 版本。

报错
在这里插入图片描述
提示这个在 OpenCV 4.x 中,函数 cv2.findContours()仅有两个返回值

新代码如下:

import cv2
o = cv2.imread('contours.bmp')

gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
#
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

print("hierarchy=\n",hierarchy)

运行结果如下:

hierarchy=
 [[[ 1 -1 -1 -1]
  [ 2  0 -1 -1]
  [-1  1 -1 -1]]]

原图:

可套用前面讲解值得含义去分析一下结果,如:

输出值“[ 1 -1 -1 -1]”,表示的是第 0 个轮廓的层次。
它(即第 0 个轮廓)的后一个轮廓是第 1 个轮廓,因此第 1 个元素的值为“1”。
它的前一个轮廓不存在,因此第 2 个元素的值是“-1”。
它不存在子轮廓,因此第 3 个元素的值是“-1”。
它不存在父轮廓,因此第 4 个元素的值是“-1”。

试着去理解
[ 2 0 -1 -1]
[-1 1 -1 -1]
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849164.html

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

相关文章

springboot生成表结构和表数据sql

需求 业务背景是需要某单机程序需要把正在进行的任务导出&#xff0c;然后另一台电脑上单机继续运行&#xff0c;我这里选择的方案是同步SQL形式&#xff0c;并保证ID随机&#xff0c;多个数据库不会重复。 实现 package com.nari.web.controller.demo.controller;import cn…

Android 11 获取启动其他应用

Android 11 获取启动其他应用 本文代码地址 https://gitee.com/chenjim/QueryAppInfo 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 如果应用以 Android 11&#xff08;API 级别 30&#xff09;或更高版本为目标平台&#xff0c;并查询与设备上已安装的其他应用相…

Python 面试必知必会(一):数据结构

《Python Cookbook》的作者David Beazley的课程PPT开源了&#xff0c;目标用户是希望从编写基础脚本过渡到编写更复杂程序的高级 Python 程序员&#xff0c;课程主题侧重于流行库和框架中使用的编程技术&#xff0c;主要目的是更好地理解 Python 语言本身&#xff0c;以便阅读他…

简易图书管理系统(面向对象思想)

目录 前言 1.整体思路 2.Book包 2.1Book类 2.2BookList类 3.user包 3.1User类 3.2NormalUser类 3.3AdminUser类 4.operation 4.1IOPeration接口 4.2ExitOperation类 4.3FindOperation类 4.4ShowOperation类 4.5AddOperation类 4.6DelOperation类 4.7BorrowOpera…

下半年提速拓店,为什么说屈臣氏引领美妆零售的未来?

屈臣氏过去是美妆零售的先锋&#xff0c;目前来看它或许仍然是先锋。 杰弗里摩尔在《公司进化论》中总结提出&#xff0c;自由市场经济运作的方式&#xff0c;遵循着一些类似自然界有机系统的定律&#xff1a;通俗来说&#xff0c;资源竞争带来“刺激创新”——由消费者偏好形…

看重ARM?苹果、三星、英伟达等知名企业纷纷表示加大投资

根据日经亚洲的报道&#xff0c;芯片设计公司Arm计划进行首次公开募股并在纳斯达克上市。苹果、三星电子、英伟达、英特尔等知名企业计划在Arm美股上市后投资该公司。 据悉&#xff0c;Arm将于9月份上市&#xff0c;预计估值将达到至少600亿美元&#xff08;约合4314亿元人民币…

【PyQt5+matplotlib】获取鼠标在canvas上的点击坐标

示例代码&#xff1a; import sys import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasclass MyMainWindow(QMainWindow):de…

vulnhub靶场-y0usef笔记

vulnhub靶场-y0usef笔记 信息收集 首先fscan找到目标机器ip http://192.168.167.70/ nmap扫描端口 Host is up (0.00029s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ub…

(十五)大数据实战——hive的安装部署

前言 Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。本节内容我们主要介绍一下hive的安装与部署的相关内容。 正文 上传hive安装包到hadoop101服务器/opt/software目录 解…

Reinforcement Learning with Code (对比Monte-Carlo与TD算法)【Code 3. MonteCarlo】

Reinforcement Learning with Code & &#xff08;对比Monte-Carlo与TD算法&#xff09;【Code 3. MonteCarlo】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced s…

成功搞定H7-TOO的FreeRTOS Trace图形化链表方式展示任务管理

之前推出了H7-TOOL的RTOS Trace功能&#xff0c;已经支持RTX5&#xff0c;ThreadX&#xff0c;uCOS-III&#xff0c;uCOS-II和FreeRTOS&#xff0c;特色是不需要目标板额外做任何代码&#xff0c;实时检测RTOS任务执行情况&#xff0c;支持在线和脱机玩法&#xff0c;效果是下面…

网络编程——字节序和地址转换

字节序和地址转换 一、字节序 1、字节序概念 是指多字节数据的存储顺序,数据在内存中存储的方式 2、分类 大端序(网络字节序)&#xff1a;高位的数据存放在低地址位 arm架构、交换机、路由器 小端序(主机字节序)&#xff1a;高位的数据存放在高地址位 x86架构计算机 注意 …

10_Vue3 其它的组合式API(Composition API)

Vue3 中的其它组合式API 1.shallowReactive 与 shallowRef 2. readonly 与 shallowReadonly 3.toRaw 与 markRaw 4.customRef 5.provide 与 inject 6.响应式数据的判断

pytest测试框架之fixture测试夹具详解

fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown&#xff0c;但相对之下它的功能更加强大和灵活。 命名方式灵活&#xff0c;不限于unittest的setup、teardown可以实现数据共享&#xff0c;多个模块跨文件共享前置后置可以实现多个模块跨…

fastadmin自定义键值组件Fieldlist

需求场景&#xff1a; 后台设置前端的固定话费充值金额。编辑时要求能够增删改&#xff0c;给到前端的数据&#xff0c;是要根据金额正序排列&#xff0c;用fastadmin的键值组件(Fieldlist)&#xff0c;使用Art-Template模板语法自定义模板。 最终效果如下图所示&#xff1a; …

【深度学习注意力机制系列】—— ECANet注意力机制(附pytorch实现)

ECANet&#xff08;Efficient Channel Attention Network&#xff09;是一种用于图像处理任务的神经网络架构&#xff0c;它在保持高效性的同时&#xff0c;有效地捕捉图像中的通道间关系&#xff0c;从而提升了特征表示的能力。ECANet通过引入通道注意力机制&#xff0c;以及在…

CSDN 直播:腾讯云大数据 ES 结合 AI 大模型与向量检索的新一代云端检索分析引擎 8月-8号 19:00-20:30

本次沙龙围绕腾讯云大数据ES产品展开&#xff0c;重点介绍了腾讯云ES自研的存算分离技术&#xff0c;以及能与AI大模型和文本搜索深度结合的高性能向量检索能力。同时&#xff0c;本次沙龙还将为我们全方位介绍腾讯云ES重磅推出的Elasticsearch Serverless服务&#xff0c;期待…

Go重写Redis中间件 - Go实现Redis集群

Go实现Redis集群 这章的内容是将我们之前实现的单机版的Redis扩充成集群版,给Redis增加集群功能,在增加集群功能之前,我们先学习一下在分布式系统中引用非常广泛的技术一致性哈希,一致性哈希在我们项目里就应用在我们Redis集群的搭建这块 详解一致性哈希 Redis集群需求背…

SDXL 1.0出图效果直逼Midjourney!手把手教你快速体验!

介绍 最近&#xff0c;Stability AI正式推出了全新的SDXL 1.0版本。经过我的实际测试&#xff0c;与之前的1.5版本相比&#xff0c;XL的效果有了巨大的提升&#xff0c;可以说是全方位的超越。不仅在理解提示词方面表现出色&#xff0c;而且图片的构图、颜色渲染和画面细腻程度…

【uniapp】一文读懂app端安装包升级

一、前言 首先&#xff0c;在app端开发上线的过程中&#xff0c;会面临一个问题&#xff0c;就是关于app端的版本升级的问题。如果不做相关处理来引导用户的话&#xff0c;那么app就会出现版本没有更新出现的各种问题&#xff0c;我们常见的有在线升级和去指定地址下载安装两种…