OpenCV-Python图像直方图计算calcHist函数详解、示例及图形呈现

2023-11-09

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython

一、引言

在前面几篇直方图相关的文章中介绍了直方图均衡、直方图匹配、局部直方图处理、基于直方图统计信息进行图像增强处理等图像处理与直方图相关的内容,具体相关内容请参考《《数字图像处理》第三章学习总结感悟2:直方图处理: https://blog.csdn.net/LaoYuanPython/article/details/119856466》,在《数字图像处理:图像直方图基础知识介绍 :https://blog.csdn.net/LaoYuanPython/article/details/120477375》补充介绍了直方图的基础知识,本节将介绍利用OpenCV-Python和MATLAB进行直方图生成和展现相关实现。

二、OpenCV图像直方图的计算

在OpenCV中,图像的直方图计算使用函数calcHist,在C语言中,该函数有多种重载形式,参数也比较多,而在Python中则不一样。

下面是C++版本的calcHist一个重载函数:

void cv::calcHist	(	const Mat * 	images,
int 	nimages,
const int * 	channels,
InputArray 	mask,
OutputArray 	hist,
int 	dims,
const int * 	histSize,
const float ** 	ranges,
bool 	uniform = true,
bool 	accumulate = false 
)

相关介绍网上到处都是,在此就不展开说,而OpenCV-Python关于该函数的资料却很少见,有的也基本是官方文档的简单翻译,下面就calcHist的Python版本介绍一下。

Python中因为不支持函数的多态形式,因此只有一个函数,其定义如下:

hist	=	cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

这些参数说明如下:

  • images:输入图像的列表,如果有多幅图像,则是列表的多个元素,但根据老猿测试,4.3的版本虽然允许输入多个图像,但处理时只处理一幅图像才能正常处理,相关情况请见后面说明
  • channels:需要处理通道的列表,需要统计的通道索引:维度通道序列,第一幅图像的通道标号从0~image[0].channels( )-1。Image[0]表示图像数组中的第一幅图像,channels()表示该图像的通道数量。同理,图像阵列中的第二幅图像,通道标号从image[0].channerls( )开始,到image[0].channerls+image[1].channels( )-1为止;第三、四幅图像的通道标号顺序依此类推;也就是说图像阵列中的所有图像的通道根据图像排列顺序,排成一个通道队列,根据老猿测试,这个多通道支持也基本不可用
  • mask:图像掩膜,是和图像大小相同的8bit灰度图像矩阵,如果只计算输入图像部分区域的直方图时,可通过掩膜来设置参与计算的有效区域(掩膜有效区域的像素值非0)
  • histSize:每个图像维度参与直方图计算的直方图组数
  • ranges:为一个列表,表示参与直方图计算的每个维度的数值范围,即横坐标的最小值和最大值,注意最小值是参与计算的最小值,最大值本身不参与计算,即这个最小值和最大值构成的区间是个半闭半开区间,如要求灰度图的所有像素值都参与计算,则值为[0,256],如果要求计算灰度值在100-250的像素值,则应该设置为[100,251],如果是多个维度,则每个维度的计算范围最小、最大值分别追加到列表中,如有2个维度,都是0到256,则表示为:[0,256,0,256]
  • hist:可选输出结果直方图阵列
  • accumulate:是否累积计算标记,如果设置为True,则直方图在计算时不会将结果清除,此功能能够从多组图像中叠加计算出一个直方图,经老猿验证,OpenCV4.3-Python中好像不起作用

可以看到相比C++版本,python版本变化如下:

  • 参数少了nimages,因为images就是一个列表,无需再传图像数量
  • 参数少了dims,因为数字图像一般就一个物理量-灰度,因此在Python中dims默认为1,不能传值
  • 参数少了uniform,这表示是否为均匀直方图,Python中强制为均匀直方图
  • range参数比C++用法中少了非均匀直方图的表示法

三、直方图计算简单案例

下面构造一个简单的图像数组,来进行直方图的计算,看看计算出来的直方图数据:

