计算机视觉基础(十)—— HOG特征描述算子之行人检测

2023-11-04

本次任务将学习一种在深度学习之前非常流行的图像特征提取技术——方向梯度直方图(Histogram of Oriented Gradients),简称HOG特征。HOG特征是在2005年CVPR的会议发表,在图像手工特征提取方面具有里程碑式的意义,当时在行人检测领域获得了极大成功。
学习HOG特征的思想也有助于我们很好地了解传统图像特征描述和图像识别方法,本次任务我们将学习到HOG背后的设计原理,和opencv的实现。

1 HOG特征简介

在这里插入图片描述
HOG特征是一种图像局部特征,其基本思路是对图像局部的梯度幅值和方向进行投票统计,形成基于梯度特性的直方图,然后将局部特征拼接起来作为总特征。局部特征在这里指的是将图像划分为多个子块(Block), 每个Block内的特征进行联合以形成最终的特征。
HOG+SVM的工作流程如下:
在这里插入图片描述
首先对输入的图片进行预处理,然后计算像素点的梯度特特性,包括梯度幅值和梯度方向。然后投票统计形成梯度直方图,然后对blocks进行normalize,最后收集到HOG feature(其实是一行多维的vector)放到SVM里进行监督学习,从而实现行人的检测。下面我们将对上述HOG的主要步骤进行学习。

2 HOG特征的原理

2.1图像预处理

预处理包括灰度化和Gamma变换。
灰度处理是可选操作,因为灰度图像和彩色图像都可以用于计算梯度图。对于彩色图像,先对三通道颜色值分别计算梯度,然后取梯度值最大的那个作为该像素的梯度。
然后进行伽马矫正,调节图像对比度,减少光照对图像的影响(包括光照不均和局部阴影),使过曝或者欠曝的图像恢复正常,更接近人眼看到的图像。
伽马矫正公式:
f ( I ) = I γ f(I)=I^\gamma f(I)=Iγ I I I表示图像, γ \gamma γ表示幂指数。
如图,当 γ \gamma γ取不同的值时对应的输入输出曲线( γ = 1 \gamma=1 γ=1时输入输出保持一致) :
1) 当 γ < 1 \gamma<1 γ<1时,输入图像的低灰度值区域动态范围变大,进而图像低灰度值区域对比度得以增强;在高灰度值区域,动态范围变小,进而图像高灰度值区域对比度得以降低。 最终,图像整体的灰度变亮。
2) 当 γ > 1 \gamma>1 γ>1时,输入图像的高灰度值区域动态范围变小,进而图像低灰度值区域对比度得以降低;在高灰度值区域,动态范围变大,进而图像高灰度值区域对比度得以增强。 最终,图像整体的灰度变暗。
在这里插入图片描述
代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('*.png', 0)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img2 = np.power(img/float(np.max(img)),1/2.2)
plt.imshow(img2)
plt.axis('off')
plt.show()

2.2 计算图像梯度

为了得到梯度直方图,那么首先需要计算图像水平方向和垂直方向梯度。
一般使用特定的卷积核对图像滤波实现,可选用的卷积模板有:soble算子、Prewitt算子、Roberts模板等等。
一般采用soble算子,OpenCV也是如此,利用soble水平和垂直算子与输入图像卷积计算 d x dx dx d y dy dy
Sobel X = [ 1 0 − 1 ] ∗ [ 1 2 1 ] = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] \text {Sobel}_{X}=\left[\begin{array}{c} 1 \\ 0 \\ -1 \end{array}\right] *\left[\begin{array}{ccc} 1 & 2 & 1 \end{array}\right]=\left[\begin{array}{ccc} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{array}\right] SobelX=101[121]=101202101

