基于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 我们将最高得分圆整…...
嵌入式系统代码执行时间测量方法与优化
1. 嵌入式程序运行时间测量的必要性在嵌入式系统开发中,精确测量代码执行时间是每个工程师必备的技能。无论是优化算法效率、调试实时系统,还是验证硬件性能,时间测量都扮演着关键角色。以STM32为例,当我们需要确认一个延时函数是…...
当相机位姿已知:利用COLMAP从稀疏到稠密重建的实战指南
1. 环境准备与数据格式转换 在开始COLMAP重建之前,我们需要确保环境配置正确,并完成相机位姿数据的格式转换。COLMAP支持Windows、Linux和macOS系统,但为了获得最佳性能,建议使用配备NVIDIA显卡的机器,并安装CUDA加速版…...
多个source、多个sink
关键配置:sink的:plugin_input ["source_data1", "source_data2"]对应模型┌──────────┐│ Source A │──┐└──────────┘ │├──▶ Sink┌──────────┐ ││ Source B │──┘└──────…...
小型纯电动汽车轮毂电机及大角度转向系统的数字化设计【含catia、solidworks、CAD图纸、答辩PPT、说明书】
小型纯电动汽车轮毂电机与大角度转向系统的数字化设计,是新能源汽车领域的关键技术突破方向。轮毂电机通过将驱动装置集成于车轮内部,实现了动力传递路径的简化与能量利用效率的提升,其分布式驱动特性使车辆具备更灵活的扭矩分配能力…...
(全网最全)分享8款AI工具,毕业论文AIGC率速降至5%!
【CSDN AI底层算法专栏 / 核心摘要】 2026年,学术圈的反AI审查已经演变成了一场“算法级别的军备竞赛”。随着知网、万方全面接入大模型语义探针,靠改同义词、甚至靠传统Prompt洗稿的套路已全线崩溃。为了帮大家避坑,本期专栏我从代码和算法逻…...
推荐算法闲谈:如何在不同业务场景下理解和拆解核心指标
巧解决的是能不能学好,而指标分析解决的是这次改动是否真正创造了业务价值,以及为什么。一个非常常见、但又极易被忽视的事实是:推荐系统并不存在一套放之四海而皆准的核心业务指标。不同产品形态、不同交互方式、不同公司发展阶段࿰…...
Pixel Dream Workshop 快速上手:Python 零基础入门到生成第一幅AI画作
Pixel Dream Workshop 快速上手:Python 零基础入门到生成第一幅AI画作 1. 前言:为什么选择Pixel Dream Workshop 如果你对AI绘画感兴趣但苦于没有编程基础,这篇教程就是为你量身定制的。Pixel Dream Workshop是一个对新手极其友好的AI绘画工…...
高效安全的网页资源提取方案:猫抓开源工具的技术实现与专业应用
高效安全的网页资源提取方案:猫抓开源工具的技术实现与专业应用 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化时代ÿ…...
2024年DroidKaigi官方会议应用:Android DataStore轻量级数据存储终极指南
2024年DroidKaigi官方会议应用:Android DataStore轻量级数据存储终极指南 【免费下载链接】conference-app-2024 The Official Conference App for DroidKaigi 2024 项目地址: https://gitcode.com/GitHub_Trending/co/conference-app-2024 DroidKaigi 2024官…...
IntelliJ IDEA中SVN与Git版本管理的高效配置指南
1. 为什么需要版本管理工具? 如果你曾经因为误删代码而熬夜重写,或者因为团队协作时文件覆盖而崩溃,那你一定需要版本管理工具。想象一下,代码就像写作文时的草稿纸——每次修改都保留历史版本,随时可以回退到上周二下…...