import cv2
def test():
    img = np.array([[[1,2,3],[1,2,3],[1,2,3]],[[4,5,6],[4,5,6],[4,5,6]],[[7,8,9],[7,8,9],[7,8,9]]],dtype=np.uint8)
    B, G, R = cv2.split(img)
    hb = cv2.calcHist([B], [0], None, [9], [1,10],accumulate=True)
    hg = cv2.calcHist([G], [0], None, [9], [3, 8],accumulate=True)
    hr = cv2.calcHist([R], [0], None, [9], [1, 5], accumulate=True)
    print("蓝色通道的直方图矩阵如下:")
    print(hb.shape,hb.reshape(hb.shape[0]))
    print("绿色通道的直方图矩阵如下:")
    print(hg.shape, hg.reshape(hg.shape[0]))
    print("红色通道的直方图矩阵如下:")
    print(hr.shape, hr.reshape(hr.shape[0]))
    
test()

上段程序首先构建了3*3的BGR格式的图像矩阵,像素值每个通道由1-9中的数字构成。使用cv2.split做了各像素的三通道拆分,拆分后三通道的像素值如下:
B通道
在这里插入图片描述
G通道
在这里插入图片描述
R通道
在这里插入图片描述
然后分别计算三个通道的直方图数据,注意B通道指定的范围是[1,10],G是[3,8],R是[1,5],三者中绿色通道指定组数是6,其他2个通道指定的组数是9。我们来看看最终输出结果:

蓝色通道的直方图矩阵如下:
(9, 1) [3. 0. 0. 3. 0. 0. 3. 0. 0.]
绿色通道的直方图矩阵如下:
(6, 1) [0. 0. 3. 0. 0. 0.]
红色通道的直方图矩阵如下:
(9, 1) [0. 0. 0. 0. 3. 0. 0. 0. 0.]

可以看到直方图的矩阵是一个组数×1的二阶数组。

蓝色通道中1、 4、 7三个数字各自出现了三次,组设设置ranges设置为【1-10】,组数设置为9,由于上限10不参与计算,因此一个数字就是一个组,1、 4、 7三个数字分别在0组、3组和6组,因此直方图数组展开后的最终结果是[3. 0. 0. 3. 0. 0. 3. 0. 0.]。

绿色通道中2、 5、 8三个数字各自出现了三次,组设设置ranges设置为【3-8】,组数设置为6,由于上限8不参与计算,实际参与直方图计算的数字是3、4、5、6、7共5个,因此2、 5、 8三个数字实际上只有5能纳入直方图统计中,分为6组后,每组的宽度为(8-3)/6=0.833,5在第3组(组号2),因此数组展开后的最终结果是[0. 0. 3. 0. 0. 0.]。

类似地,红色通道中3、 6、 9三个数字各自出现了三次,组设设置ranges设置为【1-5】,组数设置为9,由于上限5不参与计算,实际参与直方图计算的数字是1、2、3、4共5个,因此3、 6、 9三个数字实际上只有3能纳入直方图统计中,分为9组后,每组的宽度为(5-1)/9=0.444,3在第5组(组号4),因此数组展开后的最终结果是[0. 0. 0. 0. 3. 0. 0. 0. 0.]。

**从上面的结果可以看到,参数accumulate=True没有起到作用。**不知道老猿的测试方法是否存在问题。

四、关于多图像直方图的计算

从前面calcHist函数的参数介绍时,可以知道从参数上OpenCV-Python的calcHist函数理论上可以支持多图像直方图的一起计算。但前面也说了,老猿测试没有通过。

下面就介绍一下测试代码:

import cv2
import numpy as np
from collections import Counter

def test():
    img = np.array([[[1,2,3],[1,2,3],[1,2,3]],[[4,5,6],[4,5,6],[4,5,6]],[[7,8,9],[7,8,9],[7,8,9]]],dtype=np.uint8)
    B, G, R = cv2.split(img)

    #cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
    h1 = cv2.calcHist([B, G,R], [0,1,2], None, [9,9,9], [1, 10,1,10,1,10] )
    print("直方图矩阵h1的维数及统计数据为:")
    print(h1.shape,Counter(h1.reshape(h1.shape[0]*h1.shape[1]*h1.shape[2])))
    h2 = cv2.calcHist([B, G, R], [0, 1, 2], None, [9, 1, 1], [1, 10, 1, 10, 1, 10])
    print("直方图矩阵h2的维数为:")
    print(h2.shape,h2.reshape(h2.shape[0]))
    h3 = cv2.calcHist([B, G, R], [0, 1, 2], None, [9], [1, 10, 1, 10, 1, 10])
    print("直方图矩阵h3的维数为:")
    print(h3.shape, h3.reshape(h3.shape[0]))

