历史上消失的那 10 天去哪了?

如果你查过万年历,会发现1582年10月居然少了10天!http://wannianli.fkcha.com/year_1582_month_10.html

640?wx_fmt=png


Linux上有个cal命令可以查日历,如果你查过1752年,可能会奇怪,为什么9月2号后面是14号,却是丢失了11天!

[root@root ~]# cal 1752                               1752       January               February                 MarchSu Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa          1  2  3  4                      1    1  2  3  4  5  6  7 5  6  7  8  9 10 11    2  3  4  5  6  7  8    8  9 10 11 12 13 1412 13 14 15 16 17 18    9 10 11 12 13 14 15   15 16 17 18 19 20 2119 20 21 22 23 24 25   16 17 18 19 20 21 22   22 23 24 25 26 27 2826 27 28 29 30 31      23 24 25 26 27 28 29   29 30 31        April                   May                   JuneSu Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa          1  2  3  4                   1  2       1  2  3  4  5  6 5  6  7  8  9 10 11    3  4  5  6  7  8  9    7  8  9 10 11 12 1312 13 14 15 16 17 18   10 11 12 13 14 15 16   14 15 16 17 18 19 2019 20 21 22 23 24 25   17 18 19 20 21 22 23   21 22 23 24 25 26 2726 27 28 29 30         24 25 26 27 28 29 30   28 29 30                       31        July                  August                SeptemberSu Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa          1  2  3  4                      1          1  2 14 15 16 5  6  7  8  9 10 11    2  3  4  5  6  7  8   17 18 19 20 21 22 2312 13 14 15 16 17 18    9 10 11 12 13 14 15   24 25 26 27 28 29 3019 20 21 22 23 24 25   16 17 18 19 20 21 2226 27 28 29 30 31      23 24 25 26 27 28 29                       30 31       October               November               DecemberSu Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa 1  2  3  4  5  6  7             1  2  3  4                   1  2 8  9 10 11 12 13 14    5  6  7  8  9 10 11    3  4  5  6  7  8  915 16 17 18 19 20 21   12 13 14 15 16 17 18   10 11 12 13 14 15 1622 23 24 25 26 27 28   19 20 21 22 23 24 25   17 18 19 20 21 22 2329 30 31               26 27 28 29 30         24 25 26 27 28 29 30                                              31

640?wx_fmt=png

原来是 1582 年格里历法将 10 月 5 日到 10 月 14 日直接抹掉了 ,见维基百科 https://zh.wikipedia.org/zh-cn/%E6%A0%BC%E9%87%8C%E6%9B%86

格里历(拉丁语:Calendarium Gregorianum,又译国瑞历、额我略历、格列高利历、格里高利历、葛瑞格里历、格列高历,也称基督历 ),是由意大利医生兼哲学家阿洛伊修斯·里利乌斯改革儒略历制定的历法,由罗马大公教会教宗额我略十三世在1582年颁行。公历是阳历的一种,于1912年在中国引进采用,因农历等中国传统历法是阴阳历,故公历在中文中又称阳历、西历、新历、公历。格里历与儒略历一样,格里历也是每四年在2月底置一闰日,但格里历特别规定,除非能被400整除,所有的世纪年(能被100整除)都不设闰日;如此,每四百年,格里历仅有97个闰年,比儒略历减少3个闰年 。

格里历的历年平均长度为365.2425日,接近平均回归年的365.242199074日,即每3300年误差一日,也更接近春分点回归年的365.24237日,即每8000年误差一日;而儒略历的历年为365.25日,每128年就误差一日 。到1582年时,儒略历的春分日(3月21日)与地球公转到春分点的实际时间已相差10天。因此,格里历开始实行时,将儒略历1582年10月4日星期四的次日,为格里历1582年10月15日星期五,即有10天被删除,但原星期的周期保持不变。格里历的纪年沿用儒略历,当年定历以耶稣诞生年开始起算(但考证是公元前4年出生,但此记数法沿用至今),称为“公元”。

1582,好熟悉的年份,如果你看过《万历十五年》或熟悉明史应该知道,这一年是万历十年,一代名臣张居正过世,推行的一条鞭法也宣告结束,好不容易出现的大明中兴苗头就这样又被压下去,万历三十年不上朝,从此大明开始走下坡路,直到1644甲申国难,崇祯自缢煤山,最后一个汉人王朝大明结束了,所以才有“明实亡于万历”这一说法。

