基于yolov8,制作停车位计数器(附源码)
大家好,YOLO(You Only Look Once) 是由Joseph Redmon和Ali开发的一种对象检测和图像分割模型。
YOLO的第一个版本于2015年发布,由于其高速度和准确性,瞬间得到了广大AI爱好者的喜爱。
Ultralytics YOLOv8则是一款前沿、最先进(SOTA)的模型,基于先前YOLO版本的成功,引入了新功能和改进,进一步提升性能和灵活性。
YOLOv8设计快速、准确且易于使用,使其成为各种物体检测与跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。
项目地址:
https://github.com/ultralytics/ultralytics
其中官方提供了示例,通过Python代码即可实现YOLOv8对象检测算法模型,使用预训练模型来检测我们的目标。而且对电脑需求也不高,CPU就能运行代码。
今天我就给大家介绍三个使用YOLOv8制作的计数器,非常实用。使用到Python版本以及相关Python库。
Python 3.9.7
ultralytics 8.0.178
opencv-contrib-python 4.8.1.78
opencv-python 4.8.0.74
cvzone 1.5.6
技术交流群
前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~
建了技术交流群&星球!想要本文源码、进交流群的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司,即可。然后就可以拉你进群了。
方式①、添加微信号:mlc2060,备注:技术交流
方式②、微信搜索公众号:机器学习社区,后台回复:技术交流
/ 01 /
客流检测器
使用OpenCV检测顾客,并且设定客人进出区域,实现实时计算进出顾客的数量。
客流量统计对于零售行业来说是非常重要的。
统计每天的进出店人数、过店人数以及人均驻留时间等。
依据这些数据,经营者可以对店铺的经营策略进行调整,实现店铺的经营效益最大化。
接下来就来看一下客流计数器的检测代码吧!
import cv2
import numpy as np
from tracker import \*
import cvzone
import time bg\_subtractor = cv2.createBackgroundSubtractorMOG2(history=200, varThreshold=140) # 打开视频
video\_capture = cv2.VideoCapture(r"store.mp4") def RGB(event, x, y, flags, param): if event == cv2.EVENT\_MOUSEMOVE: point = \[x, y\] print(point) cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB)
tracker = Tracker() area1 = \[(213, 165), (200, 189), (693, 373), (697, 341)\]
area2 = \[(195, 199), (186, 213), (683, 404), (689, 388)\]
er = {}
counter1 = \[\]
ex = {}
counter2 = \[\]
while True: ret, frame = video\_capture.read() if not ret: break frame = cv2.resize(frame, (1028, 500)) mask = bg\_subtractor.apply(frame) \_, mask = cv2.threshold(mask, 245, 255, cv2.THRESH\_BINARY) contours, \_ = cv2.findContours(mask, cv2.RETR\_EXTERNAL, cv2.CHAIN\_APPROX\_SIMPLE) list = \[\] for cnt in contours: area = cv2.contourArea(cnt) if area > 1500: # cv2.drawContours(frame, \[cnt\], -1, (0, 255, 0), 2) x, y, w, h = cv2.boundingRect(cnt) list.append(\[x, y, w, h\]) bbox\_idx = tracker.update(list) for bbox in bbox\_idx: x1, y1, x2, y2, id = bbox cx = int(x1 + x1 + x2) // 2 cy = int(y1 + y1 + y2) // 2 result = cv2.pointPolygonTest(np.array(area1, np.int32), ((cx, cy)), False) if result >= 0: er\[id\] = (cx, cy) if id in er: result1 = cv2.pointPolygonTest(np.array(area2, np.int32), ((cx, cy)), False) if result1 >= 0: cv2.rectangle(frame, (x1, y1), (x2 + x1, y2 + y1), (0, 255, 0), 3) cvzone.putTextRect(frame, f'{id}', (cx, cy), 2, 2) cv2.circle(frame, (cx, cy), 5, (0, 255, 0), \-1) if counter1.count(id) == 0: counter1.append(id) result2 = cv2.pointPolygonTest(np.array(area2, np.int32), ((cx, cy)), False) if result2 >= 0: ex\[id\] = (cx, cy) if id in ex: result3 = cv2.pointPolygonTest(np.array(area1, np.int32), ((cx, cy)), False) if result3 >= 0: cv2.rectangle(frame, (x1, y1), (x2 + x1, y2 + y1), (0, 0, 255), 3) cvzone.putTextRect(frame, f'{id}', (cx, cy), 2, 2) cv2.circle(frame, (cx, cy), 5, (0, 255, 0), \-1) if counter2.count(id) == 0: counter2.append(id) cv2.polylines(frame, \[np.array(area1, np.int32)\], True, (0, 0, 255), 2) cv2.polylines(frame, \[np.array(area2, np.int32)\], True, (0, 0, 255), 2) Enter = len(counter1) Exit = len(counter2) cvzone.putTextRect(frame, f'ENTER:-{Enter}', (50, 60), 2, 2) cvzone.putTextRect(frame, f'EXIT:-{Exit}', (50, 130), 2, 2) cv2.imshow('RGB', frame) time.sleep(0.01) if cv2.waitKey(1) & 0xFF == 27: # Press 'Esc' to exit break # 释放资源, 关闭窗口
video\_capture.release()
cv2.destroyAllWindows()
结果如下。
/ 02 /
鸡蛋计数器
使用OpenCV和YOLOv8检测鸡蛋个数。
能够高效、准确、安全可靠的完成鸡蛋个数的统计工作。
基于yolov8-seg实例分割的实时检测。
具体代码如下。
import cv2
from yolo\_segmentation import YOLOSEG
import cvzone
from tracker import \*
import numpy as np ys = YOLOSEG("best.pt") my\_file = open("coco1.txt", "r")
data = my\_file.read()
class\_list = data.split("\\n") cap = cv2.VideoCapture('egg.mp4')
count = 0 def RGB(event, x, y, flags, param): if event == cv2.EVENT\_MOUSEMOVE: point = \[x, y\] print(point) cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB)
tracker = Tracker()
area = \[(434, 39), (453, 629), (473, 634), (456, 36)\]
counter1 = \[\]
while True: ret, frame = cap.read() if not ret: break frame = cv2.resize(frame, (1020, 700)) overlay = frame.copy() alpha = 0.5 bboxes, classes, segmentations, scores = ys.detect(frame) bbox\_idx = tracker.update(bboxes) for bbox, seg in zip(bbox\_idx, segmentations): x3, y3, x4, y4, id = bbox cx = int(x3 + x4) // 2 cy = int(y3 + y4) // 2 result = cv2.pointPolygonTest(np.array(area, np.int32), ((cx, cy)), False) if result >= 0: # cv2.rectangle(frame, (x3, y3), (x4, y4), (255, 0, 0), 2) # cv2.polylines(frame, \[seg\], True, (0, 0, 255), 4) cv2.circle(frame, (cx, cy), 4, (0, 255, 0), \-1) cv2.fillPoly(overlay, \[seg\], (0, 0, 255)) cv2.addWeighted(overlay, alpha, frame, 1 - alpha, 2, frame) cvzone.putTextRect(frame, f'{id}', (x3, y3), 1, 1) if counter1.count(id) == 0: counter1.append(id) cv2.polylines(frame, \[np.array(area, np.int32)\], True, (255, 0, 0), 2) ca1 = len(counter1) cvzone.putTextRect(frame, f'Egg: {ca1}', (50, 60), 2, 2) cv2.imshow("RGB", frame) if cv2.waitKey(1) & 0xFF == 27: break
cap.release()
cv2.destroyAllWindows()
运行代码,结果如下。
/ 03 /
停车位计数器
使用OpenCV和YOLOv8检测停车场剩余车位。
提醒车主停车场各个区域的剩余车位信息。
使停车场车位管理更加规范有序,提高车位使用率。
import cv2
import pandas as pd
import numpy as np
from ultralytics import YOLO
import time model = YOLO('yolov8s.pt') def RGB(event, x, y, flags, param): if event == cv2.EVENT\_MOUSEMOVE: colorsBGR = \[x, y\] print(colorsBGR) cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB) cap = cv2.VideoCapture('parking1.mp4') my\_file = open("coco.txt", "r")
data = my\_file.read()
class\_list = data.split("\\n") area1 = \[(52, 364), (30, 417), (73, 412), (88, 369)\] area2 = \[(105, 353), (86, 428), (137, 427), (146, 358)\] area3 = \[(159, 354), (150, 427), (204, 425), (203, 353)\] area4 = \[(217, 352), (219, 422), (273, 418), (261, 347)\] area5 = \[(274, 345), (286, 417), (338, 415), (321, 345)\] area6 = \[(336, 343), (357, 410), (409, 408), (382, 340)\] area7 = \[(396, 338), (426, 404), (479, 399), (439, 334)\] area8 = \[(458, 333), (494, 397), (543, 390), (495, 330)\] area9 = \[(511, 327), (557, 388), (603, 383), (549, 324)\] area10 = \[(564, 323), (615, 381), (654, 372), (596, 315)\] area11 = \[(616, 316), (666, 369), (703, 363), (642, 312)\] area12 = \[(674, 311), (730, 360), (764, 355), (707, 308)\] while True: ret, frame = cap.read() if not ret: break time.sleep(1) frame = cv2.resize(frame, (1020, 500)) results = model.predict(frame) # print(results) a = results\[0\].boxes.boxes px = pd.DataFrame(a).astype("float") # print(px) list1 = \[\] list2 = \[\] list3 = \[\] list4 = \[\] list5 = \[\] list6 = \[\] list7 = \[\] list8 = \[\] list9 = \[\] list10 = \[\] list11 = \[\] list12 = \[\] for index, row in px.iterrows(): # print(row) x1 = int(row\[0\]) y1 = int(row\[1\]) x2 = int(row\[2\]) y2 = int(row\[3\]) d = int(row\[5\]) c = class\_list\[d\] if 'car' in c: cx = int(x1 + x2) // 2 cy = int(y1 + y2) // 2 results1 = cv2.pointPolygonTest(np.array(area1, np.int32), ((cx, cy)), False) if results1 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list1.append(c) cv2.putText(frame, str(c), (x1, y1), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) results2 = cv2.pointPolygonTest(np.array(area2, np.int32), ((cx, cy)), False) if results2 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list2.append(c) results3 = cv2.pointPolygonTest(np.array(area3, np.int32), ((cx, cy)), False) if results3 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list3.append(c) results4 = cv2.pointPolygonTest(np.array(area4, np.int32), ((cx, cy)), False) if results4 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list4.append(c) results5 = cv2.pointPolygonTest(np.array(area5, np.int32), ((cx, cy)), False) if results5 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list5.append(c) results6 = cv2.pointPolygonTest(np.array(area6, np.int32), ((cx, cy)), False) if results6 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list6.append(c) results7 = cv2.pointPolygonTest(np.array(area7, np.int32), ((cx, cy)), False) if results7 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list7.append(c) results8 = cv2.pointPolygonTest(np.array(area8, np.int32), ((cx, cy)), False) if results8 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list8.append(c) results9 = cv2.pointPolygonTest(np.array(area9, np.int32), ((cx, cy)), False) if results9 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list9.append(c) results10 = cv2.pointPolygonTest(np.array(area10, np.int32), ((cx, cy)), False) if results10 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list10.append(c) results11 = cv2.pointPolygonTest(np.array(area11, np.int32), ((cx, cy)), False) if results11 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list11.append(c) results12 = cv2.pointPolygonTest(np.array(area12, np.int32), ((cx, cy)), False) if results12 >= 0: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 3, (0, 0, 255), \-1) list12.append(c) a1 = (len(list1)) a2 = (len(list2)) a3 = (len(list3)) a4 = (len(list4)) a5 = (len(list5)) a6 = (len(list6)) a7 = (len(list7)) a8 = (len(list8)) a9 = (len(list9)) a10 = (len(list10)) a11 = (len(list11)) a12 = (len(list12)) o = (a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12) space = (12 - o) print(space) if a1 == 1: cv2.polylines(frame, \[np.array(area1, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('1'), (50, 441), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area1, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('1'), (50, 441), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a2 == 1: cv2.polylines(frame, \[np.array(area2, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('2'), (106, 440), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area2, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('2'), (106, 440), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a3 == 1: cv2.polylines(frame, \[np.array(area3, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('3'), (175, 436), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area3, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('3'), (175, 436), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a4 == 1: cv2.polylines(frame, \[np.array(area4, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('4'), (250, 436), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area4, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('4'), (250, 436), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a5 == 1: cv2.polylines(frame, \[np.array(area5, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('5'), (315, 429), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area5, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('5'), (315, 429), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a6 == 1: cv2.polylines(frame, \[np.array(area6, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('6'), (386, 421), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area6, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('6'), (386, 421), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a7 == 1: cv2.polylines(frame, \[np.array(area7, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('7'), (456, 414), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area7, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('7'), (456, 414), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a8 == 1: cv2.polylines(frame, \[np.array(area8, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('8'), (527, 406), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area8, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('8'), (527, 406), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a9 == 1: cv2.polylines(frame, \[np.array(area9, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('9'), (591, 398), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area9, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('9'), (591, 398), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a10 == 1: cv2.polylines(frame, \[np.array(area10, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('10'), (649, 384), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area10, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('10'), (649, 384), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a11 == 1: cv2.polylines(frame, \[np.array(area11, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('11'), (697, 377), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area11, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('11'), (697, 377), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) if a12 == 1: cv2.polylines(frame, \[np.array(area12, np.int32)\], True, (0, 0, 255), 2) cv2.putText(frame, str('12'), (752, 371), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (0, 0, 255), 1) else: cv2.polylines(frame, \[np.array(area12, np.int32)\], True, (0, 255, 0), 2) cv2.putText(frame, str('12'), (752, 371), cv2.FONT\_HERSHEY\_COMPLEX, 0.5, (255, 255, 255), 1) cv2.putText(frame, 'parking lots: ' + str(space), (23, 40), cv2.FONT\_HERSHEY\_PLAIN, 2, (255, 0, 255), 2) cv2.imshow("RGB", frame) if cv2.waitKey(1) & 0xFF == 27: break
cap.release()
cv2.destroyAllWindows()
# stream.stop()
运行代码,结果如下。
发现效果还不错~
/ 04 /
总结
以上操作,就是三个使用YOLOv8实现的计数视觉项目。
当然我们还可以通过预训练模型实现其它功能。
如果预训练模型的检测效果在你要使用的场景不太好,那就是需要加加数据了~
相关文章:

基于yolov8,制作停车位计数器(附源码)
大家好,YOLO(You Only Look Once) 是由Joseph Redmon和Ali开发的一种对象检测和图像分割模型。 YOLO的第一个版本于2015年发布,由于其高速度和准确性,瞬间得到了广大AI爱好者的喜爱。 Ultralytics YOLOv8则是一款前沿、最先进(SOTA)的模型&a…...
C++设计模式:单例模式(饿汉式、懒汉式)
单例模式是什么? 单例模式是一种创建型的软件设计模式。通过单例模式的设计,使得创建的类在当前进程中只有唯一一个实例,并提供一个全局性的访问点,这样可以规避因频繁创建对象而导致的内存飙升情况。 单例模式有三个要点 私有化…...

Django 访问前端页面一直在转异常:ReferenceError:axios is not defined
访问:http://127.0.0.1:8080/ my.html 一、异常: 二、原因 提示:axios找不到!! 查看代码<script src"https://unpkg.com/axios/dist/axios.min.js"></script>无法访问到官网 三、解决 Using j…...

C语言中关于指针的理解
#include <stdio.h> int main() {int a11;int *p&a; //因为a是整型的,所以我们定义指针p的时候要和a的类型一样char b;char *pa&b; //同理,b是字符型,所以这里的pa也要用字符型return 0; }因为*p指向的是地址&…...