test()

上述测试代码中,将数字图像的三个通道数据分离后,合在一起进行直方图统计。在传参时,多个图像放到参数images的列表中,要参与直方图计算的channels也是顺序在channels参数列表中,histSize分成三种情况传参,一是[9,9,9],[9,1,1],[9]。

我们先看执行结果:

直方图矩阵h1的维数及统计数据为:
(9, 9, 9) Counter({0.0: 726, 3.0: 3})
直方图矩阵h2的维数为:
(9, 1, 1) [3. 0. 0. 3. 0. 0. 3. 0. 0.]
Traceback (most recent call last):
  File "F:/study/python/project/OpenCV/cvtest/cvtest.py", line 163, in <module>
    test()
  File "F:/study/python/project/OpenCV/cvtest/cvtest.py", line 155, in test
    h3 = cv2.calcHist([B, G, R], [0, 1, 2], None, [9], [1, 10, 1, 10, 1, 10])
cv2.error: OpenCV(4.3.0) C:\projects\opencv-python\opencv\modules\imgproc\src\histogram.cpp:1292: error: (-215:Assertion failed) rsz == dims*2 || (rsz == 0 && images.depth(0) == CV_8U) in function 'cv::calcHist'

从上面结果可以看出来:

  • channels参数为[9,9,9]、[9,1,1]时能正常运行,产生的直方图矩阵是三维矩阵而不是两维矩阵
  • 从第一个直方图的统计数据可以看到,直方图中数据中只出现了3个3,通过DEBUG跟踪可以看到这三个3的位置分别位于直方图结果数组H1的H1[0][1][2]、H1[3][4][5]、H1[6][7][8]三个位置,这个老猿没有想明白
  • 从第二个直方图数据也是三个三,从第二图数值3的位置可以看出,分别在1、 4、 7三个位置出现了3,与单独的蓝色通道出现的直方图结果一样
  • 第三个直方图计算系统报错,是因为channels参数这种传值方式不正确,用[9,1]测试也同样报错

因此从上述测试代码可以看出,老猿在OpenCV4.3-Python多图像的测试结果与官方文档差别很多,基本上可以说明在OpenCV4.3-Python中多图像同时计算直方图不可行。

五、关于彩色图像的直方图计算

上面都是用的灰度图进行的直方图计算,按照官方文档说明彩色图像也可以计算,我们来测试一下:

import cv2
import numpy as np

def test():

    img = np.array([[[1,2,3],[1,2,3],[1,2,3]],[[4,5,6],[4,5,6],[4,5,6]],[[7,8,9],[7,8,9],[7,8,9]]],dtype=np.uint8)

    #cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
    h1 = cv2.calcHist([img], [0], None, [9], [1, 10] )

    print("直方图矩阵h1的维数和数据为:")
    print(h1.shape,h1.reshape(h1.shape[0]))

    h2 = cv2.calcHist([img], [0, 1], None, [9,1], [1, 10, 1, 10],accumulate=True)
    print("直方图矩阵h2的维数为:")
    print(h2.shape, h2.reshape(h2.shape[0]))

test()

看输出结果:

直方图矩阵h1的维数和数据为:
(9, 1) [3. 0. 0. 3. 0. 0. 3. 0. 0.]
直方图矩阵h2的维数为:
(9, 1) [3. 0. 0. 3. 0. 0. 3. 0. 0.]

从上面结果可以看到,确实可以使用彩色图像计算多通道的直方图,不过其计算结果与第一个通道的直方图计算结果相同。channels参数改成[9,9]之后,还是只有三个结果3,位置分别为h2[0][1]、h2[3][4]、h2[6][7]。因此这种多通道参与直方图计算实际上也没有用。

六、装载实际图像计算直方图的案例

下面是加载一张图像的灰度图,进行直方图计算并展示源图、直方图曲线以及直方图的示例代码:

import cv2,matplotlib
from  moviepy.editor import *
import numpy as np
import matplotlib.pyplot as plt  