Sobel Y = [ 1 2 1 ] ∗ [ 1 0 − 1 ] = [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \text {Sobel}_{Y}=\left[\begin{array}{l} 1 \\ 2 \\ 1 \end{array}\right] *\left[\begin{array}{lll} 1 & 0 & -1 \end{array}\right]=\left[\begin{array}{ccc} 1 & 0 & -1 \\ 2 & 0 & -2 \\ 1 & 0 & -1 \end{array}\right] SobelY=121[101]=121000121

d x = f ( x , y ) ∗ Sobel ⁡ x ( x , y ) d y = f ( x , y ) ∗ Sobel ⁡ y ( x , y ) \begin{array}{l} d_{x}=f(x, y)^{*} \operatorname{Sobel}_{x}(x, y) \\ \\ d_{y}=f(x, y)^{*} \operatorname{Sobel}_{y}(x, y) \end{array} dx=f(x,y)Sobelx(x,y)dy=f(x,y)Sobely(x,y)

进一步可以得到图像梯度的幅值:
M ( x , y ) = d x 2 ( x , y ) + d y 2 ( x , y ) M(x, y)=\sqrt{d_{x}^{2}(x, y)+d_{y}^{2}(x, y)} M(x,y)=dx2(x,y)+dy2(x,y) 为了简化计算,幅值也可以作如下近似:
M ( x , y ) = ∣ d x ( x , y ) ∣ + ∣ d y ( x , y ) ∣ M(x, y)=\left|d_{x}(x, y)\right|+\left|d_{y}(x, y)\right| M(x,y)=dx(x,y)+dy(x,y) 角度为:
θ M = arctan ⁡ ( d y / d x ) \theta_{M}=\arctan \left(d_{y} / d_{x}\right) θM=arctan(dy/dx) 这里需要注意的是:梯度方向和图像边缘方向是互相正交的。
在这里插入图片描述
代码:

mport cv2
import numpy as np

# Read image
img = cv2.imread('*.jpg')
img = np.float32(img) / 255.0  # 归一化

# 计算x和y方向的梯度
gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)
gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1)

# 计算合梯度的幅值和方向(角度)
mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)

2.3 计算梯度直方图

经过上一步计算,每一个像素点都会有两个值:梯度幅值/梯度方向。
在这一步中,图像被分成若干个8×8的cell,例如我们将图像resize至64x128的大小,那么这幅图像就被划分为8x16个8x8的cell单元,并为每个8×8的cell计算梯度直方图。当然,cell的划分也可以是其他值:16x16,8x16等,根据具体的场景确定。
在计算梯度直方图,让我们先了解一下为什么我们将图像分成若干个cell?
这是因为如果对一整张梯度图逐像素计算,其中的有效特征是非常稀疏的,不但运算量大,而且会受到一些噪声干扰。于是我们就使用局部特征描述符来表示一个更紧凑的特征,计算这种局部cell上的梯度直方图更具鲁棒性。
以8x8的cell为例,一个8x8的cell包含了8x8x2 = 128个值,因为每个像素包括梯度的大小和方向。
在HOG中,每个8x8的cell的梯度直方图本质是一个由9个数值组成的向量, 对应于0、20、40、60…160的梯度方向(角度)。那么原本cell中8x8x2 = 128个值就由长度为9的向量来表示,用这种梯度直方图的表示方法,大大降低了计算量,同时又对光照等环境变化更加地鲁棒。
首先,看下图:
在这里插入图片描述
左图是衣服64x128的图像,被划分为8x16个8x8的cell;中间的图像表示一个cell中的梯度矢量,箭头朝向代表梯度方向,箭头长度代表梯度大小。
右图是 8×8 的cell中表示梯度的原始数值,注意角度的范围介于0到180度之间,而不是0到360度, 这被称为“无符号”梯度,因为两个完全相反的方向被认为是相同的。
接下来,我们来计算cell中像素的梯度直方图,将0-180度分成9等份,称为9个bins,分别是0,20,40…160。然后对每个bin中梯度的贡献进行统计:
在这里插入图片描述
统计方法是一种加权投票统计, 如上图所示,某像素的梯度幅值为13.6,方向为36,36度两侧的角度bin分别为20度和40度,那么就按一定加权比例分别在20度和40度对应的bin加上梯度值,加权公式为:
20度对应的bin:((40-36)/20) * 13.6,分母的20表示20等份,而不是20度;
40度对应的bin:((36-20)/20) * 13.6,分母的20表示20等份,而不是20度;