MySQL MVCC精讲
版本链 我们前面说过,对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们创建的表中有主键或者非NULL的UNIQUE键时都不会包含row_id列): trx_idÿ…...

如何快速删除pdf周围的空白
问题:写论文往往需要pdf格式的图片,但pdf往往四周存在大量空白需要手动截图很麻烦 解决: 打开命令行输入:pdfcrop 图片名.pdf...

蓝桥杯c/c++程序设计——数位排序
数位排序【第十三届】【省赛】【C组】 题目描述 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。 当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如࿰…...

【通讯录案例-搭建登录界面 Objective-C语言】
一、来看我们这个通讯录案例 1.接下来啊,我们来做这个通讯录案例, 然后呢,做这么一个应用程序啊, 我们第一步呢,先把界面儿搭了, 然后呢,搭之前,简单的来分析一下, 首先呢,这是,中间儿的这一块儿, 1)有个“账户”、“密码”,这一块儿, 这是一个什么控制器,…...
二叉搜索树、AVL、红黑树、B树
文章目录 二叉搜索树2. avl树3. 红黑树 b树和b树比较适合与磁盘打交道的,磁盘操作耗时,这些树 矮,红黑树、avL树高,比较适合与内存打交道。 二叉搜索树 找一个节点的前驱和后继: 前驱:如果节点有左子树&a…...
格密码:傅里叶矩阵
目录 一. 铺垫性介绍 1.1 傅里叶级数 1.2 傅里叶矩阵的来源 二. 格基与傅里叶矩阵 2.1 傅里叶矩阵详细解释 2.2 格基与傅里叶矩阵 写在前面:有关傅里叶变换的解释太多了,这篇博客主要总结傅里叶矩阵在格密码中的运用。对于有一定傅里叶变换基础的同…...