def test():
    img = cv2.imread(r'f:\pic\fans.jpg',cv2.IMREAD_GRAYSCALE)

    #cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

    h = cv2.calcHist([img], [0], None, [8], [0,256])
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签

    w3 = plt.subplot(212)
    w1 = plt.subplot(221)
    w2 = plt.subplot(222)

    plt.sca(w1)
    plt.imshow(img,'gray')
    plt.title("源图像")

    plt.sca(w2)
    plt.plot(h,color='b')
    plt.title('直方图函数曲线')

    plt.sca(w3)
    w3.spines['right'].set_color('none')
    w3.spines['top'].set_color('none')
    w3.spines['bottom'].set_position(('axes', 0.0296))
    w3.spines['left'].set_position(('axes', 0.0080))
    w3.margins(x=0)
    w3.set_xlim(0,276)
    x = range(0,277,16)
    plt.xticks(x,rotation=70)
    plt.hist(img.ravel(),bins=16,density=None,facecolor='b',edgecolor='r',alpha=1,histtype='bar')
    plt.title('Hist')
    plt.ylabel('像素数')
    plt.xlabel('灰度级')
    ymin,ymax = w3.get_ylim()
    xmin,xmax = w3.get_xlim()
    print(xmin,xmax,ymin,ymax)
    annotation1 = plt.annotate( '>', [xmax*0.996,0], [xmax*0.996,0])
    annotation2 = plt.annotate('^', [0,ymax*0.93], [ 0,ymax*0.93])
    plt.show()


test()

上述代码图像的加载和直方图的计算,关键是画出相关的图,老猿是第一次用matplotlib画图,弄了一整天才画出如下效果:
在这里插入图片描述
至于图像画出的代码在此就不展开介绍了,如果有时间,将单独总结今天画图所使用的matplotlib知识点,还是挺有意思的。

七、小结

本文详细介绍了OpenCV-Python图像直方图计算calcHist函数的语法以及使用案例,从几个测试案例可以看出OpenCV-Python的直方图计算比C语言版本功能还是差的比较多。最后介绍了一个使用matplotlib画出直方图的完整案例和代码。希望这些介绍有助于大家详细了解OpenCV-Python图像直方图计算的方法。

更多图像直方图处理的内容请参考《《数字图像处理》第三章学习总结感悟2:直方图处理》的介绍。

更多图像处理请参考专栏OpenCV-Python图形图像处理》及《图像处理基础知识》的介绍。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《 专栏:Python基础教程目录》从零开始学习Python。

如对文章内容存在疑问或需要相关资料,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询,可通过扫二维码加微信公众号。
在这里插入图片描述

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython

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

OpenCV-Python图像直方图计算calcHist函数详解、示例及图形呈现 的相关文章

  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql

随机推荐

  • [数据库] Navicat for MySQL触发器更新和插入操作

    一 触发器概念 触发器 trigger 监视某种情况 并触发某种操作 它是提供给程序员和数据分析员来保证数据完整性的一种方法 它是与表事件相关的特殊的存储过程 它的执行不是由程序调用 也不是手工启动 而是由事件来触发 例如当对一个表进行操作
  • 获取机器人turtlebot3 在gazebo 中仿真导航时的位姿真值

    背景 机器人在gazebo环境中仿真导航 除了实时获取传感器数据估计机器人位姿外 为了验证定位算法的精度 我们需要获得机器人在gazebo worlds下的真实位姿 方法一 在机器人模型的urdf文件或者sdf文件中加入一个ros plug
  • ruoyi+vue回显数字的问题,解决方案

    在项目中用ruoyi框架和前端vue进行开发 需求是在前端生成下拉框 下拉框中的内容需要调用后端接口进行数据返回 现在新增的时候 数据已经返回了 但是再修改的时候 进行回显数据导致前端列表中展示出来的数字 不是我们想要的 我们想要的是回显成
  • react学习笔记之三--State

    State概述 state可以理解成vue中的data 没学过vue也不要紧 就相当于设置一个页面的全局变量 设置的同时也要设置setter 这样就能实现更新state并重新渲染组件 定义的规则如下 const index setIndex
  • C/C++ 关于double和float两种类型的区别

    float 是单精度浮点数 内存占4个字节 有效数字8位 表示范围是 3 40E 38 3 40E 38 double 是双精度浮点数 内存占8个字节 有效数字16位 表示范是 1 79E 308 1 79E 308 include
  • YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析

    前言 前面简单介绍了YOLOv5的网络结构和创新点 直通车 YOLO系列 YOLOv5超详细解读 网络详解 在接下来我们会进入到YOLOv5更深一步的学习 首先从源码解读开始 因为我是纯小白 刚开始下载完源码时真的一脸懵 所以就先从最基础的
  • 高级实战案例:Python反反爬之JavaScript混淆

    写在前面 很早之前在吾爱破解论坛上看见了 猿人学 Web端爬虫攻防大赛 当时进入他们官网的时候 比赛已经结束了 看着那些题目还挺有意思的 但由于各种原因一直没有机会去做那些题目 最近比较闲 就去把猿人学官网打开看了一下 尝试着完成了第一道题
  • 输入框不能输入空格

    就酱 yourInputValue indexOf gt 0 复制代码 转载于 https juejin im post 5a39da775188256970782058
  • Jenkins+webhooks-多分支参数化构建-

    Jenkins webhooks 多分支参数化构建 需求 我这里是因为公司有个静态资源 构建完成是需要放在nginx的发布目录 但是每次手动构建不是很方便 我这里配置的是webhook更新代码触发自动构建 但是我们环境又分为正式环境跟测试环
  • 关于AF_INET和PF_INET

    AF 表示ADDRESS FAMILY 地址族 PF 表示PROTOCL FAMILY 协议族 Winsock2 h中 define AF INET 0 define PF INET AF INET 所以在windows中AF INET与P
  • Error in readRDS(dest) : error reading from connection

    Error in readRDS dest error reading from connection 解决办法 可能是镜像设置错误 导致无法抓取文件 修改 RStudio 中的镜像地址 设置成功后再运行成功 转载于 https www c
  • glip, glipv2介绍

    clip是使用 描述图片的句子 和 图片分类 作为一组输入来训练网络 glip是使用 描述图片的句子 和 图片检测任务 作为一组输入来训练网络 clip使用4亿对 glip使用27milliion 3M人工标定 24M网络爬 glipv2比
  • 菜刀连接图片一句话木马

    1 先制作图片一句话木马 找好一张图片如 fox jpg 并且准备好一句话脚本php文件fox php 在图片所在文件夹打开cmd命令行 执行命令 copy fox jpg b fox php a fox1 jpg 生成图片一句话文件fox
  • windows7 防火墙关于文件共享的设置

    WIN7自带防火墙的设置相较XP下有了较大的变化 近日在设置文件夹共享上遇到了一些小问题 后来解决了 过程如下 首先 在文件夹上右键 属性 共享 里 高级共享 共享此文件夹 然后给Everyone用户以读的权限 这一步和在XP下没什么区别
  • BigDecimal 前后端交互失去精度

    在Controller层通过 ResponseBody将返回数据自动转换成json时 不做任何处理 而直接传给前端的话 在BigDecimal长度大于17位 不包括小数点 会出现精度丢失 在Long长度大于17位时也会出现精度丢失的问题 解
  • C语言实现字典树

    leetcode 208的代码 include
  • 商用密码应用安全性评估测评过程指南_商用密码应用安全性评估的具体评估内容...

    如何合规 正确 有效使用商用密码 充分发挥商用密码在保障网络空间安全中的核心技术和基础支撑作用 关乎国家大局 关乎网络空间安全 关乎用户个人隐私 因此 要在保证商用密码应用大力推进和普及的同时 做好网络与信息系统的商用密码应用安全性评估 确
  • 前端系列之JavaScript(BOM对象)

    什么是BOM BOM browser object model 浏览器对象模型 window对象 全局对象 说明 所有的全局变量和全局方法都被归为window上
  • Mysql日期格式转化问题

    MySQL索引优化 MySQL慢查询优化 一文详解MySQL各种锁及MVCC的使用场景及原理 最近遇到一个需求 大致内容是查询近七天内所有设备每天的工作时间和 里面涉及到日期格式转化 子查询 分组查询等问题 较为复杂 以此记录 数据库内容
  • OpenCV-Python图像直方图计算calcHist函数详解、示例及图形呈现

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 在前面几篇直方图相关的文章中介绍了直方图均衡 直方图匹配 局部直方图处理 基于直方图统计信息进行图像增强处理等图像处理与直方图相关的