ubuntu22.04@laptop OpenCV Get Started: 007_color_spaces
ubuntu22.04@laptop OpenCV Get Started: 007_color_spaces
- 1. 源由
- 2. 颜色空间
- 2.1 RGB颜色空间
- 2.2 LAB颜色空间
- 2.3 YCrCb颜色空间
- 2.4 HSV颜色空间
- 3 代码工程结构
- 3.1 C++应用Demo
- 3.2 Python应用Demo
- 4. 重点分析
- 4.1 interactive_color_detect
- 4.2 interactive_color_segment
- 4.3 data_analysis
- 4.3.1 黄色
- 4.3.2 红色
- 4.3.3 蓝色
- 4.3.4 绿色
- 4.3.5 橙色
- 5. 总结
- 6. 参考资料
- 7. 补充
1. 源由
在本章中,将了解计算机视觉中使用的流行颜色空间,并将其用于基于颜色的分割。
- 不同颜色空间定义
- 基于颜色图像分割
记得曾经有人谈到,什么是科学? 或者说对于我们来说科学的定义是什么?
Science is a rigorous, systematic endeavor that builds and organizes knowledge in the form of testable explanations and predictions about the world.
这里话题稍微展开一些,因为,从工程技术的角度来说,个人感觉国内目前更多偏于浮躁,注重功利性。因为,目前工程技术在企业、社会上更多的认知是解决问题。
从个人的观点来看,其实科学的定义在wiki百科上讲的非常清楚,换言之,讲的是逻辑和道理。
- 知识体系
- 可解释
- 可预测
因为企业的逐利性,社会的导向性,过于表面的注重解决实际应用问题,而忽略了逻辑和道理。导致很多表现上只要解决问题,就觉得好了,成功了。而真正的本质没有讲清楚或者深入研究清楚,进而无法将科学更好的应用于生产力。
通常也是大家可以看到,很多人似乎能解决问题,但是无法用言语表达清楚,甚至用纸笔记录下来,因为这些问题的解决是一种表象,内部实质问题没有了解清楚。
我可能多说了很多“废话”,希望国内这种浮躁的科学技术作风能有所改善!
2. 颜色空间
颜色空间可以简单的理解为色彩在不同坐标系下的展开方式。
正交坐标系统,通常理解为不同单位向量之间是解耦的关系。对于非正交系统来说,单位向量有松耦合,甚至紧耦合的关系。而颜色在不同坐标系统下的展开也会影响到对于特征的判断。
在计算机视觉里面也有类似的问题,这是一个物理到计算机语言的表达过程。这里就凸显基础学科的重要性,通过定义,基本原理和逻辑来给出解决方案。当然应用方面,“拿来主义”也能出色的完成工作,但是背后的逻辑思路,以及遇到复杂问题的分析能力将会在后续的研发、研究上阻碍技术的发展。
希望通过这些点滴思考,能够对于当下社会浮躁研发氛围有所触发和讨论。当然,总的方向是好的,只不过。。。。
大体上计算机视觉上有以下颜色空间:
- RGB颜色空间
- LAB颜色空间
- YCrCb颜色空间
- HSV颜色空间
2.1 RGB颜色空间
定义:
A linear combination of Red, Green, and Blue values.
The three channels are correlated by the amount of light hitting the surface.
下面是同一个物体在不同光照条件下的对比分析:

- 显著的感知不一致性
- 色度(颜色相关信息)和亮度(强度相关信息)数据的混合
换句话说:其坐标系是非解耦的,有相关性;当亮度变化的时候,RGB都会发生变化。
默认读入的文件数据就是BGR格式:
C++:
//C++
bright = cv::imread('cube1.jpg')
dark = cv::imread('cube8.jpg')
Python:
#python
bright = cv2.imread('cube1.jpg')
dark = cv2.imread('cube8.jpg')
2.2 LAB颜色空间
定义:
L – Lightness ( Intensity ).
a – color component ranging from Green to Magenta.
b – color component ranging from Blue to Yellow.
下面是同一个物体在不同光照条件下的对比分析:

- 感知均匀的颜色空间,近似于我们感知颜色的方式
- 独立于设备(捕捉或显示)
- 在Adobe Photoshop中广泛使用
- 通过一个复杂的变换方程与RGB颜色空间相关的。
BGR转换:
C++:
//C++
cv::cvtColor(bright, brightLAB, cv::COLOR_BGR2LAB);
cv::cvtColor(dark, darkLAB, cv::COLOR_BGR2LAB);
Python:
#python
brightLAB = cv2.cvtColor(bright, cv2.COLOR_BGR2LAB)
darkLAB = cv2.cvtColor(dark, cv2.COLOR_BGR2LAB)
2.3 YCrCb颜色空间
定义:
Y – Luminance or Luma component obtained from RGB after gamma correction.
Cr = R – Y ( how far is the red component from Luma ).
Cb = B – Y ( how far is the blue component from Luma ).
下面是同一个物体在不同光照条件下的对比分析:

- 亮度与LAB类似的
- 与LAB相比,即使在室外图像中,红色和橙色之间的感知差异也较小
- 白色的所有三个组成部分都发生了变化
BGR转换:
C++:
//C++
cv::cvtColor(bright, brightYCB, cv::COLOR_BGR2YCrCb);
cv::cvtColor(dark, darkYCB, cv::COLOR_BGR2YCrCb);
Python:
#python
brightYCB = cv2.cvtColor(bright, cv2.COLOR_BGR2YCrCb)
darkYCB = cv2.cvtColor(dark, cv2.COLOR_BGR2YCrCb)
2.4 HSV颜色空间
定义:
H – Hue ( Dominant Wavelength ).
S – Saturation ( Purity / shades of the color ).
V – Value ( Intensity ).
下面是同一个物体在不同光照条件下的对比分析:

- H分量在两个图像中都非常相似,这表明即使在照明变化的情况下颜色信息也是完整的
- S分量在两幅图像中也非常相似
- V分量捕捉落在其上的光量,因此它会因照明变化而变化
- 室外和室内图像的红色部分的值之间存在巨大差异。这是因为色调表示为一个圆形,而红色处于起始角度。因此,它可以取介于[300360]和[0,60]之间的值
BGR转换:
C++:
//C++
cv::cvtColor(bright, brightHSV, cv::COLOR_BGR2HSV);
cv::cvtColor(dark, darkHSV, cv::COLOR_BGR2HSV);
Python:
#python
brightHSV = cv2.cvtColor(bright, cv2.COLOR_BGR2HSV)
darkHSV = cv2.cvtColor(dark, cv2.COLOR_BGR2HSV)
3 代码工程结构
007_color_spaces是OpenCV基于颜色空间分割区域的示例程序。
3.1 C++应用Demo
C++应用Demo工程结构:
007_color_spaces/CPP$ tree . -L 1
.
├── CMakeLists.txt
├── interactive_color_detect.cpp
├── interactive_color_segment.cpp
├── images
└── pieces2 directories, 3 files
C++示例编译前,确认OpenCV安装路径:
$ find /home/daniel/ -name "OpenCVConfig.cmake"
/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/
/home/daniel/OpenCV/opencv/build/OpenCVConfig.cmake
/home/daniel/OpenCV/opencv/build/unix-install/OpenCVConfig.cmake$ export OpenCV_DIR=/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/
C++应用Demo工程编译执行:
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release
$ cd ..
$ ./build/interactive_color_detect
$ ./build/interactive_color_segment
3.2 Python应用Demo
Python应用Demo工程结构:
007_color_spaces/Python$ tree . -L 1
.
├── data_analysis.py
├── interactive_color_detect.py
├── interactive_color_segment.py
├── images
└── pieces2 directories, 3 files
Python应用Demo工程执行:
$ sudo apt-get install tcl-dev tk-dev python-tk python3-tk
$ workoncv-4.9.0
$ pip install PyQt5 PySide2
$ python interactive_color_detect.py
$ python interactive_color_segment.py
$ python data_analysis.py
4. 重点分析
4.1 interactive_color_detect
- cvtColor(src, dst, code)
获取图像数据中一个点的色彩坐标数据:
C++:
Vec3b bgrPixel(img.at<Vec3b>(y, x));Mat3b hsv,ycb,lab;
// Create Mat object from vector since cvtColor accepts a Mat object
Mat3b bgr (bgrPixel);//Convert the single pixel BGR Mat to other formats
cvtColor(bgr, ycb, COLOR_BGR2YCrCb);
cvtColor(bgr, hsv, COLOR_BGR2HSV);
cvtColor(bgr, lab, COLOR_BGR2Lab);//Get back the vector from Mat
Vec3b hsvPixel(hsv.at<Vec3b>(0,0));
Vec3b ycbPixel(ycb.at<Vec3b>(0,0));
Vec3b labPixel(lab.at<Vec3b>(0,0));
Python:
# get the value of pixel from the location of mouse in (x,y)
bgr = img[y,x]# Convert the BGR pixel into other colro formats
ycb = cv2.cvtColor(np.uint8([[bgr]]),cv2.COLOR_BGR2YCrCb)[0][0]
lab = cv2.cvtColor(np.uint8([[bgr]]),cv2.COLOR_BGR2Lab)[0][0]
hsv = cv2.cvtColor(np.uint8([[bgr]]),cv2.COLOR_BGR2HSV)[0][0]
4.2 interactive_color_segment
- inRange(src, lowerb, upperb, dst )
- bitwise_and(src1, src2, dst, mask)
使用mask过滤图像数据:
C++:
// Get values from the BGR trackbar
BMin = getTrackbarPos("BMin", "SelectBGR");
GMin = getTrackbarPos("GMin", "SelectBGR");
RMin = getTrackbarPos("RMin", "SelectBGR");BMax = getTrackbarPos("BMax", "SelectBGR");
GMax = getTrackbarPos("GMax", "SelectBGR");
RMax = getTrackbarPos("RMax", "SelectBGR");minBGR = Scalar(BMin, GMin, RMin);
maxBGR = Scalar(BMax, GMax, RMax);// Get values from the HSV trackbar
HMin = getTrackbarPos("HMin", "SelectHSV");
SMin = getTrackbarPos("SMin", "SelectHSV");
VMin = getTrackbarPos("VMin", "SelectHSV");HMax = getTrackbarPos("HMax", "SelectHSV");
SMax = getTrackbarPos("SMax", "SelectHSV");
VMax = getTrackbarPos("VMax", "SelectHSV");minHSV = Scalar(HMin, SMin, VMin);
maxHSV = Scalar(HMax, SMax, VMax);// Get values from the LAB trackbar
LMin = getTrackbarPos("LMin", "SelectLAB");
aMin = getTrackbarPos("AMin", "SelectLAB");
bMin = getTrackbarPos("BMin", "SelectLAB");LMax = getTrackbarPos("LMax", "SelectLAB");
aMax = getTrackbarPos("AMax", "SelectLAB");
bMax = getTrackbarPos("BMax", "SelectLAB");minLab = Scalar(LMin, aMin, bMin);
maxLab = Scalar(LMax, aMax, bMax);// Get values from the YCrCb trackbar
YMin = getTrackbarPos("YMin", "SelectYCB");
CrMin = getTrackbarPos("CrMin", "SelectYCB");
CbMin = getTrackbarPos("CbMin", "SelectYCB");YMax = getTrackbarPos("YMax", "SelectYCB");
CrMax = getTrackbarPos("CrMax", "SelectYCB");
CbMax = getTrackbarPos("CbMax", "SelectYCB");minYCrCb = Scalar(YMin, CrMin, CbMin);
maxYCrCb = Scalar(YMax, CrMax, CbMax);// Convert the BGR image to other color spaces
original.copyTo(imageBGR);
cvtColor(original, imageHSV, COLOR_BGR2HSV);
cvtColor(original, imageYCrCb, COLOR_BGR2YCrCb);
cvtColor(original, imageLab, COLOR_BGR2Lab);// Create the mask using the min and max values obtained from trackbar and apply bitwise and operation to get the results
inRange(imageBGR, minBGR, maxBGR, maskBGR);
resultBGR = Mat::zeros(original.rows, original.cols, CV_8UC3);
bitwise_and(original, original, resultBGR, maskBGR);inRange(imageHSV, minHSV, maxHSV, maskHSV);
resultHSV = Mat::zeros(original.rows, original.cols, CV_8UC3);
bitwise_and(original, original, resultHSV, maskHSV);inRange(imageYCrCb, minYCrCb, maxYCrCb, maskYCrCb);
resultYCrCb = Mat::zeros(original.rows, original.cols, CV_8UC3);
bitwise_and(original, original, resultYCrCb, maskYCrCb);inRange(imageLab, minLab, maxLab, maskLab);
resultLab = Mat::zeros(original.rows, original.cols, CV_8UC3);
bitwise_and(original, original, resultLab, maskLab);// Show the results
imshow("SelectBGR", resultBGR);
imshow("SelectYCB", resultYCrCb);
imshow("SelectLAB", resultLab);
imshow("SelectHSV", resultHSV);
Python:
# Get values from the BGR trackbar
BMin = cv2.getTrackbarPos('BGRBMin','SelectBGR')
GMin = cv2.getTrackbarPos('BGRGMin','SelectBGR')
RMin = cv2.getTrackbarPos('BGRRMin','SelectBGR')
BMax = cv2.getTrackbarPos('BGRBMax','SelectBGR')
GMax = cv2.getTrackbarPos('BGRGMax','SelectBGR')
RMax = cv2.getTrackbarPos('BGRRMax','SelectBGR')
minBGR = np.array([BMin, GMin, RMin])
maxBGR = np.array([BMax, GMax, RMax])# Get values from the HSV trackbar
HMin = cv2.getTrackbarPos('HMin','SelectHSV')
SMin = cv2.getTrackbarPos('SMin','SelectHSV')
VMin = cv2.getTrackbarPos('VMin','SelectHSV')
HMax = cv2.getTrackbarPos('HMax','SelectHSV')
SMax = cv2.getTrackbarPos('SMax','SelectHSV')
VMax = cv2.getTrackbarPos('VMax','SelectHSV')
minHSV = np.array([HMin, SMin, VMin])
maxHSV = np.array([HMax, SMax, VMax])# Get values from the LAB trackbar
LMin = cv2.getTrackbarPos('LABLMin','SelectLAB')
AMin = cv2.getTrackbarPos('LABAMin','SelectLAB')
BMin = cv2.getTrackbarPos('LABBMin','SelectLAB')
LMax = cv2.getTrackbarPos('LABLMax','SelectLAB')
AMax = cv2.getTrackbarPos('LABAMax','SelectLAB')
BMax = cv2.getTrackbarPos('LABBMax','SelectLAB')
minLAB = np.array([LMin, AMin, BMin])
maxLAB = np.array([LMax, AMax, BMax])# Get values from the YCrCb trackbar
YMin = cv2.getTrackbarPos('YMin','SelectYCB')
CrMin = cv2.getTrackbarPos('CrMin','SelectYCB')
CbMin = cv2.getTrackbarPos('CbMin','SelectYCB')
YMax = cv2.getTrackbarPos('YMax','SelectYCB')
CrMax = cv2.getTrackbarPos('CrMax','SelectYCB')
CbMax = cv2.getTrackbarPos('CbMax','SelectYCB')
minYCB = np.array([YMin, CrMin, CbMin])
maxYCB = np.array([YMax, CrMax, CbMax])# Convert the BGR image to other color spaces
imageBGR = np.copy(original)
imageHSV = cv2.cvtColor(original,cv2.COLOR_BGR2HSV)
imageYCB = cv2.cvtColor(original,cv2.COLOR_BGR2YCrCb)
imageLAB = cv2.cvtColor(original,cv2.COLOR_BGR2LAB)# Create the mask using the min and max values obtained from trackbar and apply bitwise and operation to get the results
maskBGR = cv2.inRange(imageBGR,minBGR,maxBGR)
resultBGR = cv2.bitwise_and(original, original, mask = maskBGR) maskHSV = cv2.inRange(imageHSV,minHSV,maxHSV)
resultHSV = cv2.bitwise_and(original, original, mask = maskHSV)maskYCB = cv2.inRange(imageYCB,minYCB,maxYCB)
resultYCB = cv2.bitwise_and(original, original, mask = maskYCB) maskLAB = cv2.inRange(imageLAB,minLAB,maxLAB)
resultLAB = cv2.bitwise_and(original, original, mask = maskLAB) # Show the results
cv2.imshow('SelectBGR',resultBGR)
cv2.imshow('SelectYCB',resultYCB)
cv2.imshow('SelectLAB',resultLAB)
cv2.imshow('SelectHSV',resultHSV)
4.3 data_analysis
在4.2章节中,已经通过一个范围来对图像进行过滤,通过示例,可以看出RGB来进行过滤,在亮度发生变化的时候,其分类的效果非常差,简直不可用。
从实际情况来看,期望在颜色分量上,能够存在一个稳定的区间来进行过滤或判别。
本章节采用颜色空间色坐标上的数值来看图像的一致性(可辨性)。
- RGB空间:GB,RB,GR
- HSV空间:SH
- YCrCb空间:CbCr
- LAB空间:BA
由图可以看出,总体上LAB颜色空间的线性比例关系是最好,最易于用来进行颜色判别的。
详见代码:data_analysis.py
4.3.1 黄色

