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

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

🎉🎉🎉 欢迎各位来到小白 p i a o 的学习空间! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!🎉🎉🎉
💖💖💖 持续更新,期待关注! \color{blue}{持续更新,期待关注!} 持续更新,期待关注!💖💖💖


我的主页: \color{purple}{我的主页:} 我的主页:我的主页

  1. Python基础、中级、高级;
  2. C++数据结构和算法;
  3. Python数据结构和算法;
  4. OpenCV相关内容等重点内容

我的资源: \color{purple}{我的资源:} 我的资源:我的资源

  1. IT技术各档次模板
  2. 各类项目(企业、毕设)
  3. 数据库安装包(Mysql8.0)
  4. 技能资料(电子书、软考等)

目录


----------------------------------以下为正式内容----------------------------------------

前言 \color{purple}{前言} 前言

        书接上回,我们继续来讨论有关Mat的基本知识,这次我们继续深化了解Mat对象,以便后期更好的进行开发工作。这一章节主要是一些使用层面的知识,相比上章节,我相信读者更愿意看本章内容,因为可以快速得到自己想要的结果,但是还是那句话,最好掌握原理之后,再去使用更为科学


前文链接:【C++的OpenCV】第十三课-OpenCV基础强化(一):绝对有用!Mat相关的一系列知识(基础->进阶)


一、访问的方法 \color{blue}{一、访问的方法} 一、访问的方法

1.1 利用成员函数 a t ( ) \color{green}{1.1 利用成员函数at()} 1.1利用成员函数at()

        先来通过帮助文档了解一下at函数的基本信息:点击这里了解详情,总共有12种形式,这里为大家略微截图,大家可以自行阅读,我摘抄其中重点,其余感兴趣的可以做进一步了解:
![在这里插入图片描述](https://img-blog.csdnimg.cn/8348bd8fc8794491a72ce953b909a378.png

1.1.1 at函数的功能:

在这里插入图片描述        这么多英文懵了吧?懵了就对了,下边我给大家讲几句!!!😃
        大概意思就是说,这个方法会返回一个你所指定的数组元素的引用,而关于下标索引范围的检查动作仅仅在测试模式下生效(生产模式下不生效的目的是为了提高程序的执行效率)。注意:这里得到是某个元素的引用哦!!!
        再直白一点,就是说它可以得到矩阵的某行某列的元素。

1.1.2 多种at()函数原型的介绍及案例

a) 类型一:_Tp& cv::Mat::at ( int i = 0)
template<typename _Tp >
_Tp& cv::Mat::at ( int  i = 0) 	

        原文:That is, if, for example, A is a 1 x N floating-point matrix and B is an M x 1 integer matrix, you can simply write A.at<float>(k+4) and B.at<int>(2i+1) instead of A.at<float>(0,k+4) and B.at<int>(2i+1,0), respectively.
大概意思:这个参数i,可以指代任意一个单行或者单列的二维矩阵,例如:一个1行N列的浮点矩阵A,和一个M行1列的整型矩阵B,分别找到其中某个元素的方法就可以简化为:A.at<float>(k+4) 和 B.at<int>(2*i+1)。
        注意:这里函数原型中的返回值部分是_TP&哦,大家知道这是什么意思吧?(&是引用)
        这里来给大家一个使用上的要求:

If matrix is of type CV_8U then use Mat.at<uchar>(y,x).如果矩阵是CV_8U的类型,那么使用模版时类型也要是对应的数据类型uchar,即:Mat.at<uchar>(y,x)这里和大家解释一个细节:8U的意思就是8bit的无符号整数。If matrix is of type CV_8S then use Mat.at<schar>(y,x).同上的翻译,一个意思,即类型是CV_8S,则使用类型为schar,即:Mat.at<schar>(y,x),下边不再赘述。If matrix is of type CV_16U then use Mat.at<ushort>(y,x).If matrix is of type CV_16S then use Mat.at<short>(y,x).If matrix is of type CV_32S then use Mat.at<int>(y,x).If matrix is of type CV_32F then use Mat.at<float>(y,x).If matrix is of type CV_64F then use Mat.at<double>(y,x).
b) 类型二:_Tp& cv::Mat::at( int row,int col )
template<typename _Tp >
_Tp& cv::Mat::at( int row,int col ) 		

        那这种就是最常见的那种咯,输入行列找到对应的值咯。给大家个例子:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>using namespace cv;int main()
{Mat m = (Mat_<int>(3,2) << 1,2,3,4,5,6)cout << m.at<int>(1,1)<< endl; // 这里的结果是:4 ,为什么知道吗?cout << m <<endl; // 注意:显示的是3行2列//首先,这里创建的是一个3行2列的矩阵,这个不难懂,4是出现在第二行第二列的元素:/*[1,23,45,6]*/// 那这个m.at<int>(1,1)中的两个1,其实就得知道at的参数含义了,//注意,at()方法中的row和col都是从0开始的,0即代表第一行或者第一列,明白了吧?//注意:at()中是先行后列!return 0;
}
c)类型三 :_Tp& cv::Mat::at ( Point pt)
template<typename _Tp >
_Tp& cv::Mat::at ( Point  	pt) 	

        其实这种也很常见以及其返回const类型的方法都是一个原理,这里需要传入一个点对象作为参数,说白了,就是按照点的位置在对应矩阵这种查找对应的元素即可了。举个例:

#include<iostream>
#include"opencv2/core/utility.hpp"
using namespace std;
using namespace cv;int main()
{Mat m = (Mat_<int>(3,2) << 1,2,3,4,5,6);cout<<m<<endl;/*[1, 2;3, 4;5, 6]*/cout << m.at<int>(Point(1,0)) << endl; // 结果是2哦,看看上一节内容就知道,Point(c,r),是先列后行,且这两个值都是列和行的索引(基于0)return 0;
}

在这里插入图片描述
        虽然方法很多,其他的方法都可以触类旁通,只要学好C++的基础语法,这都不是难事哦,后期我也将会为大家写写C++和Python的基础教程,大家都可以持续关注起来哦!

1.2 利用成员函数 p t r ( ) \color{green}{1.2利用成员函数ptr()} 1.2利用成员函数ptr()

        先来通过帮助文档了解一下at函数的基本信息:点击这里了解详情,这个方法更多,有20种,是不是看文档很累?看我的吧,帮你总结好了学习的方法,轻松上手,熟练掌握!
在这里插入图片描述

1.2.1 ptr()函数的功能

        首先呢,它会返回一个指向矩阵中某元素(或者行)的指针!注意哦,返回的是指针!并且哦,这个指针是uchar类型的哦!

1.2.2 多种ptr()函数原型介绍及案例

a) 类型一:uchar* cv::Mat::ptr ( int i0 = 0 )
 // 这个是模版方法:template<typename _Tp >
_Tp* cv::Mat::ptr 	( 	int  	i0 = 0	) 	// i0 :基于0的行索引,说白了,从零开始!//个人而言,更乐意直接使用模版方法,因为它可以返回模版类型的指针(行或者元素),而不是单纯的uchar*!!//以下这个是基础款:
uchar* cv::Mat::ptr (int  i0 = 0) 	

        注意,这个方法!返回的就是某一行的行指针!
        举个浅显易懂的例子吧:

#include<iostream>
#include"opencv2/core/utility.hpp"
using namespace std;
using namespace cv;int main()
{Mat m = (Mat_<int>(3,2) << 1,2,3,4,5,6);cout << m <<endl; // 注意:显示的是3行2列/*[1, 2;3, 4;5, 6]*/cout << m.size() << endl; // [2 x 3] 注意:size()的表示方式是2列3行!for(int r=0; r < m.rows; r++){//得到每行的行首指针,r就是当前行的索引const int* rptr = m.ptr<int>(r);//打印第r行的元素的所有值:for(int c=0; c<m.cols; c++){ //c是列的索引,也是基于0的索引,几乎所有数字型索引都是从0开始!cout<<rptr[c]<<",";}cout<<endl; //换行}return 0;
}

        结果如下:
在这里插入图片描述

b) 类型二:uchar* cv::Mat::ptr ( int row,int col )
// 这个是模板:template<typename _Tp >
_Tp* cv::Mat::ptr 	( 	int  	row,int  	col ) 		//以下这个是基础款:
uchar* cv::Mat::ptr ( int  row,int  col ) 		

        这种方式不就更直接了吗?直接通过行列访问到对应元素上(注意此时这个返回值就是直接返回元素的指针了!),我们试试看:

#include<iostream>
#include"opencv2/core/utility.hpp"
using namespace std;
using namespace cv;int main()
{Mat m = (Mat_<int>(3,2) << 1,2,3,4,5,6);cout << m <<endl; // 注意:显示的是3行2列/*[1, 2;3, 4;5, 6]*/cout << m.size() << endl; // [2 x 3] 注意:size()的表示方式是2列3行!cout << *m.ptr<int>(1,1) << endl; //注意这里一个细节哦,仔细看哦,结果是4//这里m.ptr<int>(1,1)得到的是索引为(1,1)的元素的指针!//而在其之前加上*号就是获取该指针地址对应的元素(这个过程通常被称为“解引用”操作)return 0;
}

        看着方法众多,很多方法几乎用不到,但是得有这个功能,新手先掌握这些,剩下的内容等用到了再查就行!掌握了规律,剩下的无师自通了哈!

1.3 利用成员函数 i s C o n t i n u o u s 和 p t r \color{green}{1.3利用成员函数isContinuous和ptr} 1.3利用成员函数isContinuousptr

1.3.1 isContinuous()介绍

        原文链接得有:点击这里了解详情,毕竟是教大家学东西,同时培养自学能力,这么良心的作者已经很少了!
        函数功能:
        **如果矩阵元素连续存储,且每行末尾没有间隙,则该方法返回true。否则,它将返回false。**显然,1x1或1xN矩阵总是连续的。使用Mat::create创建的矩阵总是连续的。但是,如果 使用Mat::col、Mat::diag等提取矩阵的一部分,或者为外部分配的数据构造矩阵头,则此类矩阵可能不再具有此属性。 想想看,图像边界连续性检测不就是这个原理吗?

        💖这里,为了给大家更好的理解,我们加一节小灶:Mat对象至少一行中的所有元素在内存汇总的排布是连续的!而行与行之间不一定连续(除非你用create创建Mat),如果不连续,其行与行的间隔也是一样的!!
在这里插入图片描述

        函数的原型:

bool cv::Mat::isContinuous ( ) const// 返回值是一个布尔值,如果是连续的就是true,否则就是false呗!

1.3.2 我们来看看其和ptr()组合如何完成实际需求(访问Mat中的值)

        这里就不废话了,都是讲过的内容,直接上代码:

#include<iostream>
#include"opencv2/core/utility.hpp"
using namespace std;
using namespace cv;int main()
{Mat m = (Mat_<int>(3,2) << 1,2,3,4,5,6);cout << m <<endl; // 注意:显示的是3行2列/*[1, 2;3, 4;5, 6]*/if(m.isContinuous()){int* ptr = m.ptr<int>(0); // 得到第一行行首指针for(int n = 0; n < m.rows*m.cols; n++){//解释一下:n < m.rows*m.cols这个边界条件是一种经验!//意思:m.rows*m.cols即行数*列数//其次,在内存层面上,如果矩阵连续(m.isContinuous()的结果为true),//就是说内存上这些值都是挨着存储的,所以索引也是连续的//故这是一个以为数组,则最大索引就是m.rows*m.cols-1//怎么样?有意思吧?认真学习起来。cout<<ptr[n]<<",";}}return 0;
}

        注意仔细看,上述代码如下的结果 \color{red}{注意仔细看,上述代码如下的结果} 注意仔细看,上述代码如下的结果
在这里插入图片描述
        说明上述代码不连续哦,当然你也可以尝试一下加一个else结构去打印一下“不连续”!证明,这样子创建的矩阵,每行之间是有固定间隙的哦(仔细看下下边的内容)!

在这里插入图片描述        那我们来换一种方式:

#include<iostream>
#include"opencv2/core/utility.hpp"
using namespace std;
using namespace cv;int main()
{Mat m = (Mat_<int>(3,2) << 1,2,3,4,5,6);Mat m_c;m_c.create(m.size(),m.type());//注意上文提到过:create创建的是连续存储的矩阵cout << m_c <<endl; // 注意:显示的是3行2列/*[1, 2;3, 4;5, 6]*/if(m.isContinuous()){int* ptr = m_c.ptr<int>(0); // 得到第一行行首指针for(int n = 0; n < m_c.rows*m_c.cols; n++){cout<<ptr[n]<<",";}cout<<endl;}return 0;
}

        这下结果明朗了,顺道学习了新技能!
在这里插入图片描述