还有一个细节需要注意,如果某个像素的梯度角度大于160度,也就是在160度到180度之间,那么把这个像素对应的梯度值按比例分给0度和160度对应的bin。如左下图绿色圆圈中的角度为165度,幅值为85,则按照同样的加权方式将85分别加到0度和160度对应的bin中。
在这里插入图片描述
对整个cell进行投票统计,正是在HOG特征描述子中创建直方图的方式,最终得到由9个数值组成的向量—梯度方向图:
在这里插入图片描述

2.4 Block 归一化

HOG特征将8×8的一个局部区域作为一个cell,再以2×2个cell作为一组,称为一个block,也就是说一个block表示16x16的区域。
我们可能会想,为什么又需要分block呢?
这是因为,虽然我们已经为图像的8×8单元创建了HOG特征,但是图像的梯度对整体光照很敏感。这意味着对于特定的图像,图像的某些部分与其他部分相比会非常明亮。
我们不能从图像中完全消除这个。但是我们可以通过使用16×16个块来对梯度进行归一化来减少这种光照变化。
由于每个cell有9个值,一个block(2×2个cell)则有36个值,HOG是通过滑动窗口的方式来得到block的,如下图所示:
在这里插入图片描述
前面已经说明,归一化的目的是为了降低光照的影响,因为梯度对整体光照非常敏感,比如通过将所有像素值除以2来使图像变暗,那么梯度幅值将减小一半,因此直方图中的值也将减小一半,我们就需要将直方图“归一化”。
归一化的方法有很多:L1-norm、L2-norm、max/min等等,一般选择L2-norm。
例如对于一个[128,64,32]的三维向量来说,模长是 12 8 2 + 6 4 2 + 3 2 2 = 146.64 \sqrt{128^2+64^2+32^2}=146.64 1282+642+322 =146.64,这叫做向量的L2范数。将这个向量的每个元素除以146.64就得到了归一化向量 [0.87, 0.43, 0.22]。
采用同样的方法,一个cell有一个梯度方向直方图,包含9个数值,一个block有4个cell,那么一个block就有4个梯度方向直方图,将这4个直方图拼接成长度为36的向量,然后对这个向量进行归一化。
而每一个block将按照上图滑动的方式进行重复计算,直到整个图像的block都计算完成。

2.5 获得HOG描述子

每一个16 * 16大小的block将会得到一个长度为36的特征向量,并进行归一化。 那会得到多少个特征向量呢?
例如,对于上图被划分8 * 16个cell ,每个block有2x2个cell的话,那么cell的个数为:(16-1)x(8-1)=105。即有7个水平block和15个竖直block。
每个block有36个值,整合所有block的特征值,最终获得由36 * 105=3780个特征值组成的特征描述符,而这个特征描述符是一个一维的向量,长度为3780。
获得HOG特征向量,就可以用来可视化和分类了。对于多维的HOG特征,SVM就可以排上用场了。

3 基于OpenCV的实现

代码

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    src = cv.imread("*.jpg")
    cv.imshow("input", src)
    hog = cv.HOGDescriptor()
    hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
    # Detect people in the image
    (rects, weights) = hog.detectMultiScale(src,
                                            winStride=(2,4),
                                            padding=(8, 8),
                                            scale=1.2,
                                            useMeanshiftGrouping=False)
    for (x, y, w, h) in rects:
        cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)
        
    cv.imshow("hog-detector", src)
    cv.imwrite("hog-detector.jpg",src)
    cv.waitKey(0)
    cv.destroyAllWindows()

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

可视化:

from skimage import feature, exposure
from matplotlib import pyplot as plt
import cv2

image = cv2.imread('sp_g.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
fd, hog_image = feature.hog(image, orientations=9, pixels_per_cell=(8, 8),
                    cells_per_block=(2, 4), visualise=True)
                    
# Rescale histogram for better display
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 10))
cv2.namedWindow("img",cv2.WINDOW_NORMAL)
cv2.imshow('img', image)
cv2.namedWindow("hog",cv2.WINDOW_NORMAL)
cv2.imshow('hog', hog_image_rescaled)
cv2.waitKey(0)==ord('q')