640?wx_fmt=jpeg

但如果你在Linux上查看1582的日历,发现并没有丢失那10天?

[root@root ~]# cal 1582                               1582       January               February                 MarchSu Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa    1  2  3  4  5  6                1  2  3                1  2  3 7  8  9 10 11 12 13    4  5  6  7  8  9 10    4  5  6  7  8  9 1014 15 16 17 18 19 20   11 12 13 14 15 16 17   11 12 13 14 15 16 1721 22 23 24 25 26 27   18 19 20 21 22 23 24   18 19 20 21 22 23 2428 29 30 31            25 26 27 28            25 26 27 28 29 30 31        April                   May                   JuneSu Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa 1  2  3  4  5  6  7          1  2  3  4  5                   1  2 8  9 10 11 12 13 14    6  7  8  9 10 11 12    3  4  5  6  7  8  915 16 17 18 19 20 21   13 14 15 16 17 18 19   10 11 12 13 14 15 1622 23 24 25 26 27 28   20 21 22 23 24 25 26   17 18 19 20 21 22 2329 30                  27 28 29 30 31         24 25 26 27 28 29 30        July                  August                SeptemberSu Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa 1  2  3  4  5  6  7             1  2  3  4                      1 8  9 10 11 12 13 14    5  6  7  8  9 10 11    2  3  4  5  6  7  815 16 17 18 19 20 21   12 13 14 15 16 17 18    9 10 11 12 13 14 1522 23 24 25 26 27 28   19 20 21 22 23 24 25   16 17 18 19 20 21 2229 30 31               26 27 28 29 30 31      23 24 25 26 27 28 29                                              30       October               November               DecemberSu Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa    1  2  3  4  5  6                1  2  3                      1 7  8  9 10 11 12 13    4  5  6  7  8  9 10    2  3  4  5  6  7  814 15 16 17 18 19 20   11 12 13 14 15 16 17    9 10 11 12 13 14 1521 22 23 24 25 26 27   18 19 20 21 22 23 24   16 17 18 19 20 21 2228 29 30 31            25 26 27 28 29 30      23 24 25 26 27 28 29                                              30 31

维基百科是这样解释的:

由于新历法是教皇颁布的,新教国家予以抵制。直到18世纪,大英帝国,包括英格兰、苏格兰、以及现在美国的一部分才采纳格里历,也就是儒略历 1752年 9月2日星期三的次日是格里历1752年9月14日星期四,日期跳过11日。

值得注意的是,1582年,罗马教廷减去的是10天,而到1752年修改历法的时候却减去了11天的原因其实很简单,这涉及到了闰年的问题,闰年的计算方法:公元纪年的年数可以被四整除,即为闰年;被100整除而不能被400整除为平年;被100整除也可被400整除的为闰年。而1600年和1700年的2月都是29天,原来在1800年之前的闰年计算方法中没有把被100整除而不能被400整除的年份算为平年,更没有考虑到被100整除也可被400整除的算为闰年。所以罗马教廷把1700年的2月算成29天,而1600年的2月却是阴差阳错地恰好与现行的历法相符。结果1582年到1752年之间,当时历法算法和现行历法算法实际只相差了1天。

1582年2月,罗马教廷要求从1582 年10月中减去10天,因此1852 年10月4日后面紧跟着就是15日。在意大利、西班牙等国家都这样处理了。其他天主教国家也很快跟着这么做了,但是新教国家不愿意修改,直到1752年,英国人才想通,理性终于占了上风,不过从1582年到那时,历法又多出了1天,所以英国议会在1752年作出决定,抹掉11天----1752年9月3日至13日,至此才接受了格里历的改革。

所以这个改革在英国及其殖民地(包括美国)在1752年9月才被执行。这样 1752 年9月2日后面跟着的就是1752 年9月14日, 这就是为什么cal 1752会丢失11天的原因。

 

推荐阅读:

那些你可能不知道的浏览器奇技淫巧

那些你可能不知道的微信奇技淫巧

那些你可能不知道的微博奇技淫巧

那些你可能不知道的网易云音乐奇技淫巧

那些你可能不知道的搜索奇技淫巧

那些你可能不知道的视频下载奇技淫巧

那些你可能不知道的免费观看 VIP 视频奇技淫巧

那些你可能不知道的知乎奇技淫巧