flex--伸缩性
1.flex-basis flex-basis 设置的是主轴方向的基准长度,会让宽度或高度失效。 备注:主轴横向:宽度失效;主轴纵向:高度失效 作用:浏览器根据这个属性设置的值,计算主轴上是否有多余空间&#x…...

linux中主从复制的架构和读写分离的方式
读写分离 互相主从架构注意点 双主双从架构注意点 一主多从架构注意点 读写分离概念部署jdk环境上传文件,解压文件配置环境变量 部署mycat环境mycat配置文件给所有数据库创建访问用户配置 server.xml配置 schema.xml启动mycat查看启动端口日志负载均衡测试 遇到的问…...

Ubuntu 22.04.3 Server 设置静态IP 通过修改yaml配置文件方法
目录 1.查看网卡信息 2.修改yaml配置文件 3.应用新的网络配置 4.重新启动网络服务 文章内容 本文介绍Ubuntu 22.04.3 Server系统通过修改yaml配置文件配置静态 ip 的方法。 1.查看网卡信息 使用ifconfig命令查看网卡信息获取网卡名称 如果出现Command ifconfig not fo…...

EasyCVR无人机推流+人数统计AI算法,助力公共场所人群密度管控
一、背景与需求 在公共场所和大型活动的管理中,人数统计和人群密度控制是非常重要的安全问题。传统的方法可能存在效率低下或准确度不足的情况,无法满足现代社会的需求。TSINGSEE青犀可以利用无人机推流AI人流量统计算法,基于计算机视觉技术…...
Kotlin 接口
Kotlin 的接口可以既包含抽象方法的声明也包含实现;接口无法保存状态;可以有属性但必须声明为抽象或提供访问器实现 1、定义 使用关键字 interface 来定义接口 interface MyInterface {fun bar()fun foo() {// 可选的方法体} } 2、 实现接口 一个类…...

Qt前端技术:5.QSS
这个是表示QFrame中的pushButton中的子类和它子类的子类都将背景变为red 写成大于的时候表示只有直接的子类对象才会变 这个图中的QGroupBox和QPushButton都是QFrame的直接的子类 这个中的QGroupBox是QFrame的直接的子类但是QPushButton 是QGroupBox的子类,QPushB…...

在Centos7中利用Shell脚本:实现MySQL的数据备份
目录 自动化备份MySQL 一.备份数据库脚本 1.创建备份目录 2.创建脚本文件 3.新建配置文件(连接数据库的配置文件) 4.给文件权限(mysql_backup.sh) 编辑 5.执行命令 (mysql_backup.sh) 编辑 二.数据库通过备份恢复 1.创建脚…...

大一C语言查缺补漏 12.24
遗留问题: 6-1 1 在C语言中,如果要保留小数的话,一定要除以2.0,而不是2。 设整型变量m,n,a,b的值均为1,执行表达式(m a>b)||(n a<b)后,表达式的值以及变量m和n的值是&#…...
程序员宝典:常用的免费好物API
六位图片验证码生成:包括纯数字、小写字母、大写字母、大小写混合、数字小写、数字大写、数字大小写等情况。 四位图片验证码生成:四位图片验证码生成,包括纯数字、小写字母、大写字母、大小写混合、数字小写、数字大写、数字大小写等情况。…...

关于“Python”的核心知识点整理大全41
目录 scoreboard.py game_functions.py game_functions.py 14.3.8 显示等级 game_stats.py scoreboard.py scoreboard.py scoreboard.py game_functions.py game_functions.py alien_invasion.py 14.3.9 显示余下的飞船数 ship.py scoreboard.py 我们将最高得分圆整…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...