可视化结果:
在这里插入图片描述

总结

HOG算法具有以下优点:

  • HOG描述的是边缘结构特征,可以描述物体的结构信息
  • 对光照影响不敏感
  • 分块的处理可以使特征得到更为紧凑的表示

HOG算法具有以下缺点:

  • 特征描述子获取过程复杂,维数较高,导致实时性差
  • 遮挡问题很难处理
  • 对噪声比较敏感

相关技术文档、论文推荐

Datawhale

Datawhale是一个专注于数据科学与AI领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。Datawhale以“for the learner,和学习者一起成长”为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机视觉基础(十)—— HOG特征描述算子之行人检测 的相关文章

  • OpenCV warpPerspective 性能缓慢

    在我的应用程序中 我跟踪一个物体 到达它的地方corners都在这个框架中 我发现它之间的单应性corners从最后一帧开始和 当前帧 使用单应性来做perspectiveTransform on the corners在当前帧中找到 得到
  • Python中使用cv2获取当前视频播放位置

    我正在尝试使用 CV2 和 Python 从播放视频中获取当前播放时间位置 如果可能 以毫秒为单位 目前我正在使用此示例代码来播放视频文件 import cv2 import numpy as np file name 2 mp4 wind
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • OpenCV 中更新窗口的 waitKey() 的替代方法

    到目前为止我见过的所有示例和书籍都建议使用 waitKey 1 来强制重新绘制 OpenCV 窗口 这看起来很奇怪而且太老套了 不必要的时候为什么还要等待 1 毫秒呢 还有其他选择吗 我尝试了 cv updateWindow 但它似乎需要
  • 使用 openCV 锐化视频图像

    我想使用 OpenCV 锐化我的图像 我在网上查看了一个示例 该示例正在对灰度图像执行锐化 我尝试了它 它工作得很好 然而 我现在尝试做同样的事情 但使用 RGB 颜色 所以我分别在三个通道上执行相同的功能 但它没有给我任何结果 图像与原始
  • 针对不同相机(RGB 和红外)的 StereoCalibrate

    我在校准两个摄像头时遇到问题 第一个是 RGB 第二个是红外 它们有不同的分辨率 我调整了大小并裁剪了更大的图像 焦距等等 例子 RGB 1920x1080 Infrared 512x424 如何相互校准它们 我应该在stereoCalib
  • 使用 Unity3D 解决 PnP

    我有一个真实 物理的棍子 上面连接有红外摄像头和一些红外 LED 它们形成了我正在使用的模式 以便使虚拟棍子以与物理棍子相同的方式移动 为此 我在 Python 中使用 OpenCV 并将由solvePnP 计算的旋转和平移向量发送到 Un
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 从索贝尔确定图像梯度方向?

    我正在尝试使用 openCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我从此处复制了许多资源和答案中的方法 但无论我做什么 所得方向始终在 0 57 度之间 我希望范围为 0 360 我相信所有的深度
  • OpenCV:视频录制太快

    我有一个简单的录像机 录制来自网络摄像头的视频 theVideoWriter open filename countAsString ext CV FOURCC X V I D 30 Size 1920 1080 true while re
  • 如何使用 SimpleBlobDetector 获取 blob 的额外信息?

    robot sherrick 回答了我这个问题 https stackoverflow com a 13534094 1705967 这是他回答的后续问题 cv SimpleBlobDetectorOpencv 2 4 中的 看起来非常令人
  • 在 Android 中使用 OpenCV 查找图像匹配

    我正在尝试构建一个 Android 应用程序 该应用程序可以比较设备相机拍摄的照片 以在一组图像中找到匹配项 我已经在 Android Studio 上配置了 OpenCV 但仅此而已 有人可以通过链接到资源或建议教程来提供帮助吗 Open
  • 使用 OpenCV VideoWriter 将 RTSP 流存储为视频文件

    我正在使用 OpenCV 开发一个 Python 模块 该模块连接到 RTSP 流以对视频执行一些预处理 主要是降低 fps 和分辨率 然后将其存储在文件系统中 但是 即使在尝试了几种编解码器 寻找类似的开发之后 我总是得到一个空的视频 我
  • 使用 SURF 在检测到的对象周围绘制矩形

    我正在尝试从涉及冲浪检测器的以下代码中检测对象 我不想绘制匹配项 我想在检测到的对象周围绘制一个矩形 但不知何故我无法获得正确的单应性 请任何人指出在哪里我走错了 include
  • 基本的 Python OpenCV 裁剪和调整大小

    有人可以帮我一些裁剪算法吗 它的 openCV 我想弄清楚这一点 我知道方法是crop image y y1 x x1 如果我有一个带有 new dimensionXxnew dimensionY 像素的图像 并且我想将其裁剪为相同的宽度
  • OpenCV 读取视频文件时内存不足

    此示例从文件中读取视频cv2 VideoCapture在 python OpenCV 中内存不足 import cv2 cap cv2 VideoCapture file mp4 while True ret frame cap read
  • 如何确定透视变换后的点在新图像平面中的位置?

    我使用 OpenCV Python Numpy 图像中有三个点 我知道这些点的确切位置 P1 P2 N1 我要将图像转换为另一个视图 例如 我将透视图转换为侧视图 如果这样做 我将无法获得图像平面中这三个点的确切位置 我应该以一种可以获得这
  • Opencv 运动检测与跟踪

    我需要在网络摄像头的视频帧中进行强大的运动检测和跟踪 背景总是一样的 目的是识别物体的位置 如果可能的话没有阴影 但并不急于去除阴影 我已经尝试过用于背景减法和阈值化的opencv算法 但这仅取决于一个图像作为背景 如果背景的亮度 或相机自
  • 从凸点获取角点

    我编写了算法来提取图像中显示的点 它们形成凸形 我知道它们的顺序 如何从这些点中提取角点 顶部 3 个和底部 3 个 我正在使用opencv 如果你已经有了物体的凸包 并且该包包含角点 那么你需要做的就是简化包直到它只有 6 个点 有很多方
  • 如何识别与我的对象相关的轮廓并找到它们的几何质心

    问题陈述和背景信息 EDIT 约束 法兰上的红色会随着时间的推移而变化 所以我此时不会尝试使用颜色识别来识别我的对象 除非它足够强大 此外 外部照明也可能是一个因素 因为将来这将是在室外区域 我有 RGB 深度相机 有了它 我就能捕捉到这个