4.3.2 红色

4.3.3 蓝色

4.3.4 绿色

4.3.5 橙色

5. 总结
经过上面实验和讨论,可以比较清晰的看出,在颜色空间做颜色分类的时候,亮度(光照)对于RGB色坐标的影响是比较大的。
在计算机视觉应用这块,当遇到颜色分类的时候,可以使用LAB颜色空间,基于该AB坐标与亮度非耦合的特性来做分割应用会更加合适。
6. 参考资料
【1】ubuntu22.04@laptop OpenCV Get Started
【2】ubuntu22.04@laptop OpenCV安装
【3】ubuntu22.04@laptop OpenCV定制化安装
7. 补充
学习是一种过程,对于前面章节学习讨论过的,就不在文中重复了。
有兴趣了解更多的朋友,请从《ubuntu22.04@laptop OpenCV Get Started》开始,一个章节一个章节的了解,循序渐进。
相关文章:
ubuntu22.04@laptop OpenCV Get Started: 007_color_spaces
ubuntu22.04laptop OpenCV Get Started: 007_color_spaces 1. 源由2. 颜色空间2.1 RGB颜色空间2.2 LAB颜色空间2.3 YCrCb颜色空间2.4 HSV颜色空间 3 代码工程结构3.1 C应用Demo3.2 Python应用Demo 4. 重点分析4.1 interactive_color_detect4.2 interactive_color_segment4.3 da…...
mysql 查询性能优化关键点总结
MySQL查询性能优化是数据库管理的重要环节,良好的性能优化可以提高查询效率,降低系统负载。以下是一些关键点,用于优化MySQL查询性能: 1. 索引优化 索引是MySQL查询优化的重要手段,合理的索引可以大大…...
React - 分页插件默认是英文怎么办
英文组件的通用解决方案 这里以分页插件为例: 大家可以看到,最后的这个页面跳转提示文字为Go to,不是中文,而官网里面的案例则是: 解决方案: import { ConfigProvider } from antd; import zhCN from an…...
揭开Markdown的秘籍:引用|代码块|超链接
🌈个人主页:聆风吟 🔥系列专栏:Markdown指南、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️Markdown 引用1.1 🔔引用1.2 🔔嵌套引用1.3 &…...
【C语言】Debian安装并编译内核源码
在Debian 10中安装并编译内核源码的过程如下: 1. 安装依赖包 首先需要确保有足够的权限来安装包。为了编译内核,需要有一些基础的工具和库。 sudo apt update sudo apt upgrade sudo apt install build-essential libncurses-dev bison flex libssl-d…...
使用 C++23 从零实现 RISC-V 模拟器(6):权限支持
本节内容增加了权限表示,设置了三种权限。当 cpu 初始化时默认的权限为 Machine 模式。接下来实现这三种特权模式,随后实现 sret 和 mret 指令。 RISC-V定义了三种特权等级,分别是用户态(User Mode)、监管态ÿ…...
针对某终端安全自检钓鱼工具的分析
前言 朋友微信找到我,说某微信群利用0day通告进行钓鱼,传播名为“终端安全自检工具”的恶意文件,然后还给了两个IP地址,如下: 咱们就来详细看看这个工具吧。 样本信息 拿到样本,样本的图标,如…...
XSS数据接收平台
一.使用xss数据接收平台的好处: 正常执行反射型xss和存储型xss,反射型xss在执行poc时,会直接在页面弹出执行注入的poc代码;存储型则是,在将poc代码注入用户的系统中后,用户访问有存储型xss的地方ÿ…...
MySQL 基础知识(六)之数据查询(一)
目录 1 基本查询 1.1 查询相关列 (select * / 列名) 1.2 别名 (as) 1.3 去重 (distinct) 1.4 对列中的数据进行运算 (、-、*、/) 2 条件查询 (where) 2.1 等值查询 () 2.2 非等值查询 (>、<、>、<、!、><) 2.3 逻辑判断 (and、or、not) 2.4 区间判…...
C#使用哈希表对XML文件进行查询
目录 一、使用的方法 1.Hashtable哈希表 2.Hashtable哈希表的Add方法 (1)定义 (2)示例 3.XML文件的使用 二、实例 1.源码 2.生成效果 可以通过使用哈希表可以对XML文件进行查询。 一、使用的方法 1.Hashtable哈希表…...
vscode写MATLAB配置
vscode写MATLAB python下载 官网说明Versions of Python Compatible with MATLAB Products by Release - MATLAB & Simulink 不确定这三列都表示什么意思,尽量安装这三列都有的python版本吧,我安装的 MATLAB R2023b,python选择的是3.11.5 …...
第13章 网络 Page734 “I/O对象”的链式传递 单独的火箭发射函数,没有用对的智能指针
上一篇博文中,我们使用单独的火箭发射函数,结果什么结果也没有得到,原因是launch_rocket()函数结束时,其内的局部对象counter生命周期也结束了 那么可以将counter改为指针吗?在堆中分配,这样当函数退出时&…...
Git 存储大文件
Git 存储大文件处理方法 寻找大文件的后缀LFS的安装让仓库支持LFS添加到LFS提交 寻找大文件的后缀 find . -type f -size 10M | grep -v ".git" | rev | cut -d. -f1 | rev | sort | uniq这个命令的工作原理如下: find .-type f -size 10M:查…...
使用 Mermaid 创建流程图,序列图,甘特图
使用 Mermaid 创建流程图和图表 Mermaid 是一个流行的 JavaScript 库,用于创建流程图、序列图、甘特图和其他各种图表。它的简洁语法使得创建图表变得非常简单,无需复杂的绘图工具或专业的编程技能。在本文中,我们将讲解如何使用 Mermaid 来创…...
政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(二){Image tutorial}·{Python语言}
咱们接着上一篇,这次咱们讲使用Matplotlib绘制图像的简短尝试。 我的这个系列的上一篇文章在这里: 政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(一){Pyplot tutorial}https://blog.csdn.net/snowdenkeke/ar…...
gem5学习(20):替换策略——Replacement Policies
目录 一、Random 二、Least Recently Used (LRU) 三、Tree Pseudo Least Recently Used (TreePLRU) 四、Bimodal Insertion Policy (BIP) 五、LRU Insertion Policy (LIP) 六、Most Recently Used (MRU) 七、Least Frequently Used (LFU) 八、First-In, First-Out (FIF…...
嵌入式Qt Qt中的字符串类
一.Qt中的字符串类 QString vs string: QString在Qt库中几乎是无所不在的 所有的Qt图形用户组件都依赖于QString 实验1 :QString 初体验 #include <QDebug> void Sample_1() {QString s "add";s.append(" "); // &q…...
函数高级(C++)
师从黑马程序员 函数默认参数 在C中,函数的形参列表中的形参是可以有默认值的 语法:返回值类型 函数名 (参数默认值 {}) #include <iostream> using namespace std;//函数默认参数//如果我们自己传入数据,…...
jmeter-10调试取样器
文章目录 作用设置使用举例 作用 jmeter中添加调试取样器,可以用于检测测试过程的值如:变量、参数、系统设置等 设置 选择线程组右键 >>> 添加 >>> 取样器 >>> 调试取样器(Debug Sampler) jmeter …...
C#,二进制数的按位旋转(Bits Rotate)算法与源代码
1 二进制数的按位旋转 二进制数的按位旋转(翻转)是编程中常见的按位运算方法。 二进制数的按位旋转分为左转、右转。 左转意味着数据变大,右转意味着数据变小(有损)。 2 源程序 using System; using System.Text; us…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...