640?wx_fmt=png
免费星球

公众号:苏生不惑

640?wx_fmt=jpeg
扫描二维码关注


<think>好的,我现在需要帮助用户解决在使用YOLOv5进行目标检测时,如何将计数结果显示在视频上,并且之前的数字不会被覆盖或消失的问题。首先,我需要理解用户的具体需求。用户希望在视频的每一帧上显示当前的计数,但之前的数字不要被覆盖,也就是说,每一帧的计数结果需要叠加显示,而不是只显示当前帧的检测结果。这可能意味着用户希望累积计数,或者在视频中持续显示每个检测到的目标的位置和计数信息,而不是让它们随着帧的更新而消失。 接下来,我需要考虑YOLOv5的输出处理方式。YOLOv5默认情况下会在每一帧上绘制检测框和类别标签,但每一帧都是独立处理的,因此之前的帧的信息不会被保留。如果用户想要在视频中持续显示计数或数字,可能需要修改代码来跟踪之前的帧中的检测结果,或者将计数信息累积起来,并在每一帧上叠加显示这些累积的信息。 首先,我应该检查YOLOv5的检测代码,特别是处理视频输出的部分。通常,YOLOv5的detect.py脚本会逐帧读取视频,对每一帧进行检测,然后将结果写入输出视频。用户的需求涉及到在每一帧上保留之前的信息,因此可能需要一个数据结构来存储之前的计数结果或者每个目标的轨迹。 可能的解决方案包括: 1. **全局计数器**:在视频处理过程中维护一个全局计数器,记录所有检测到的目标数量,并在每一帧的固定位置显示这个计数。这种方法不会覆盖之前的数字,但只显示总数,而不是每个目标的单独计数。 2. **跟踪算法集成**:使用目标跟踪算法(如DeepSORT)来跟踪每个检测到的目标,这样可以在视频中持续显示每个目标的ID和位置,避免重复计数,并在每帧更新这些信息。这需要将跟踪算法集成到YOLOv5的流程中。 3. **帧叠加处理**:在每一帧上绘制当前的计数信息,并且保留之前帧的某些信息(如绘制文本的位置不变,但每次更新数值)。这可能需要在绘制文本时使用不同的位置,或者使用透明背景的文本框来叠加显示。 根据用户的描述,他们希望“数字叠加不消失”,这可能意味着每一帧的计数数字都要保留在视频画面上,而不是只显示当前帧的计数。例如,如果第一帧检测到3个目标,第二帧检测到5个,用户可能希望在第二帧中同时显示3和5,或者显示总数8。这需要明确用户的具体需求是累积计数还是实时显示每帧的计数。 此外,用户提到“之前的数字不会被覆盖或消失”,可能意味着每个数字需要独立显示在视频的不同位置,或者在同一位置不断更新数值但保持可见。如果是后者,可能只需要在固定位置显示当前总数即可,但如果需要保留历史数字,可能需要将每帧的计数信息存储起来,并在后续帧中绘制所有历史计数,这可能会导致画面杂乱。 接下来,我需要参考用户提供的引用内容。引用[4]提到YOLOv3用于视频流中的指针式仪表检测,结合OpenCV进行图像处理和读数。这可能意味着用户希望类似的方法,使用OpenCV在视频上叠加信息。引用[2]涉及获取视频的总帧数,可能与处理视频流有关。引用[3]中的内容关于深度学习结构,可能与模型优化相关,但可能不直接影响计数显示。 可能的步骤: 1. **修改检测脚本**:在YOLOv5的detect.py中,找到绘制检测结果的部分(通常在plot_results函数中),添加代码来显示计数。 2. **维护计数器**:在视频处理循环中,初始化一个计数器变量,每次检测到目标时增加计数,并在每一帧的指定位置绘制该计数。 3. **使用OpenCV的putText函数**:在每一帧上绘制文本,注意设置合适的位置、字体、颜色和厚度,确保文字清晰可见。为了避免覆盖,可以每次在不同的位置绘制,或者在一个固定区域叠加显示。 4. **处理叠加问题**:如果直接在帧上绘制文本,默认情况下,新绘制的文本会覆盖之前的。如果用户希望保留之前的数字,可能需要记录每一帧的计数,并在后续帧中绘制所有历史数据,或者使用透明背景的图层叠加。 例如,如果用户想要在视频左上角显示每帧的实时计数,并且持续更新这个数值而不消失,可以在每一帧的同一位置绘制当前计数,这样新的数字会覆盖旧的,但用户看到的是最新的计数。如果用户希望显示累计的总数,比如整个视频中检测到的所有目标数量,那么需要维护一个全局变量,在每次检测到目标时累加,并在每帧显示这个总数。 如果用户希望每个检测到的目标都有一个独立的数字显示,并且这些数字在后续帧中保持不消失,可能需要引入目标跟踪,为每个目标分配唯一的ID,并在其移动过程中持续显示该ID。这需要集成跟踪算法,如DeepSORT,并修改检测逻辑来维护每个目标的位置和ID。 另外,关于如何让数字不消失,可能需要将每帧的检测结果保存下来,并在后续帧中重新绘制所有之前的结果。但这样会导致视频处理速度变慢,尤其是当目标数量较多时。因此,需要权衡性能和需求。 总结可能的解决方案: - 如果是实时显示每帧的计数,使用全局变量在固定位置显示当前帧的计数或累计总数。 - 如果需要跟踪每个目标的独立计数,使用目标跟踪算法,并在每帧更新每个目标的位置和ID。 - 使用OpenCV的绘图功能,在帧上叠加文本,注意避免覆盖或使用透明图层。 接下来,我需要将这些思路转化为具体的步骤,并确保代码示例正确,符合用户的环境(YOLOv5和OpenCV)。 可能的代码修改点: 在YOLOv5的detect.py中,处理视频的循环部分,每次处理完一帧后,调用OpenCV的putText函数来绘制计数。例如: 在detect.py的循环中: ```python while cap.isOpened(): ret, frame = cap.read() if not ret: break # 进行检测 results = model(frame) # 获取检测结果 detections = results.pred[0] # 计算当前帧的目标数量 current_count = len(detections) # 更新全局计数器 total_count += current_count # 在帧上绘制文本 cv2.putText(frame, f'Current: {current_count}, Total: {total_count}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 显示或保存帧 cv2.imshow('frame', frame) # ...其他处理 ``` 这样每帧都会显示当前帧检测到的目标数和累计总数,且每次绘制在相同位置,覆盖之前的数字,但用户看到的是实时更新的数值。如果用户希望保留所有历史数字,则需要将文本绘制在不同的位置,例如每行递增,但这样很快会填满屏幕。 用户提到“之前的数字不会被覆盖或消失”,可能希望每个数字都保留下来,例如在视频中显示所有帧的计数。这在实时视频处理中不太可行,因为视频帧是连续的,无法在后续帧中保留之前帧的内容,除非使用视频合成或叠加图层。但如果是处理离线视频,可以将所有帧处理完后,再在每帧上叠加所有之前的计数,但这样可能导致信息过载。 可能用户的实际需求是显示累计的总数,而不是每帧的独立数字。因此,维护一个全局计数器,并在每帧的固定位置显示该总数,这样数字不会消失,而是持续更新。这种情况下,覆盖是允许的,因为用户看到的是最新的总数。 因此,正确的做法可能是在每帧的固定位置绘制累计的总数,这样每次更新该位置的数字,但看起来数字没有消失,只是数值变化。用户可能误解了“覆盖”的含义,实际上,只要数值正确更新,覆盖是必要的。 因此,解决方案的关键步骤是: 1. 在视频处理循环中初始化一个计数器变量。 2. 对每帧的检测结果进行计数,并累加到全局计数器。 3. 使用OpenCV的putText在每帧的固定位置绘制当前计数。 此外,需要注意视频处理时的帧读取和写入,确保计数器正确更新,并且文本正确叠加。 现在,我需要验证这个思路是否正确,并参考用户提供的引用。引用[4]提到使用YOLOv3结合OpenCV截取表盘,说明OpenCV在后期处理中的应用。因此,使用OpenCV的绘图功能是可行的。 可能的代码示例: 修改YOLOv5的detect.py,在绘制检测结果后添加计数显示: 找到绘制检测结果的代码部分,通常在调用model处理帧之后,添加计数逻辑。例如: 在detect.py中,处理图像的部分: ```python # 检测代码 im0 = annotator.result() # 添加计数显示 cv2.putText(im0, f'Total Count: {total_count}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) ``` 同时,在循环外部初始化total_count: ```python total_count = 0 ``` 然后在每次检测到目标时,累加计数: ```python current_count = len(results.pred[0]) total_count += current_count ``` 但需要注意,YOLOv5的results对象可能需要解析,具体获取检测框的数量方式可能有所不同。例如,results.pandas().xyxy[0]可以转换为DataFrame,然后获取行数。 例如: ```python df = results.pandas().xyxy[0] current_count = len(df) total_count += current_count ``` 因此,具体代码可能需要调整以适应YOLOv5的输出结构。 另外,如果用户希望显示的是每帧的独立计数而不累加,则不需要全局变量,只需current_count即可。 总结,正确的步骤是: 1. 初始化计数器。 2. 处理每一帧,获取检测数量。 3. 更新计数器(如果需要累计)。 4. 在帧上绘制计数器。 5. 输出帧。 现在需要将这些步骤转化为具体的代码示例,并确保其正确性。同时,考虑到用户可能希望数字不消失,可能需要在绘制时使用不同的位置或方法,但根据实际需求,固定位置更新可能是正确的方式。</think>### 解决方案 在YOLOv5中实现视频计数叠加显示需要结合目标检测结果存储和OpenCV的文本绘制功能,以下是具体实现步骤: --- #### 步骤1:创建全局计数器存储结构 在视频处理循环外部创建字典存储各分类的计数结果,并添加总计数器: ```python class_counts = {} # 按类别分类统计 total_count = 0 # 总目标数量 ``` --- #### 步骤2:修改检测结果处理逻辑 在`detect.py`的检测循环中增加计数功能,**使用OpenCV的`putText()`叠加文字**: ```python # 在文件顶部导入OpenCV import cv2 # 修改检测循环部分(约第145行附近) for path, im, im0s, vid_cap, s in dataset: # ...原有检测代码... # 获取当前帧检测结果 pred = results.pred[0] current_counts = {} for det in pred: c = int(det[-1]) # 获取类别ID current_counts[c] = current_counts.get(c, 0) + 1 total_count += 1 # 更新全局计数器 for c, cnt in current_counts.items(): class_counts[c] = class_counts.get(c, 0) + cnt ``` --- #### 步骤3:实现文本叠加显示 在图像标注后添加文字绘制代码,**通过调整y_offset实现多行显示**: ```python # 在annotator.result()之后添加 im0 = annotator.result() y_offset = 30 # 初始Y坐标 line_height = 30 # 行高 # 显示总计数 cv2.putText(im0, f'Total: {total_count}', (10, y_offset), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0), 2) y_offset += line_height # 显示各分类计数 for cls_id, count in class_counts.items(): cls_name = model.names[cls_id] # 获取类别名称 cv2.putText(im0, f'{cls_name}: {count}', (10, y_offset), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0), 2) y_offset += line_height ``` --- #### 步骤4:防止文字闪烁的关键技巧 1. **双缓冲绘制**:先绘制到临时画布再复制到显示画面 2. **透明背景**:通过添加半透明底色提升可读性 ```python # 创建临时画布 overlay = im0.copy() alpha = 0.4 # 透明度 # 绘制半透明背景 cv2.rectangle(overlay, (5,5), (250, y_offset+5), (0,0,0), -1) cv2.addWeighted(overlay, alpha, im0, 1-alpha, 0, im0) # 在im0上重新绘制文字(使用与步骤3相同的代码) ``` --- #### 性能优化建议 1. **异步绘制**:将计数显示与目标检测分线程处理 2. **字体缓存**:预生成常用字符的位图 ```python # 预生成数字0-9的位图缓存 font = cv2.FONT_HERSHEY_SIMPLEX number_cache = {} for i in range(10): (w, h), _ = cv2.getTextSize(str(i), font, 0.7, 2) cache_img = np.zeros((h+5, w+5, 3), dtype=np.uint8) cv2.putText(cache_img, str(i), (0,h), font, 0.7, (0,255,0), 2) number_cache[i] = cache_img ``` --- ### 实现效果 ![视频计数叠加效果](https://example.com/counting_demo.gif) *(注:此处应替换为实际效果图URL)* --- ### 常见问题排查 1. **文字不显示**:检查OpenCV版本(需≥4.0),验证坐标是否超出画布范围 2. **计数不准**:确认检测置信度阈值(`--conf`参数)设置合理 3. **性能下降**:启用异步绘制模式,降低字体缩放系数 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值