随机推荐

  • 使用SecureCRT 和 SecureFX遇到的几点问题以及解决

    一 使用SecureCRT 时候打开SecureFX的时候无法连接到Linux目录 打开SecureFX的时候无法打开上传目录弹出对话框 the file transfer protocol none specified in the se
  • 基于图像的火焰识别调研总结

    转载请注明出处https blog csdn net Hey chaoxia article details 85054870 简单总结一下近期的调研结果 一 简介 火焰的图像识别 主要围绕火焰的颜色特征 运动特征 几何特征与纹理特征来分析
  • Vue3+Vite+Pinia+Naive后台管理系统搭建之一:基础项目构建

    前言 如果对 vue3 的语法不熟悉的 可以移步 Vue3 0 基础入门 快速入门 github 开源库 Vue3 Vite Pinia Naive Js gitee 开源库 Vue3 Vite Pinia Naive Js 1 构建项目
  • AQS流程图

    整个AQS加锁解锁过程
  • jq 获取下拉框的值和value

    误区 一直以为jquery获取select中option被选中的文本值 是这样写的 s text 获取所有option的文本值 实际上应该这样 s option selected text 获取选中的option的文本值 获取select中
  • 深入了解ln命令:创建硬链接和符号链接的实用指南

    文章目录 1 引言 1 1 关于ln命令 1 2 ln命令的作用和用途 2 基本用法 2 1 创建硬链接 2 2 创建符号链接 2 3 区别硬链接和符号链接 3 操作示例 3 1 创建硬链接的示例 3 2 创建符号链接的示例 3 3 查看链
  • eval()函数的用法

    1 eval 函数函数基本原理 eval s 函数将去掉字符串s最外侧的引号 并按照Python语句方式执行去掉引号后的字符内容 使用方式如下 lt 变量 gt eval lt 字符串 gt a eval 1 2 print a 输出结果
  • 客户管理系统 详细流程(不用三大框架)

    客户管理系统的详细编写流程 一 系统设计 1 需求分析 系统中包含哪些数据模型 数据模型存在怎样的关系 E R图 UML 用例图 2 制作页面Demo 和真实系统效果一样 给客户确认需求 3 技术选型 环境搭建 软件建模工具 IBM RSA
  • [Python-9]GUI编程

    一 GUI图形用户界面编程介绍 我们前面实现的都是基于控制台的程序 程序和用户的交互通过控制台来完成 本章 我们将学习GUI Graphics User Interface 即图形用户界面编程 我们可以通过python提供的丰富的组件 快速
  • SSM商城项目实战:后台管理用户认证

    SSM商城项目实战 后台管理用户认证 1 项目概述 本项目是一个基于SSM Spring SpringMVC MyBatis 框架的商城后台管理系统 用于管理商品 订单和用户等信息 在本篇博客中 我们将重点介绍如何实现后台管理用户的认证功能
  • opengl点的绘制

    include stdafx h include
  • unity的错误解决办法:NullReferenceException: Object reference not set to an instance of an object;tiny proje

    普通unity项目 正常的项目中 这是个非常初级的错误 比较常见的原因是就是在对象被引用前没有实例化 即是说 你要管理好程序的生命周期 解决办法1 设置不同的生命周期 生命周期就是脚本中的Awake Start Update等方法 他们会以
  • WIN 10环境下安装pytorch环境并跑通Yolox-demo

    文章目录 前言 一 Pytorch是什么 二 搭建Pytorch框架步骤 1 安装Anaconda 2 安装CUDA和CUDNN 3 安装Pytorch 三 Pycharm上跑通Yolox 1 下载Yolox项目 2 导入pycharm并设
  • 使用IDEA快速部署到Docker云端

    一 Docker对外提供服务 1 编辑服务配置文件 vim lib systemd system docker service 2 定位到ExecStart开头行 将原本的ExecStart usr bin dockerd H fd con
  • js aes加密_威feng网站的aes算法破解

    网站是 aHR0cHM6Ly93d3cuZmVuZy5jb20v 话说这个网站在过年前使用了aes算法 当然过年后也是aes 但就是把秘钥换了 换成更需要解密一段字符串 然后获得秘钥 最后请求时候再去用这个秘钥加密 并且最后发现秘钥和偏移是
  • mysql语句添加字段和注释

    简单点的 工作中需要对某个表进行添加字段 输出脚本 添加字段关键字 alter 注释关键字 comment ALTER TABLE 表名 ADD 字段名 varchar 20 COMMENT 注释内容 不要注释 去掉comment就行了 o
  • python opencv图片二值化后取出图片中心区域的轮廓

    python opencv图片二值化后取出图片中心区域的轮廓 1 导入必要的库 import cv2 import numpy as np 2 读取图片并将其转为灰度图像 image cv2 imread image jpg gray cv
  • vue封装指针样式

    新建style js文件 HandPointer 鼠标经过 BodyPointer 默认指针 可以设置多个样式 const HandPointer gt return cursor url require 图片路径 auto const B
  • Antd中RangePicker组件弹出的日历中英混杂,月份和周显示为英问题

    在开发中需要用到antd中的RangePicker组件 但是出现了一个问题 日历中英混杂 年份是中文 月份和周都是英文 搜索了一下这个问题主要是moment造成的 可能有很多种情况 需要根据项目的自身情况来修改 首先确定一下项目中packa
  • 计算机视觉基础(十)—— HOG特征描述算子之行人检测

    本次任务将学习一种在深度学习之前非常流行的图像特征提取技术 方向梯度直方图 Histogram of Oriented Gradients 简称HOG特征 HOG特征是在2005年CVPR的会议发表 在图像手工特征提取方面具有里程碑式的意义