基于yolov8,制作停车位计数器(附源码)

news2025/3/10 21:16:10

大家好,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实现的计数视觉项目

当然我们还可以通过预训练模型实现其它功能。

如果预训练模型的检测效果在你要使用的场景不太好,那就是需要加加数据了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

随记-语义分割

Semantic Segmentation 什么是语义分割全卷积网络FCN摘要 什么是语义分割 语义分割 Semantic Segmentation 旨在对图像的每个像素进行分类,将其分配给预定义的语义类别。 (检测图像中的物体并按属性分类) 实例分割 Instance Segmentation 实…

Vue框架引入Element-Ui

首先已经创建好了 Vue 框架,安装好了 node.js。 没有完成的可按照此博客搭建:搭建Vue项目 之后打开终端,使用命令。 1、命令引入 npm i element-ui -S2、package.json 查看版本 在 package.json 文件里可查看下载好的依赖版本。 3、在 ma…

按照不同产品类型,划片机主要可以分为如下几个类别

随着科技的不断发展,划片机在半导体封装行业中的应用越来越广泛。根据不同的产品类型,划片机主要可以分为砂轮划片机和激光划片机两个类别。本文将详细介绍这两类划片机的特点和应用。 一、砂轮划片机 砂轮划片机是综合了水气电、空气静压高速主轴、精密…

【Vulnhub 靶场】【Funbox: Scriptkiddie】【非常简单】【20210720】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/funbox-scriptkiddie,725/ 靶场下载:https://download.vulnhub.com/funbox/Funbox11.ova 靶场难度:简单 发布日期:2021年07月20日 文件大小:1.3 GB 靶场作者&…

Windows无法安装edge 无法连接Internet

如果出现以上问题,或者Edge浏览器无法更新,提示防火墙错误之类的都可以解决问题。 下载以下证书文件并导入即可解决问题。 MicrosoftRootCertificateAuthority2011.cer

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(4)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(3) 1.1 PCI总线的组成 PCI总线作为处理器系统的本地总线,是处理器系统的一个组成部件。因此,讲述PCI总线的组成结构,不…

DataFunSummit:2023年数据湖架构峰会-核心PPT资料下载

一、峰会简介 现今,很多企业每天都有PB级的数据注入到大数据平台,经过离线或实时的ETL建模后,提供给下游的分析、推荐及预测等场景使用。面对如此大规模的数据,无论是分析型场景、流批一体、增量数仓都得益于湖仓一体等数据湖技术…

RocketMQ文件准备

1、RocketMQ下载 下载地址:下载 | RocketMQ Source下载与Binary下载区别: binary是编译好的可以直接使用,source是还没编译过的源代码,需要自行编译。 这里大家自行下载需要的版本 2、RocketMQ管理界面 因为Rocket没有图形化管理…

渗透测试 | 信息收集常用方法总结

目录 一、关于域名 1.子域名收集 a.搜索引擎查找 b.在线查询 c.工具 d.SSL/TLS证书查询 2.端口型站点收集 3.目录文件扫描 a.目录扫描工具 b.github搜索 c.google搜索 d.在线网站 e.文件接口工具 4.旁站和C段 a.旁站查询 b.C段查询 5.网站技术架构信息 a.基础…

重磅!这本SCI期刊已解除「On hold」,另有Top期刊仍被调查中

近期小编在Master Journal List上查询期刊时偶然发现,此前被标记为「On Hold」的SCI期刊Biomass Conversion and Biorefinery,已经被科睿唯安取消了「On Hold」标识! 查询网址:https://mjl.clarivate.com/home 此前期刊处于「On …

【Petalinux】制作SD卡 操作系统 启动

Vivado 添加 SD0 导出hdf 制作SD卡 https://mathd.blog.csdn.net/article/details/135217761 【Petalinux】下为空白SD卡建立BOOT,rootfs分区 Petalinux 生成 Petalinux 框架 petalinux-create --type project --template zynq --name sdtest进入 sdtest 文件…

Python3.12 新版本之f-string的几个新特性

目录 概述 f-string表达式 1. 支持转义字符 2. 支持多行字符串 3. 支持重复使用的引号种类 4. 支持无限嵌套 附录 Python3.12新语法特性 概述 Python 3.12在10月2日发布,新版本包含一系列对语言和标准库的改变。 库的改变主要集中在清理已弃用的 API、可…

cJSON简析

文章目录 json概要cJSON数据结构 递归解析示例references json概要 json是一种文本格式的协议 对于人的可阅读性非常好 其中object和array中的value都可以嵌套 cJSON数据结构 每个节点的数据结构如下 /* cJSON Types: */ #define cJSON_Invalid (0) #define cJSON_False (…

智能监测/检测系统EasyCVR国标接入无法播放是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

减小PAPR——DFT扩频

文章目录 前言一、DFT 扩频原理二、MATLAB 仿真1、核心代码2、仿真结果①、4QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PAPR 性能②、16QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PAPR 性能③、64QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PA…

Javaweb见解

1 web相关的概念 1.1 软件的基本架构 C/S(Client-Server)。比如我们手机上的app QQ软件 飞秋 特点:必须下载特定的客户端程序。服务端升级之后,客户端也需要随着升级。 B/S(Broswer-Server).比如京东网站,腾讯qq官方网站 特点&#xff1…

AR眼镜定制_AR智能硬件方案|显示方案|光学方案

AR眼镜的硬件方案定制是根据客户需求和功能来设计的。从芯片平台选型、主板尺寸大小、内存、电池容量,到实现各项功能的传感器、显示光机模组、摄像头、接口、按键、充电等,再到整机的结构、散热设计,以及双目AR眼镜、单目智能眼镜、全息头盔…

【教学类-42-03】20231225 X-Y 之间加法题判断题3.0(确保错误题有绝对错误的答案)

背景需求: 根据需求,0-5以内的判断是21题正确,21题错误,但由于错误答案是随机数抽取,有可能恰好是正确的,所以会出现每套题目的正确数和错误数不一样的情况 优化思路一: 设置如果错误答案与正…

TypeScript学习(基础篇)

前言 在现代的Web开发生态系统中,JavaScript已经成为一种必备的技术。然而,随着应用的增大,JavaScript的一些限制开始显现,例如缺乏静态类型检查和编译时错误检查。这正是TypeScript发挥作用的地方,TypeScript是一种静…

软件测试自学还是报班好?

如果你学软件测试,是以就业为目的,而且是以高薪就业为目的,那我们就要去反推,为了这个目标,我们要去做什么事情。 为了“将高薪就业为目的,我们要做什么事情”阐述清楚,本文行文结构如下&#x…