基于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 我们将最高得分圆整…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
