opencv-day2-图像预处理1

news2024/11/5 2:38:01

图像预处理

在计算机视觉和图像处理领域,图像预处理能够提高后续处理(如特征提取、目标检测等)的准确性和效率。

常见的图像预处理操作:

  1. 图像色彩空间转换

  2. 图像大小调整

  3. 图像仿射变换

  4. 图像翻转

  5. 图像裁剪

  6. 图像二值化处理

  7. 图像去噪

  8. 边缘检测

  9. 图像平滑处理

  10. 图像形态学

图像翻转

cv2.flip 是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。这个函数接受两个参数:要翻转的图像和一个指定翻转类型的标志。

函数签名

cv2.flip(src, flipCode[, dst]) -> dst

参数说明

  • src:输入图像,可以是任意类型和深度的多通道图像。

  • flipCode

    :指定翻转类型的整数标志:

    • 0:沿 X 轴翻转(垂直翻转)

    • 1:沿 Y 轴翻转(水平翻转)

    • -1:沿 X 轴和 Y 轴翻转(同时水平和垂直翻转)

  • dst:可选参数,输出图像。如果未提供,输出图像将与输入图像具有相同的尺寸和类型。

示例

以下是一些使用 cv2.flip 的示例代码:

import cv2
​
# 加载图像
image = cv2.imread("save_image/car.png")
# 翻转: -1:水平和垂直 1:水平翻转,0 垂直翻转
img = cv2.flip(image, -1)
# 显示原始图像和翻转后的图像
cv2.imshow('img', img)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img=cv2.imread("image/car.png")
#翻转:0:垂直翻转;1:水平翻转;-1是水平垂直翻转
f_img=cv2.flip(img,-1)
cv2.imshow("old",img)
cv2.imshow("new",f_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像仿射变换

仿射变换(Affine Transformation)是一种线性变换,它保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。在图像处理中,仿射变换常用于旋转、缩放、平移和剪切等操作。

图像旋转

旋转操作可以将图像绕着某个点旋转一定的角度

实例代码

import cv2
​
# 加载图像
image = cv2.imread("images/car.png")
# 获取图像的尺寸
(h, w) = image.shape[:2]
# 设置旋转中心和旋转角度
center = (w // 2, h // 2)
# 计算旋转矩阵
# 旋转角度(可修改)
angle = 40
# 缩放比例 1.0 表示不缩放
M = cv2.getRotationMatrix2D(center, angle, 1.0)
# 进行旋转
rotated_image = cv2.warpAffine(image, M, (w, h))
cv2.imshow('Rotated Image', rotated_image)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.getRotationMatrix2D 是 OpenCV 库中的一个函数,用于获取旋转矩阵。这个函数主要用于图像的旋转变换。旋转矩阵是一个 2x3 的矩阵,可以用来将图像围绕指定的中心点旋转指定的角度,并且可以选择是否进行缩放。

函数签名

cv2.getRotationMatrix2D(center, angle, scale) -> M

参数说明

  • center:旋转中心点的坐标,格式为 (x, y)

  • angle:旋转角度,单位为度。正角度表示逆时针旋转,负角度表示顺时针旋转。

  • scale:缩放比例。如果设置为 1,则不进行缩放。

返回值

  • M:2x3 的旋转矩阵。

示例

以下是一个使用 cv2.getRotationMatrix2D 的示例代码,

cv2.warpAffine 函数

仿射变换 函数

cv2.warpAffine(src, M, dsize, dst) →
  • src: 输入图像。

  • M: 2x3 的变换矩阵,类型为 np.float32

  • dsize: 输出图像的尺寸,形式为 (width, height)

  • dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。

import cv2
​
img=cv2.imread("image/car.png")
#获取图片的像素
(h,w)=img.shape[:2]
#旋转的坐标
center=(100,120)
#旋转的角度
du=30
#获取图像矩阵
m=cv2.getRotationMatrix2D(center,du,1)#1:保留不变;>1放大;<1缩小
#图像旋转
w_img=cv2.warpAffine(img,m,(w,h))
cv2.imshow("image",w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像平移

平移操作可以将图像中的每个点沿着某个方向移动一定的距离

import cv2
import numpy as np
​
# 读取图像
img = cv2.imread("images/car5.png")
#获取图片像素
(h, w) = img.shape[:2]
# 定义平移矩阵
#tx 图片x轴移动200,ty是图片y轴移动50px
tx, ty = 200, 50
#获取平移矩阵
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 应用平移变换
translated = cv2.warpAffine(img, M, (w, h))
# 显示结果
cv2.imshow('Translated Image', translated)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,tx 和 ty 分别表示在x轴和y轴方向上的平移距离。

import cv2
import numpy as np
​
img=cv2.imread("image/car.png")
(h,w)=img.shape[:2]
#定义平移水平和垂直移动的距离
ty=50
tx=100
#创建一个平移的矩阵
#t_img=np.float32([[1,0,tx],[0,1,ty]])
t_img=cv2.getRotationMatrix2D((tx,ty),-1,1)#?
w_img=cv2.warpAffine(img,t_img,(w,h))
​
cv2.imshow("m",w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像缩放

缩放操作可以改变图像的大小

import cv2
import numpy as np
​
# 读取图像
img = cv2.imread("images/car5.png")
h, w, channels = img.shape
# 定义缩放因子
sx, sy = 1.5, 1.5
M = np.float32([[sx, 0, 0], [0, sy, 0]])
# 应用缩放变换
scaled = cv2.warpAffine(img, M, (int(w * sx), int(h* sy)))
# 显示结果
cv2.imshow('Scaled Image', scaled)
cv2.waitKey(0)
cv2.destroyAllWindows()

sx 和 sy 分别表示在x轴和y轴方向上的缩放因子。

import cv2
import numpy as np
​
img=cv2.imread("image/car.png")
(h,w)=img.shape[:2]
#定义缩放的参数,缩放的参数大于1的是放大,小于1的是缩小
ww=1.5
hh=1.5
m=np.float32([[ww,0,0],[0,hh,0]])
#仿射变换
t_img=cv2.warpAffine(img,m,(int(w*ww),int(h*hh)))
​
cv2.imshow("m",t_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像剪切

剪切操作可以改变图像的形状,使其在某个方向上倾斜

import cv2
import numpy as np
​
# 读取图像
img = cv2.imread("images/car5.png")
rows, cols, _ = img.shape
# 定义剪切因子
shx, shy = 0.2, 0.2
M = np.float32([[1, shx, 0], [shy, 1, 0]])
# 应用剪切变换
sheared = cv2.warpAffine(img, M, (cols, rows))
​
# 显示结果
cv2.imshow('Sheared Image', sheared)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2
import numpy as np
​
img=cv2.imread("image/car.png")
(h,w)=img.shape[:2]
#定义图像剪切的参数
sx=0.1
sy=1
#定义矩形
m=np.float32([[1,sx,0],[sy,1,0]])
#图像剪切
i_img=cv2.warpAffine(img,m,(w,h))
cv2.imshow("o",img)
cv2.imshow("a",i_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像色彩空间转换

OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。

色彩空间转换有几个重要的作用:

  1. 方便图像处理:在不同的颜色空间中,对应的通道代表了不同的属性,例如在RGB空间中,红、绿、蓝三个通道分别代表了颜色的强度,而在HSV空间中,H(色相)代表了颜色的种类,S(饱和度)代表了颜色的深浅,V(亮度)代表了颜色的明暗。因此,对于不同的处理需求,选择不同的颜色空间进行处理可以更加方便。

  2. 提高图像处理效果:在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪点。

  3. 节省计算资源:在某些情况下,使用特定的颜色空间可以帮助我们节省计算资源。例如,在RGB空间中,每个像素需要3个通道来表示,而在灰度空间中,每个像素只需要一个通道就可以表示。因此,如果我们只需要处理亮度信息而不需要颜色信息时,将图像转换为灰度空间可以节省计算资源。

总之,色彩空间转换在图像处理中是一项非常重要的技术,它可以方便我们对图像进行处理,并提高图像处理的效果和节省计算资源。

cv2.cvtColor()是OpenCV中的一个函数,用于图像颜色空间的转换。它可以将一个图像从一个颜色空间转换为另一个颜色空间,比如从RGB到灰度图像的转换,或者从BGR到HSV的转换等。

函数的语法如下:

cv2.cvtColor(src, code)

参数说明:

  • src:输入图像,可以是一个NumPy数组或者一个OpenCV的Mat对象。

  • code:指定转换的类型,可以使用预定义的转换代码,例如cv2.COLOR_BGR2GRAY表示从BGR到灰度图像的转换。

RGB 转 Gray(灰度)

RGB 转 Gray(灰度),将彩色图像转换为灰度图像,可以减少数据量并简化算法。

    image = cv2.imread("../images/car.png")
    # 将图像从BGR到灰度图像的转换
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
​
    # 显示原始图像和转换后的灰度图像
    cv2.imshow('old Image', image)
    cv2.imshow('new Image', gray_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
import cv2
​
img=cv2.imread("image/car.png")
#图像色彩空间转换
#opencv默认的图像格式BGR
#COLOR_BGR2GRAY 把BGR图像转换成灰度图像
gay_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img)#矩阵信息
print('--------------')
print(gay_img)
cv2.imshow("old",img)
cv2.imshow("new",gay_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

RGB 转 HSV

RGB 转 HSV,HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。

import cv2
#在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。
# 例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
#转换后的图像
cv2.imshow('new Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
​
img=cv2.imread("image/car.png")
#图像色彩空间转换
#opencv默认的图像格式BGR
#COLOR_BGR2HSV 把BGR图像转换成HSV图像,提高亮度和饱和度
gay_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
print(img)#矩阵信息
print('--------------')
print(gay_img)
cv2.imshow("old",img)
cv2.imshow("new",gay_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像二值化处理

案例:

import cv2
​
# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
​
# 应用阈值
thresh_value = 127
retval, binary_image = cv2.threshold(image, thresh_value, 255, cv2.THRESH_BINARY)
​
# 显示结果
cv2.imshow('原图', image)
cv2.imshow('二值图像', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.threshold 是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景,常用于图像处理和分析。以下是该函数的主要功能和用法简介:

功能

cv2.threshold 将灰度图像转换为二值图像,根据指定的阈值将像素值分为两类:高于阈值的像素设为一个值(通常是255),低于阈值的像素设为另一个值(通常是0)。

语法

retval, dst = cv2.threshold(src, thresh, maxval, type)
​

参数

  1. src: 输入的灰度图像。

  2. thresh: 阈值,决定分割的界限。

  3. maxval: 当像素值超过阈值时,赋予的最大值(通常为255)。

  4. type

    : 阈值类型,常用的有:

    • cv2.THRESH_BINARY: 超过阈值的像素设为最大值,其余设为0。

    • cv2.THRESH_BINARY_INV: 超过阈值的像素设为0,其余设为最大值。

    • cv2.THRESH_TRUNC: 超过阈值的像素设为阈值,其余不变。

    • cv2.THRESH_TOZERO: 超过阈值的像素不变,其余设为0。

    • cv2.THRESH_TOZERO_INV: 超过阈值的像素设为0,其余不变。

返回值

  • retval: 实际使用的阈值(可能与输入值不同)。

  • dst: 输出的二值图像。

import cv2
img=cv2.imread("image/car.png")
#把图像转换成灰度图像
g_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化处理
#re实际应用阈值,t_img:转换后的图像
rs,t_img=cv2.threshold(g_img,100,255,cv2.THRESH_BINARY)
cv2.imshow("aa",img)
cv2.imshow("a",t_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像掩膜

它通常用于创建掩膜,以便从图像中提取特定颜色的区域。

函数原型

cv2.inRange(src, lowerb, upperb)
​

参数

  • src: 输入的图像,可以是彩色图像(HSV图像,不是BGR图像)或灰度图像。

  • lowerb: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值。

  • upperb: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。

返回值

  • 返回一个二值图像,白色部分表示在指定颜色范围内的区域,黑色部分表示不在范围内的区域

案例

import cv2
import numpy as np
​
# 读取图像
image = cv2.imread("images/car.png")
# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义颜色范围,(蓝色区域)
lower = np.array([100, 100, 100])
upper = np.array([140, 255, 255])
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
cv2.imshow('01', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
​
img=cv2.imread("image/car5.png")
#把图像转换成HSV空间
hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#获取蓝色所在HSV范围,需要自己根据实际情况做调整
lower=np.array([100,100,50])
height=np.array([140,255,255])
#创建掩膜-针对特定的颜色
#hsv_img输入的图像是HSV图像
mask=cv2.inRange(hsv_img,lower,height)
cv2.imshow("b",img)
cv2.imshow("a",mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像位与操作

cv2.bitwise_and() 是 OpenCV 库中的一个函数,用于对两个图像进行按位与操作。这个操作会逐个像素地对两个输入图像进行比较,只有在两个像素均为 255(白色)时,输出的像素才会为 255(白色),否则输出为 0(黑色)。这个函数在图像处理中的应用非常广泛,尤其是在掩膜和图像分割等任务中

函数原型

dst = cv2.bitwise_and(src1, src2, mask=None)
​

参数说明

  • src1: 第一个输入图像。

  • src2: 第二个输入图像。两幅图像应具有相同的尺寸和类型。

  • mask: 可选参数,用于指定一个掩膜。如果提供,只有在掩膜的相应位置为非零时,才会计算输出。

返回值

  • 返回按位与操作后的图像(dst)。

案例

import cv2
import numpy as np
​
# 读取图像
image = cv2.imread("images/car.png")
# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义颜色范围,(蓝色区域)
lower = np.array([100, 100, 100])
upper = np.array([140, 255, 255])
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
#位与操作
image = cv2.bitwise_and(image,image,mask=mask)
cv2.imshow('01', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像检测轮廓

cv2.findContours 函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表示物体的边界,常用于物体检测、分割和形状分析。

语法

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

参数

  1. image: 输入的二值图像。通常在调用该函数之前需要将图像转换为灰度图像并进行二值化处理(如使用 cv2.thresholdcv2.Canny)。

  2. mode

    : 轮廓检索模式:

    • cv2.RETR_EXTERNAL: 只检索外部轮廓。

    • cv2.RETR_LIST: 检索所有轮廓,并将其放入列表中。

    • cv2.RETR_TREE: 检索所有轮廓,并建立层级关系。

  3. method

    : 轮廓逼近方法:

    • cv2.CHAIN_APPROX_SIMPLE: 压缩轮廓,仅保留端点。

    • cv2.CHAIN_APPROX_NONE: 保留所有轮廓点。

返回值

  • contours: 一个 Python 列表,其中每个元素是一个轮廓(即一组点),轮廓的点以 NumPy 数组的形式存储。

  • hierarchy: 轮廓的层级信息,包含轮廓之间的关系。

案例:

import cv2
​
# 读取图像并转换为灰度图像
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理
retval, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
​
# 把灰度图像转换彩色图像
output_image = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2BGR)
# 绘制轮廓
cv2.drawContours(output_image, contours, -1, (0, 255, 0), 2)
# 显示结果
cv2.imshow('Contours', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.boundingRect 函数介绍

cv2.boundingRect 是 OpenCV 中用于计算轮廓的最小外接矩形的函数。这个函数可以返回一个包含轮廓的最小矩形的边界框,通常用于对象检测、图像分割等任务中。最小外接矩形是一个完全包围轮廓的矩形,其边与图像的坐标轴平行。

案例

import cv2
​
# 读取图像并转换为灰度图像
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理
retval, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
​
# 把灰度图像转换彩色图像
output_image = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2BGR)
# 绘制轮廓
cv2.drawContours(output_image, contours, -1, (0, 255, 0), 2)
# 在每个轮廓上绘制最小外接矩形
for contour in contours:
    #获取绘制轮廓的边界框
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(output_image, (x, y), (x + w, y + h), (0, 100, 0), 2)
# 显示结果
cv2.imshow('Contours', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

练习:

完成对车牌的分割提取

1 基于车牌是蓝色,可以通过掩模找到车牌所在区域

import cv2
import numpy as np
​
# 读取图像
image = cv2.imread("../images/car.png")
​
# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
​
# 定义颜色范围,(蓝色区域)
lower = np.array([100, 100, 100])
upper = np.array([140, 255, 255])
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
cv2.imshow('Contours', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:

2 掩模返回一个二值对象,可以通过图像轮廓检测,检测当前掩码图像的轮廓

# 查找轮廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
​
# 在每个轮廓上绘制最小外接矩形
for contour in contours:
    #获取绘制轮廓的边界框
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果如下:

3 获取所有轮廓的边界框,我们发现车牌轮廓也在期间,通过调试,我们给一个车牌尺寸的范围值,提取车牌

    x, y, w, h = cv2.boundingRect(contour)
    if w > 50 and h > 20:  # 可根据实际车牌尺寸调整
      cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

效果如下:

4 最后,用图片切割切出车牌

  plate_image = image[y:y + h, x:x + w]  # 切割车牌区域

import cv2
import numpy as np
img=cv2.imread("image/car.png")
#把图像转换成HSV空间
hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#获取蓝色所在HSV范围,需要自己根据实际情况做调整
lower=np.array([100,100,50])
height=np.array([140,255,255])
#创建掩模-针对特定的颜色
#hsv_img输入的图像是HSV图像
mask=cv2.inRange(hsv_img,lower,height)
​
# #把图像转化为灰度图像
# # gay_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化处理
ret,t_img=cv2.threshold(mask,120,255,cv2.THRESH_BINARY)
#检测轮廓
myList,c=cv2.findContours(t_img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#把图像转换成BGR图像
bgr_img=cv2.cvtColor(t_img,cv2.COLOR_GRAY2BGR)
#画出检测的轮廓的点
out_img=cv2.drawContours(bgr_img,myList,-1,(0,255,0),1)
​
for c in myList:
    x,y,w,h=cv2.boundingRect(c)
    print(x,y,w,h)
    # 根据图片实际情况调整
    if w>100 and h>50:
#画出轮廓
       cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),1)
       #找w,h最大值
       cai_img=img[y:y+h,x:x+w]
​
​
cv2.imshow("a",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

3DDFA-V3——基于人脸分割几何信息指导下的三维人脸重建

1. 研究背景 从二维图像中重建三维人脸是计算机视觉研究的一项关键任务。在虚拟现实、医疗美容、计算机生成图像等领域中&#xff0c;研究人员通常依赖三维可变形模型&#xff08;3DMM&#xff09;进行人脸重建&#xff0c;以定位面部特征和捕捉表情。然而&#xff0c;现有的方…

Ubuntu系统如何实现键盘按键映射到其他按键(以 Ctrl+c 映射到 F3,Ctrl+v 映射到 F4 为例)

文章目录 写在前面1. 功能描述2. 实现步骤2.1 安装AutoKey2.2 软件设置2.2.1 软件设置 2.3 测试是否安装成功 参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 1. 功能描述 Ubuntu系统使用Ctrlc 、Ctrlv 进行复制粘贴操作的时候&#xff0c;时间长了就会出现小拇指…

【Clickhouse】客户端连接工具配置

ClickHouse 是什么 ClickHouse 是一个分布式实时分析型列式存储数据库。具备高性能&#xff0c;支撑PB级数据&#xff0c;提供实时分析&#xff0c;稳定可扩展等特性。适用于数据仓库、BI报表、监控系统、互联网用户行为分析、广告投放业务以及工业、物联网等分析和时序应用场…

postman的脚本设置接口关联

pm常用的对象 变量基础知识 postman获取响应结果的脚本的编写 下面是购物场景存在接口信息的关联 登录进入---搜索商品---进入商品详情---加入购物车 资源在附件中&#xff0c;可以私聊单独发送 postman的SHA256加密 var CryptoJS require(crypto-js);// 需要加密的字符串 …

Qt 文件目录操作

Qt 文件目录操作 QDir 类提供访问系统目录结构 QDir 类提供对目录结构及其内容的访问。QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问 Qt 的资源系统。 Qt 使用“/”作为通用目录分隔符&#xff0c;与“/”在 URL 中用作路径分隔符…

qt QCheckBox详解

QCheckBox 是 Qt 框架中的一个控件&#xff0c;用于创建复选框&#xff0c;允许用户进行选择和取消选择。它通常用于表单、设置界面和任何需要用户选择的场景。 QCheckBox继承自QAbstractButton类&#xff0c;因此继承了按钮的特性。它表示一个复选框&#xff0c;用户可以通过…

读数据工程之道:设计和构建健壮的数据系统26数据建模

1. 数据建模 1.1. 良好的数据架构必须反映出使用这些数据的组织的业务目标和业务逻辑 1.2. 数据湖1.0、NoSQL和大数据系统的兴起&#xff0c;使工程师们有时是为了合理的性能提升去忽略传统的数据建模 1.3. 数据在企业中的地位急剧上升&#xff0c;人们越来越认识到&#xf…

2025生物发酵展(济南)为生物制造产业注入新活力共谱行业新篇章

2025第十四届国际生物发酵展将于3月3-5日济南盛大举办&#xff01;产业链逐步完整&#xff0c;展会面积再创历史新高&#xff0c;展览面积较上届增涨至60000平方米&#xff0c;专业观众40000&#xff0c;品牌展商800&#xff0c;同期活动会议增加至50场&#xff0c;展会同期将举…

Windows版 nginx安装,启动,目录解析,常用命令

Windows版 nginx安装&#xff0c;启动&#xff0c;目录解析&#xff0c;常用命令 一级目录二级目录三级目录 1. 下载2. 启动方式一&#xff1a;方式二&#xff1a; 3. 验证是否启动4. 安装目录解析5. 常用命令 一级目录 二级目录 三级目录 1. 下载 官网下载&#xff1a;ngi…

【maven】idea执行了maven的install命令给本地安装项目依赖包 安装后删除

目录 事件起因环境和工具操作过程解决办法1、找到对应的目录下的文件&#xff0c;手动去删除&#xff0c;比如我的依赖库的路径是D:\qc_code\apache-maven-3.8.2\repository 我只需要找到这个目录下对应的依赖包进行手动删除即可&#xff08;不推荐&#xff0c;强行删除文件夹文…

技术选型不当对项目的影响与补救措施

在项目管理中&#xff0c;初期技术选型与项目需求不匹配的情况并不罕见&#xff0c;这可能导致项目延误、成本增加和最终成果的不理想。补救的关键措施包括&#xff1a;重新评估技术选型、加强团队沟通、实施有效的需求管理以及建立持续的反馈机制。其中&#xff0c;重新评估技…

基于SSM+VUE宠物医院后台管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

MySQL 8.0在windows环境安装及配置

文章目录 一、下载二、安装三、配置环境变量 一、下载 1、先彻底卸载之前的MySQL&#xff0c;并清理其 残留文件 。 2、登录网址https://www.mysql.com/ 3、点击网址左下角“中文”按钮&#xff0c;切换到中文界面 4、点击网页上方的“下载”按钮&#xff0c;然后点击网页…

【传知代码】用于图像识别的判别图正则化技术

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 论文概述图正则化技术及其优点参考文献&#xff1a; 算法流程在标准BLS中嵌入判别图正则化的方法 模型整体架构代码复现图拉普拉斯矩阵的构建—…

第二十五章 Vue父子通信之sync修饰符

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 2.3. BaseDialog.vue 三、运行效果 一、概述 前面的章节我们讲到&#xff0c;通过v-model我们可以实现父子组件间的通信&#xff0c;但是使用v-model的时候&#xff0c;子组件接收的prop属性名必须固定为valu…

头歌——机器学习(逻辑回归)

文章目录 逻辑回归简述代码 sklearn逻辑回归 - 手写数字识别代码 逻辑回归算法详解似然与概率的区别逻辑回归算法的代码实现代码 逻辑回归案例 - 癌细胞精准识别代码 逻辑回归简述 什么是逻辑回归 当一看到“回归”这两个字&#xff0c;可能会认为逻辑回归是一种解决回归问题的…

【高等数学】3-2多元函数积分学

1. 二重积分 可以想象你有一块不规则的平面薄板,它在一个平面区域上。二重积分就是用来求这个薄板的质量(假设薄板的面密度函数是)。 把区域划分成许多非常小的小方块(类似于把一块地划分成很多小格子),在每个小方块上,密度近似看成是一个常数,然后把每个小方块的质量加…

需求管理流程与工具:国内外10款综合评测

本文中&#xff0c;分享了10款需求管理工具&#xff1a;1.PingCode&#xff1b;2.Worktile&#xff1b;3.纷享销客&#xff1b;4.Teambition&#xff1b;5.Jira&#xff1b;6.Trello&#xff1b;7.Figma&#xff1b;8.万维需求管理&#xff1b;9.ClickUp&#xff1b;10.项目管理…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

嵌入式之C语言(基础篇)

首先&#xff0c;我们要知道什么是程序。程序&#xff1a;为了让计算机执行某操作或解决某个问题而编写的一系列有序指令的集合。 一、计算机语言简史 第一代是机器语言&#xff1a;时间实在1946年&#xff0c;第一台计算机ENIAC诞生&#xff0c;用的是穿孔卡片做的&#xff0c…