四、总结 \color{red}{四、总结} 四、总结

内容虽然不多,分成两章更新,下章还在持续更新!但都是精华如果你觉得内容难懂,不妨从最基础的内容学起来,请看我的首页哦!我的主页
       

顺道呢,发现一个不错的资源:点我进入

其中包含了opencv入门的保姆级教程(环境的安装—>实际的项目【人脸识别&教程】,以及配套了一本中文版OpenCV书籍)


💖💖💖 持续更新,期待关注! \color{blue}{持续更新,期待关注!} 持续更新,期待关注!💖💖💖

相关文章:

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…...

elementUI el-collapse 自定义折叠面板icon 和 样式 或文字展开收起

: :v-deep{.el-collapse-item__arrow {width: 40px;}.el-icon-arrow-right:before {content: "展开";font-size: 15px;font-family: heiti;color: #2295ff;font-weight: bold;}.el-collapse-item__arrow.is-active {transform: none;}.el-collapse-item__arrow.is-a…...

如何用个人数据Milvus Cloud知识库构建 RAG 聊天机器人?(上)

生成式人工智能时代,开发者可以借助大语言模型(LLM)开发更智能的应用程序。然而,由于有限的知识,LLM 非常容易出现幻觉。检索增强生成(RAG)https://zilliz.com/use-cases/llm-retrieval-augmented-generation 通过为 LLM 补充外部知识,有效地解决了这一问题。 在 Chat …...

2023年江西省“振兴杯”工业互联网安全技术技能大赛暨全国大赛江西选拔赛 Write UP

文章目录 一、协议分析 - modbus二、协议分析 - 异常的流量三、协议分析 - S7Error四、协议分析 - OmronAttack五、组态编程 - 工程的秘密六、组态编程 - 工程的秘密七、组态编程 - 简单的计算八、组态编程 - 交通灯九、组态编程 - 有趣的转盘十、应急处置 - 登录日志分析十一、…...

PostMan 之 Mock 接口测试

在测试的时候经常会碰到后端开发工程师的接口还没有开发完成&#xff0c;但是测试任务已经分配过来。没有接口怎么测试呢&#xff1f; 测试人员可以通过 mock server 自己去造一个接口来访问。mock server 可用于模拟真实的接口。收到请求时&#xff0c;它会根据配置返回对应的…...

LuatOS-SOC接口文档(air780E)--libgnss - NMEA数据处理

示例 -- 提醒: 本库输出的坐标,均为 WGS84 坐标系 -- 如需要在国内地图使用, 要转换成对应地图的坐标系, 例如 GCJ02 BD09 -- 相关链接: https://lbsyun.baidu.com/index.php?titlecoordinate -- 相关链接: https://www.openluat.com/GPS-Offset.html-- 方案1, 经lua层进行数…...

基于华为云 IoT 物联网平台实现家居环境实时监控

01 智能家居环境监测 智能家居环境监测采用 Ruff 开发板作为主控&#xff0c;串口线连接温湿度传感器 DHT11 和空气质量传感器 SDS011&#xff0c;每5分钟采集一次数据&#xff0c;通过 MQTT 协议发送到华为云 IoT 物联网平台&#xff0c;并基于数据分析服务实时计算出整个家庭…...

【开源框架】Glide的图片加载流程

本篇文章从Glide 4.11源码入手&#xff0c;简单的分析整个图片请求的流程&#xff0c;本着 ”只见树林&#xff0c;不见树木“ 的原则&#xff0c;宏观请求流程&#xff0c;不细究实现细节&#xff08;细节留坑埋点&#xff0c;之后慢慢写&#xff09; 引入依赖 以下的所有分…...

win10下Mariadb绿色版安装步骤

使用绿色版的mariadb数据库管理软件&#xff0c;免费开源&#xff0c;可以用来替换MySQL。首先从mariadb官网下载绿色版本的压缩包。解压后、配置好即可以使用。 把他解压缩到C:\mariadb\之下。打开powershell&#xff1a; Cd c:\mariadb\bin .\mysql_install_db.exe 这一…...

wiresharak捕获DNS

DNS解析&#xff1a; 过滤项输入dns&#xff1a; dns查询报文 应答报文&#xff1a; 事务id相同&#xff0c;flag里 QR字段1&#xff0c;表示响应&#xff0c;answers rrs变成了2. 并且响应报文多了Answers 再具体一点&#xff0c;得到解析出的ip地址&#xff08;最底下的add…...

vue源码分析(一)——源码目录说明

文章目录 一、如何下载源码&#xff08;可忽略&#xff09;&#xff08;1&#xff09;打开地址&#xff08;2&#xff09;复制链接&#xff08;3&#xff09;git clone 链接 二、源码目录说明1.可以根据你下载的源码通过package.json文件查看vue版本2.源码目录说明 一、如何下载…...

【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 笔记链接 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 吴恩达课程笔记——浅层神经网络、深层神经网络 四、浅层神经网络1.双层神经网络表示2.双层神经网络的前向传播第一层前向传播第二层前…...

UI自动化概念 + Web自动化测试框架介绍

1.UI自动化测试概念:我们先明确什么是UI UI&#xff0c;即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试&#xff0c;UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 …...

在 macOS 上的多个 PHP 版本之间切换

文章目录 前言一、前提条件1.引入库需要安装 Xcode 2.安装多个PHP版本2.PHP版本切换 开源替代品 前言 不同项目使用php版本可能不同&#xff0c;需要安装不同版本php 一、前提条件 1.引入库 需要安装 Xcode 命令行工具和Homebrew xcode-select --install检查brew是否已安…...

地址解析协议ARP

地址解析协议&#xff08;Address Resolution Protocol&#xff0c;ARP&#xff09;&#xff0c;用于根据本网内目的主机或默认网关的IP地址获取其MAC地址。 ARP的基本思想&#xff1a;在每一台主机中设置专用内存区域&#xff0c;称为ARP高速缓存&#xff08;也称为ARP表&…...

Go学习第十三章——Gin入门与路由

Go web框架——Gin入门与路由 1 Gin框架介绍1.1 基础介绍1.2 安装Gin1.3 快速使用 2 路由2.1 基本路由GET请求POST请求 2.2 路由参数2.3 路由分组基本分组带中间件的分组 2.4 重定向 1 Gin框架介绍 github链接&#xff1a;https://github.com/gin-gonic/gin 中文文档&#xf…...

[减脂期食谱] 自制千岛酱

[减脂期食谱] 自制千岛酱 成品如下&#xff1a; 最中间的那个&#xff0c;算比较居中的颜色吧&#xff0c;其实自己家做原版的千岛酱还是比较简单的&#xff0c;它的底就是蛋黄酱(蛋黄油乳化的酱)&#xff0c;随后里面的材料比较自由&#xff0c;维基百科是这么介绍的&#xf…...

Android 系统架构

目录 Android 系统架构 1. Android 应用层 2. Android应用框架层 2.1 Activity Manager &#xff08;活动管理器&#xff09; 2.2 Window Manager &#xff08;窗口管理器&#xff09; 2.3 Content Provider (内容提供器) 2.4 View System&#xff08;视图系统&a…...

【Docker】Python Flask + Redis 练习

一、构建flask镜像 1.准备文件 创建app.py,内容如下 from flask import Flask from redis import Redis app Flask(__name__) redis Redis(hostos.environ.get(REDIS_HOST,127.0.0.1),port6379)app.route(/) def hello():redis.incr(hits)return f"Hello Container W…...

shell_52.Linux测试与其他网络主机的连通性脚本

实战演练 本节将展示一个实用脚本&#xff0c;该脚本在处理用户输入的同时&#xff0c;使用 ping 命令或 ping6 命令来测试与其他网络主机的连通性。 ping 命令或 ping6 命令可以快速测试网络主机是否可用。这个命令很有用&#xff0c;经常作为首选工具。如果只是检查单个主机&…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...

linux设备重启后时间与网络时间不同步怎么解决?

linux设备重启后时间与网络时间不同步怎么解决&#xff1f; 设备只要一重启&#xff0c;时间又错了/偏了&#xff0c;明明刚刚对时还是对的&#xff01; 这在物联网、嵌入式开发环境特别常见&#xff0c;尤其是开发板、树莓派、rk3588 这类设备。 解决方法&#xff1a; 加硬件…...

Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)

做RAG自己打算使用esmilvus自己开发一个&#xff0c;安装时好像网上没有比较新的安装方法&#xff0c;然后找了个旧的方法对应试试&#xff1a; &#x1f680; 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana&#xff0c;适配中文搜索…...