python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算

【0】基础定义

按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。

按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。

 按位异或运算: 两个等长度二进制数上下对齐,相同取0,其余取1。

 按位取反运算:一个二进制数,0变1,1变0。

【2】引言

在前序学习进程中,调用cv2.bitwise()系列函数实现了图像的按位与计算,相关文章链接包括且不限于:

python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算-CSDN博客

python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算-CSDN博客

python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算-CSDN博客

图像的按位与计算,是通过对各个像素点上的BGR值进行操作:先把十进制数转化为二进制数,再进行按位计算,然后再转回十进制数输出。

由于前序文章的重点是对比按位计算前后图像的色彩变化,除按位与计算外,没有详细深究二进制按位计算过程。因此本文以之前按位与计算为基础,对此展开专题探索。

按位与计算的原理探索文章链接为:

python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

【3】项目可行性分析

以输入的外部图像为基础,调用cv2.bitwise()系列函数让图像进行按位计算后,读取相关点的BGR值,使用np.bitwise()系列函数对cv2.bitwise()系列函数按位计算进行原理呈现。

【4】代码测试

首先引入相关模块和图像:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片-直接转化灰度图
src = cv.imread('srcx.png') #读取图像
dst=src #输出图像
gray_src=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstg=gray_src #输出图像
print('初始图像像素大小为',src.shape)
print('初始图像灰度图像素大小为',gray_src.shape)

 除了按位取反操作之外,其他按位操作均需要在引入一张图像:

# 定义第二个图像
image = np.zeros(src.shape, np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('第二个图像像素大小为',image.shape)
image[50:350, :, :] = 180  # 行掩模
image[:,120:200,: ] = 255  # 列掩模
image[:, :, 2] = 120  # 第二个通道值

然后要引入一个8位单通道的二维矩阵定义掩模:

#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155  # 水平区域
mask[:,150:350] = 100  # 竖直区域

之后就调用cv2.bitwise()系列函数执行按位计算:

#执行位运算
#按位与运算
img_and=cv.bitwise_and(src,image) #按位与运算
img_and_mask=cv.bitwise_and(src,image,mask=mask) #按位与运算
#按位或运算
img_or=cv.bitwise_or(src,image) #按位或运算
img_or_mask=cv.bitwise_or(src,image,mask=mask) #按位或运算
#按位异或运算
img_xor=cv.bitwise_xor(src,image) #按位异或运算
img_xor_mask=cv.bitwise_xor(src,image,mask=mask) #按位异或计算
#按位取反运算
img_not=cv.bitwise_not(src) #按位取反运算
img_not_mask=cv.bitwise_not(src,mask=mask) #按位异或计算

按位计算执行以后,图像的BGR值发生变化,这时候使用np.bitwise()系列函数图像的BGR值进行按位计算,以对cv2.bitwise()系列函数按位计算进行原理呈现:

#显示BGR值
print("初始图像dst像素数为[300,180]位置处的BGR=", dst[300,180],'=a')  # 获取像素数为[100,100]位置处的BGR
print("第二个图像image像素数为[300,180]位置处的BGR=", image[300,180],'=b')  # 获取像素数为[100,100]位置处的BGR
print("img_and像素数为[300,180]位置处的BGR=", img_and[300,180],'=c')  # 获取像素数为[100,100]位置处的BGR
print("img_and_mask像素数为[300,180]位置处的BGR=", img_and_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_or像素数为[300,180]位置处的BGR=", img_or[300,180],'=d')  # 获取像素数为[100,100]位置处的BGR
print("img_or_mask像素数为[300,180]位置处的BGR=", img_or_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_xor像素数为[300,180]位置处的BGR=", img_xor[300,180],'=e')  # 获取像素数为[100,100]位置处的BGR
print("img_xor_mask像素数为[300,180]位置处的BGR=", img_xor_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_not像素数为[300,180]位置处的BGR=", img_not[300,180],'=f')  # 获取像素数为[100,100]位置处的BGR
print("img_not_mask像素数为[300,180]位置处的BGR=", img_not_mask[300,180])  # 获取像素数为[100,100]位置处的BGR

a=np.zeros((1,3),np.uint8) #定义矩阵
a=dst[300,180] #将像素点BGR直接赋值给矩阵-初始图像
b=np.zeros((1,3),np.uint8) #定义矩阵
b=image[300,180] #将像素点BGR直接赋值给矩阵-第二个图像
c=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_and
d=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_or
e=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_xor
f=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_not

# 二进制按位与计算
for i in range(3):  # 计数
    print('a', '[0,', i, ']=', a[i], '的二进制转化值=',bin(a[i]))  # 输出二进制转化值
    print('b', '[0,', i, ']=', b[i], '的二进制转化值=',bin(b[i]))  # 输出二进制转化值

    c[0, i] = np.bitwise_and(a[i], b[i])  # 赋值按位与计算值
    print('c', '[0,', i, ']=', c[0,i], '的二进制转化值=', bin(c[0,i]))  # 输出二进制转化值

    d[0, i] = np.bitwise_or(a[i], b[i])  # 赋值按位或计算值
    print('d', '[0,', i, ']=', d[0,i], '的二进制转化值=', bin(d[0,i]))  # 输出二进制转化值

    e[0, i] = np.bitwise_xor(a[i], b[i])  # 赋值按位或计算值
    print('e', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(e[0, i]))  # 输出二进制转化值

    f[0, i] = np.bitwise_not(a[i])  # 赋值按位或计算值
    print('f', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(f[0, i]))  # 输出二进制转化值


    print('c', [0, i], '是a[0,', i, ']和b[0', i, ']按位与的值=np.bitwise_and(a[0,',i, '],b[0,',i,'])=', c[0, i])  # 输出按位与计算值
    print('d', [0, i], '是a[0,', i, ']和b[0', i, ']按位或的值=np.bitwise_or(a[0,',i, '],b[0,',i,'])=', d[0, i])  # 输出按位或计算值
    print('e', [0, i], '是a[0,', i, ']和b[0', i, ']按位异或的值=np.bitwise_xor(a[0,',i, '],b[0,',i,'])=', e[0, i])  # 输出按位异或计算值
    print('f', [0, i], '是a[0,', i, '         ]按位取反的值=np.bitwise_not(a[0,',i, '])=', f[0, i])  # 输出按位取反计算值


# 输出矩阵结果
print('a=', a)  # 输出矩阵
print('b=', b)  # 输出矩阵
print('c=', c)  # 输出矩阵
print('d=', d)  # 输出矩阵
print('e=', e)  # 输出矩阵
print('f=', f)  # 输出矩阵

由于主要关注数值变化,因此未直接显示相关图像,其余代码可作为辅助学习使用:

#合并图像
himg_and_andmask = np.hstack((img_and,img_and_mask))
himg_or_ormask   = np.hstack((img_or,img_or_mask))
himg_xor_xormask = np.hstack((img_xor,img_xor_mask))
himg_not_notmask = np.hstack((img_not,img_not_mask))

# 显示和保存定义的图像
#cv.imshow('dst', dst)  # 显示图像
#cv.imshow('image', image)  # 显示图像
#cv.imshow('mask', mask)  # 显示图像
#cv.imshow('himg_and_andmask', himg_and_andmask)  # 显示图像
#cv.imshow('himg_or_ormask', himg_or_ormask)  # 显示图像
#cv.imshow('himg_xor_xormask', himg_xor_xormask)  # 显示图像
#cv.imshow('himg_not_notmask', himg_not_notmask)  # 显示图像

cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行使用的相关图像有:

图1  初始图像srcx.png

图2  第二张图像image.png 

  图3 掩模mask.png

代码运行后,获得的相关文字输出为:

图4 图像基本属性

图5 特定像素点BGR值读取

读取到特定像素点[300,180]处的BGR之后,首先需要关注:

初始图像在此处的BGR值为:[132  80 121]

第二张图像在此处的BGR值为:[255 255 120]

其余位置的数据,其实是通过cv2.bitwise()系列函数按位计算之后获得的。为追溯这个计算过程,继续获得了输出文字:

图6 特定像素点BGR值-按位计算第一个点

需要注意的是 ,e[0,0]和f[0,0]在0b后面只有7位数字,这是因为0b01111011在0b之后的0确实没有用处,只有占位的作用,所以python就直接省略了。

图7 特定像素点BGR值-按位计算第二个点

a[0,1]和c[0,1]在0b后面只有7位数字,也是因为在0b之后的0确实没有用处,只有占位的作用,所以python就直接省略了。

图8 特定像素点BGR值-按位计算第二个点 

e[0,2]是异或计算的结果,两个二进制数上下对齐,相同取0,其余取1,只有最右侧的位置不同,其余均相同,所以最后的结果是1。

f[0,2]是按位取反的结果,虽然a[0,2]只有7位,但首位的0取反之后就是1,所以f[0,2]有8位数字。

此时的完整代码为:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片-直接转化灰度图
src = cv.imread('srcx.png') #读取图像
dst=src #输出图像
gray_src=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstg=gray_src #输出图像
print('初始图像像素大小为',src.shape)
print('初始图像灰度图像素大小为',gray_src.shape)

# 定义第二个图像
image = np.zeros(src.shape, np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('第二个图像像素大小为',image.shape)
image[50:350, :, :] = 180  # 行掩模
image[:,120:200,: ] = 255  # 列掩模
image[:, :, 2] = 120  # 第二个通道值

#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155  # 水平区域
mask[:,150:350] = 100  # 竖直区域

#执行位运算
#按位与运算
img_and=cv.bitwise_and(src,image) #按位与运算
img_and_mask=cv.bitwise_and(src,image,mask=mask) #按位与运算
#按位或运算
img_or=cv.bitwise_or(src,image) #按位或运算
img_or_mask=cv.bitwise_or(src,image,mask=mask) #按位或运算
#按位异或运算
img_xor=cv.bitwise_xor(src,image) #按位异或运算
img_xor_mask=cv.bitwise_xor(src,image,mask=mask) #按位异或计算
#按位取反运算
img_not=cv.bitwise_not(src) #按位取反运算
img_not_mask=cv.bitwise_not(src,mask=mask) #按位异或计算

#显示BGR值
print("初始图像dst像素数为[300,180]位置处的BGR=", dst[300,180],'=a')  # 获取像素数为[100,100]位置处的BGR
print("第二个图像image像素数为[300,180]位置处的BGR=", image[300,180],'=b')  # 获取像素数为[100,100]位置处的BGR
print("img_and像素数为[300,180]位置处的BGR=", img_and[300,180],'=c')  # 获取像素数为[100,100]位置处的BGR
print("img_and_mask像素数为[300,180]位置处的BGR=", img_and_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_or像素数为[300,180]位置处的BGR=", img_or[300,180],'=d')  # 获取像素数为[100,100]位置处的BGR
print("img_or_mask像素数为[300,180]位置处的BGR=", img_or_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_xor像素数为[300,180]位置处的BGR=", img_xor[300,180],'=e')  # 获取像素数为[100,100]位置处的BGR
print("img_xor_mask像素数为[300,180]位置处的BGR=", img_xor_mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img_not像素数为[300,180]位置处的BGR=", img_not[300,180],'=f')  # 获取像素数为[100,100]位置处的BGR
print("img_not_mask像素数为[300,180]位置处的BGR=", img_not_mask[300,180])  # 获取像素数为[100,100]位置处的BGR

a=np.zeros((1,3),np.uint8) #定义矩阵
a=dst[300,180] #将像素点BGR直接赋值给矩阵-初始图像
b=np.zeros((1,3),np.uint8) #定义矩阵
b=image[300,180] #将像素点BGR直接赋值给矩阵-第二个图像
c=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_and
d=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_or
e=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_xor
f=np.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_not

# 二进制按位与计算
for i in range(3):  # 计数
    print('a', '[0,', i, ']=', a[i], '的二进制转化值=',bin(a[i]))  # 输出二进制转化值
    print('b', '[0,', i, ']=', b[i], '的二进制转化值=',bin(b[i]))  # 输出二进制转化值

    c[0, i] = np.bitwise_and(a[i], b[i])  # 赋值按位与计算值
    print('c', '[0,', i, ']=', c[0,i], '的二进制转化值=', bin(c[0,i]))  # 输出二进制转化值

    d[0, i] = np.bitwise_or(a[i], b[i])  # 赋值按位或计算值
    print('d', '[0,', i, ']=', d[0,i], '的二进制转化值=', bin(d[0,i]))  # 输出二进制转化值

    e[0, i] = np.bitwise_xor(a[i], b[i])  # 赋值按位或计算值
    print('e', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(e[0, i]))  # 输出二进制转化值

    f[0, i] = np.bitwise_not(a[i])  # 赋值按位或计算值
    print('f', '[0,', i, ']=', e[0, i], '的二进制转化值=', bin(f[0, i]))  # 输出二进制转化值


    print('c', [0, i], '是a[0,', i, ']和b[0', i, ']按位与的值=np.bitwise_and(a[0,',i, '],b[0,',i,'])=', c[0, i])  # 输出按位与计算值
    print('d', [0, i], '是a[0,', i, ']和b[0', i, ']按位或的值=np.bitwise_or(a[0,',i, '],b[0,',i,'])=', d[0, i])  # 输出按位或计算值
    print('e', [0, i], '是a[0,', i, ']和b[0', i, ']按位异或的值=np.bitwise_xor(a[0,',i, '],b[0,',i,'])=', e[0, i])  # 输出按位异或计算值
    print('f', [0, i], '是a[0,', i, '         ]按位取反的值=np.bitwise_not(a[0,',i, '])=', f[0, i])  # 输出按位取反计算值


# 输出矩阵结果
print('a=', a)  # 输出矩阵
print('b=', b)  # 输出矩阵
print('c=', c)  # 输出矩阵
print('d=', d)  # 输出矩阵
print('e=', e)  # 输出矩阵
print('f=', f)  # 输出矩阵


#合并图像
himg_and_andmask = np.hstack((img_and,img_and_mask))
himg_or_ormask   = np.hstack((img_or,img_or_mask))
himg_xor_xormask = np.hstack((img_xor,img_xor_mask))
himg_not_notmask = np.hstack((img_not,img_not_mask))

# 显示和保存定义的图像
#cv.imshow('dst', dst)  # 显示图像
#cv.imshow('image', image)  # 显示图像
#cv.imshow('mask', mask)  # 显示图像
#cv.imshow('himg_and_andmask', himg_and_andmask)  # 显示图像
#cv.imshow('himg_or_ormask', himg_or_ormask)  # 显示图像
#cv.imshow('himg_xor_xormask', himg_xor_xormask)  # 显示图像
#cv.imshow('himg_not_notmask', himg_not_notmask)  # 显示图像

cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

综上所述:

a.图像的按位与计算,是通过对各个像素点上的BGR值进行操作:先把十进制数转化为二进制数,再进行按位计算,然后再转回十进制数输出。

b.使用np.bitwise()系列函数对cv2.bitwise()系列函数按位计算进行原理呈现中继续发现,python在输出二进制的过程中,会省略0b之后紧跟的0。

【5】总结

专题探索了cv2.bitwise()系列函数按位计算时的BGR值二进制转化和按位计算过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

U盘打开提示格式化:深度解析与数据恢复全攻略

在数字化时代,U盘作为便捷的数据存储和传输工具,广泛应用于各个领域。然而,当我们满怀期待地插入U盘,却遭遇“U盘打开提示格式化”的尴尬局面时,那份焦虑与无助感油然而生。本文将全面剖析U盘打开提示格式化的原因、应…

将5分钟安装Thingsboard 脚本升级到 3.9

稍微花了一点时间,将5分钟安装Thingsboard 脚本升级到最新版本 3.9。 [rootlab5 work]# cat one-thingsboard.shell echo "test on RHEL 8.10 " source /work/java/install-java.shell source /work/thingsboard/thingsboard-rpm.shell source /work/po…

【新春不断更】题海拾贝:P1878 舞蹈课

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

Windows 程序设计6:错误码的查看

文章目录 前言一、说明二、使用GetLastError找到错误的原因三、使用错误码的宏总结 前言 Windows 程序设计6&#xff1a;错误码的查看。 一、说明 有时写的代码单纯看是没有问题的&#xff0c;但是执行起来就会崩溃。因此要养成判断函数执行是否成功的习惯&#xff0c;除非这…

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过&#xff0c;可以点击下面链接了解&#xff0c;在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数&#xff0c;还独有一个重复计…

安装zsh并美化

0 Zsh 是一种功能强大的 shell&#xff0c;通常用于替代默认的 Bash shell。它为命令行提供了更多的功能&#xff0c;例如自动补全、强大的模式匹配和主题支持等。 Oh My Zsh 是用于管理 Zsh 配置的框架。 powerlevel10k是样式&#xff0c;通过p10k configure脚本可以调节自己…

Hive:复杂数据类型之Map函数

Map函数 是Hive里面的一种复杂数据类型, 用于存储键值对集合。Map中的键和值可以是基础类型或复合类型&#xff0c;这使得Map在处理需要关联存储信息的数据时非常有用。 定义map时,需声明2个属性: key 和 value , map中是 key value 组成一个元素 key-value, key必须为原始类…

WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理

WPF基础 | 深入 WPF 事件机制&#xff1a;路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…

Sklearn 中的逻辑回归

逻辑回归的数学模型 基本模型 逻辑回归主要用于处理二分类问题。二分类问题对于模型的输出包含 0 和 1&#xff0c;是一个不连续的值。分类问题的结果一般不能由线性函数求出。这里就需要一个特别的函数来求解&#xff0c;这里引入一个新的函数 Sigmoid 函数&#xff0c;也成…

【Rust自学】14.6. 安装二进制crate

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.6.1. 从cratea.io安装二进制crate 通过cargo_install命令可以从crates.io安装二进制crate。 这并不是为了替换系统包&#xff0c;它应…

Vue 组件开发:构建高效可复用的前端界面要素

1 引言 在现代 Web 开发中,构建高效且可复用的前端界面要素是提升开发效率和用户体验的关键。Vue.js 作为一种轻量级且功能强大的前端框架,提供了丰富的工具和机制,帮助开发者快速构建高质量的应用程序。通过合理设计和封装 Vue 组件,我们可以实现组件的高效复用,提高开发…

Qt Ribbon使用实例

采用SARibbon创建简单的ribbon界面 实例代码如下所示&#xff1a; 1、头文件&#xff1a; #pragma once #include <SARibbonBar.h> #include "SARibbonMainWindow.h" class QTextEdit; class SAProjectDemo1 : public SARibbonMainWindow { Q_OBJECT pub…

微服务入门(go)

微服务入门&#xff08;go&#xff09; 和单体服务对比&#xff1a;里面的服务仅仅用于某个特定的业务 一、领域驱动设计&#xff08;DDD&#xff09; 基本概念 领域和子域 领域&#xff1a;有范围的界限&#xff08;边界&#xff09; 子域&#xff1a;划分的小范围 核心域…

【Unity3D】实现2D角色/怪物死亡消散粒子效果

核心&#xff1a;这是一个Unity粒子系统自带的一种功能&#xff0c;可将粒子生成控制在一个Texture图片网格范围内&#xff0c;并且粒子颜色会自动采样图片的像素点颜色&#xff0c;之后则是粒子编辑出消散效果。 Particle System1物体&#xff08;爆发式随机速度扩散10000个粒…

AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs

论文标题 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning 跨同构异构图的小样本提示学习 论文链接 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning论文下载 论文作者 Xingtong Yu, Yuan…

密码学的数学基础1-整数 素数 和 RSA加密

数学公式推导是密码学的基础, 故开一个新的课题 – 密码学的数学基础系列 素数 / 质数 质数又称素数。 一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数&#xff1b;否则称为合数&#xff08;规定1既不是质数也不是合数&#xff0…

使用CSS实现一个加载的进度条

文章目录 使用CSS实现一个加载的进度条一、引言二、步骤一&#xff1a;HTML结构与CSS基础样式1、HTML结构2、CSS基础样式 三、步骤二&#xff1a;添加动画效果1、使用CSS动画2、结合JavaScript控制动画 四、使用示例五、总结 使用CSS实现一个加载的进度条 一、引言 在现代网页…

Oracle 创建用户和表空间

Oracle 创建用户和表空间 使用sys 账户登录 建立临时表空间 --建立临时表空间 CREATE TEMPORARY TABLESPACE TEMP_POS --创建名为TEMP_POS的临时表空间 TEMPFILE /oracle/oradata/POS/TEMP_POS.DBF -- 临时文件 SIZE 50M -- 其初始大小为50M AUTOEXTEND ON -- 支持…

图漾相机——C++语言属性设置

文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置&#xff08;TY_TRIGGER_PARAM_EX&#xff09;1.1.2 TY_INT_FRAME_PER_TRIGGER1.1.3 TY_INT_PACKET_DELAY1.1.4 TY_INT_PACKET_SIZE1.1.5 TY_BOOL_GVSP_RESEND1.1.6 TY_BOOL_TRIGGER_OUT_IO1.1.…

NoSQL与SQL比较

1.认识NoSQL NoSql可以翻译做Not Only Sql&#xff08;不仅仅是SQL&#xff09;&#xff0c;或者是No Sql&#xff08;非Sql的&#xff09;数据库。是相对于传统关系型数据库而言&#xff0c;有很大差异的一种特殊的数据库&#xff0c;因此也称之为非关系型数据库。 1.1.结构…