OpenCV
文章目录
- OpenCV学习报告
- 读取图片和网络摄像头
- 1.1 图片读取
- 1.2 视频读取
- 1.1.1 读取视频文件
- 1.1.2读取网络摄像头
- OpenCV基础功能
- 调整、裁剪图像
- 3.1 调整图像大小
- 3.2 裁剪图像
- 图像上绘制形状和文本
- 4.1 图像上绘制形状
- 4.2图像上写文字
- 透视变换
- 图像拼接
- 颜色检测
- 轮廓检测
- 人脸检测
- 9.1静态图片
- 9.2 摄像头
- 实战
- 10.1虚拟绘画
- 10.2纸张扫描
- 10.3 车牌检测器
- 参考资料
OpenCV学习报告
读取图片和网络摄像头
1.1 图片读取
import cv2
# read image
img = cv2.imread("Resources/dnn.jpg")
cv2.imshow("Output",img)
cv2.waitKey(0)

1.2 视频读取
1.1.1 读取视频文件
import cv2
# read video
cap = cv2.VideoCapture("Resources/test_video.mp4")
while True:success,img = cap.read()cv2.imshow("Video",img)if cv2.waitKey(1) & 0xFF == ord('q'):break

1.1.2读取网络摄像头
import cv2
# read webcam
cap = cv2.VideoCapture(0)
cap.set(3,640) #width
cap.set(4,480) #height
cap.set(10,100)while True:success,img = cap.read()cv2.imshow("Video",img)if cv2.waitKey(1) & 0xFF == ord('q'):break

OpenCV基础功能
import cv2
import numpy as np
# basic function
img = cv2.imread("Resources/dnn.jpg")
kernel = np.ones((5,5),np.uint8)# 灰度转换
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 图像模糊
imgBlur = cv2.GaussianBlur(imgGray,(7,7),0)
# 边缘检测
imgCanny = cv2.Canny(img,100,100)
# 膨胀
imgDialation = cv2.dilate(imgCanny, kernel,iterations=1)
# 腐蚀
imgEroded = cv2.erode(imgDialation,kernel,iterations=1)# cv2.imshow("Output",img)
cv2.imshow("Gray Image",imgGray)
cv2.imshow("Blur Image",imgBlur)
cv2.imshow("Blur Image",imgCanny)
cv2.imshow("Dialation Image",imgDialation)
cv2.imshow("Eroded Image",imgEroded)cv2.waitKey(0)


调整、裁剪图像
3.1 调整图像大小
import cv2# resize imageimg = cv2.imread("Resources/lambo.PNG")
print(img.shape)imgResize = cv2.resize(img,(300,200))
print(imgResize.shape)cv2.imshow("Image",img)
cv2.imshow("Image Resize",imgResize)cv2.waitKey(0)

3.2 裁剪图像
import cv2img=cv2.imread("Resources/lambo.PNG")
cv2.imshow('image',img)print(img.shape)#height,width,dpthcrop_img=img[100:400,50:500]
cv2.imshow('crop image',crop_img)cv2.waitKey(0)

图像上绘制形状和文本
4.1 图像上绘制形状
import cv2
import numpy as np
# shapes and texts
img = np.zeros((512,512,3),np.uint8)
cv2.imshow('oringin image',img)cv2.line(img,(0,0),(img.shape[1],img.shape[0]),(0,255,0),3)
cv2.imshow('line image',img)cv2.rectangle(img,(0,0),(250,350),(0,0,255),2)
cv2.imshow('rectangle image',img)cv2.circle(img,(400,500),30,(255,255,0),5)
cv2.imshow('circle image',img)cv2.waitKey(0)

4.2图像上写文字
import cv2
import numpy as npimg = np.zeros((512,512,3),np.uint8)
cv2.imshow('oringin image',img)cv2.putText(img,"OPENCV",(300,200),cv2.FONT_HERSHEY_COMPLEX,1,(0,150,0),1)
cv2.imshow("putText01 Image",img)
cv2.putText(img,"I LOVE XD",(100,300),cv2.FONT_HERSHEY_COMPLEX,1,(0,150,0),1)
cv2.imshow("putText02 Image",img)cv2.waitKey(0)

透视变换
import cv2
import numpy as np
# warp perspective
img = cv2.imread("Resources/cards.jpg")width,height = 250,350
pts1 = np.float32([[111,219],[287,188],[154,482],[352,440]])
pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])
matrix = cv2.getPerspectiveTransform(pts1,pts2)
imgOutput = cv2.warpPerspective(img,matrix,(width,height))cv2.imshow("Image",img)
cv2.imshow("Output",imgOutput)cv2.waitKey(0)

图像拼接
import cv2
import numpy as np
# join images
def stackImages(scale,imgArray):rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range ( 0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank]*rowshor_con = [imageBlank]*rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor= np.hstack(imgArray)ver = horreturn verimg = cv2.imread('Resources/dnn.jpg')
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)imgStack = stackImages(0.5,([img,imgGray,img],[img,img,img]))# imgHdr = np.hstack((img,img))
# imgVer = np.vstack((img,img))
# cv2.imshow("Horizontal",imgHdr)
# cv2.imshow("Vertical",imgVer)cv2.imshow("ImageStack",imgStack)cv2.waitKey(0)

颜色检测
import cv2
import numpy as np
# color dectiondef empty(a):pass
'''连接图片'''
def stackImages(scale,imgArray):rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range ( 0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank]*rowshor_con = [imageBlank]*rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor= np.hstack(imgArray)ver = horreturn ver# 调整滑动条的位置来改变图像的颜色阈值,从而实现对图像的颜色分割或过滤
path = 'Resources/lambo.PNG'
framWidth = 640
framHeight = 480cap = cv2.VideoCapture(path)
cap.set(3,framWidth) #width
cap.set(4,framHeight) #height
cap.set(10,150)cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,240)
cv2.createTrackbar("Hue Min","TrackBars",0,179,empty) # hue
cv2.createTrackbar("Hue Max","TrackBars",179,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",0,255,empty) # saturation
cv2.createTrackbar("Sat Max","TrackBars",255,255,empty)
cv2.createTrackbar("Val Min","TrackBars",0,255,empty) # value
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)while True:img = cv2.imread(path)imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)h_min = cv2.getTrackbarPos("Hue Min","TrackBars")h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")v_min = cv2.getTrackbarPos("Val Min", "TrackBars")v_max = cv2.getTrackbarPos("Val Max", "TrackBars")# print(h_min,h_max,s_min,s_max,v_min,v_max)lower = np.array([h_min,s_min,v_min])upper = np.array([h_max,s_max,v_max])#用掩码对原始图像进行位运算mask = cv2.inRange(imgHSV,lower,upper)imgResult = cv2.bitwise_and(img,img,mask=mask) #二值图像# cv2.imshow("Original",img)# cv2.imshow("HSV",imgHSV)# cv2.imshow("Mask", mask)# cv2.imshow("Result", imgResult)imgStack = stackImages(0.6, ([img, imgHSV], [mask, imgResult]))cv2.imshow("Stacked Images", imgStack)cv2.waitKey(1)

轮廓检测
import cv2
import numpy as np#contours / shape detectiondef stackImages(scale,imgArray):rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range ( 0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank]*rowshor_con = [imageBlank]*rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor= np.hstack(imgArray)ver = horreturn verdef getContours(img):contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)for cnt in contours:area = cv2.contourArea(cnt)print(area)if area>500:cv2.drawContours(imgContour,cnt,-1,(255,0,0),3)#计算轮廓曲线长度peri = cv2.arcLength(cnt,True)print(peri)approx = cv2.approxPolyDP(cnt,0.02*peri,True)print(len(approx))objCor = len(approx)x,y,w,h = cv2.boundingRect(approx)# 图形分类if objCor == 3: objectType = "Tri"elif objCor == 4 :aspRatio = w / float(h)if aspRatio > 0.98 and aspRatio < 1.03: objectType = "Square"else: objectType = "Rectangle"elif objCor > 4: objectType = "Circles"else: objectType = "None"cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,255,0),2)cv2.putText(imgContour,objectType,(x+(w//2)-10,y+(h//2)-10),cv2.FONT_HERSHEY_COMPLEX,0.7,(0,0,0),2)path = 'Resources/shapes.png'
img = cv2.imread(path)
imgContour = img.copy()imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)imgBlank = np.zeros_like(img)
imgStack = stackImages(0.8,([img,imgGray],[imgCanny,imgContour]))cv2.imshow("Stack",imgStack)cv2.waitKey(0)

人脸检测
9.1静态图片
import cv2
# face detection
faceCascade = cv2.CascadeClassifier("Resources/haarcascade_frontalface_default.xml")
img = cv2.imread("Resources/dnn.jpg")
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)faces = faceCascade.detectMultiScale(imgGray,1.1,4)for(x,y,w,h) in faces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow("Result",img)cv2.waitKey(0)

9.2 摄像头
import cv2faceCascade = cv2.CascadeClassifier("Resources/haarcascade_frontalface_default.xml")cap = cv2.VideoCapture(0)
cap.set(3,640) #width
cap.set(4,480) #height
cap.set(10,100)while True:success,img = cap.read()cv2.imshow("Video",img)imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = faceCascade.detectMultiScale(imgGray, 1.1, 4)for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)cv2.imshow("Result", img)if cv2.waitKey(1) & 0xFF == ord('q'):break

实战
10.1虚拟绘画
import cv2
import numpy as npframeWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)
cap.set(10, 150)# 想要检测的颜色
myColors = [[0,89,0,98,255,255], [0,47,0,97,255,255], [0,66,0,179,255,255], [0,54,0,98,255,255]]
# 想要绘制的颜色 BGR
myColorValues = [[51, 153, 255],[0, 255, 0],[255,0,0],[0,255,255]]
# 绘制的点的列表
myPoints = [] ## [x , y , colorId ]"""获取想要绘制的,及对应的颜色"""
def findColor(img, myColors, myColorValues):imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)count = 0newPoints = []for color in myColors:lower = np.array(color[0:3])upper = np.array(color[3:6])mask = cv2.inRange(imgHSV, lower, upper) x, y = getContours(mask) # 想要绘制的点cv2.circle(imgResult, (x, y), 20, myColorValues[count], cv2.FILLED) # 将点绘制在图上if x != 0 and y != 0:newPoints.append([x, y, count]) # 将点添加到 newPoints列表中,count为想要绘制颜色的编号count += 1return newPoints def getContours(img):contours, Heriachy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) x, y, w, h = 0, 0, 0, 0for cnt in contours:area = cv2.contourArea(cnt)if area > 500:# cv2.drawContours(imgResult, cnt, -1, (255, 0, 0), 3)peri = cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)x, y, w, h = cv2.boundingRect(approx) return x + w // 2, y """把点绘制在画布上"""
def drawOnCanvas(myPoints, myColorValues):for point in myPoints:cv2.circle(imgResult, (point[0], point[1]), 20, myColorValues[point[2]], cv2.FILLED)while True:success, img = cap.read()imgResult = img.copy()newPoints = findColor(img, myColors, myColorValues) # 想要绘制的点if len(newPoints) != 0:for newP in newPoints:myPoints.append(newP)if len(myPoints) != 0:drawOnCanvas(myPoints, myColorValues) # 将点绘制在画布上cv2.imshow("Result", imgResult)if cv2.waitKey(1) & 0xFF == ord('q'):break
利用颜色检测滑杆来得出笔的颜色




10.2纸张扫描
import cv2
import numpy as npwidthImg=480
heightImg =640img = cv2.imread("Resources/1.jpg")"""图像预处理"""
def preProcessing(img):imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)imgBlur = cv2.GaussianBlur(imgGray,(5,5),1)imgCanny = cv2.Canny(imgBlur,200,200)kernel = np.ones((5,5))imgDial = cv2.dilate(imgCanny,kernel,iterations=2)imgThres = cv2.erode(imgDial,kernel,iterations=1)return imgThres'''获取最大轮廓角点'''
def getContours(img):biggest = np.array([])maxArea = 0contours,Heriachy= cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)for cnt in contours:area = cv2.contourArea(cnt)if area>5000:peri = cv2.arcLength(cnt,True)approx = cv2.approxPolyDP(cnt,0.02*peri,True)if area >maxArea and len(approx) == 4:biggest = approxmaxArea = area#绘制轮廓(biggest仅仅包含矩形的轮廓)cv2.drawContours(imgContour, biggest, -1, (255, 0, 0), 20)return biggest'''矩形角点的重新处理:按照一定的顺序排列(左上,右上,左下,右下)'''
def reorder (myPoints):myPoints = myPoints.reshape((4,2))#四个角点myPointsNew = np.zeros((4,1,2),np.int32)#点按照一定的顺序重新排列add = myPoints.sum(1)#将点进行x+y计算,myPointsNew[0] = myPoints[np.argmin(add)] #和最小的点为左上角点myPointsNew[3] = myPoints[np.argmax(add)]#和最大的点为右下角点diff = np.diff(myPoints,axis=1)#将点进行x-y差异计算myPointsNew[1]= myPoints[np.argmin(diff)]#差异最小的点为右上myPointsNew[2] = myPoints[np.argmax(diff)]#差异最大的点为左下return myPointsNew'''鸟瞰转换'''
def getWarp(img,biggest):#矩阵角点的处理,按照一个统一顺序排列biggest = reorder(biggest)pts1 = np.float32(biggest)pts2 = np.float32([[0, 0], [widthImg, 0], [0, heightImg], [widthImg, heightImg]])matrix = cv2.getPerspectiveTransform(pts1, pts2)#鸟瞰图imgOutput = cv2.warpPerspective(img, matrix, (widthImg, heightImg))#得到的鸟瞰图,边缘有其他背景,所以裁剪边缘,并将裁剪后的图像,重新调整为原来窗口大小。imgCropped = imgOutput[20:imgOutput.shape[0]-20,20:imgOutput.shape[1]-20]imgCropped = cv2.resize(imgCropped,(widthImg,heightImg))return imgCropped'''图像堆叠显示'''
def stackImages(scale,imgArray):rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range ( 0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank]*rowshor_con = [imageBlank]*rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor= np.hstack(imgArray)ver = horreturn verwhile True:imgresize = cv2.resize(img,(widthImg,heightImg))imgContour = imgresize.copy()imgThres = preProcessing(imgresize)biggest = getContours(imgThres)if biggest.size != 0:# 鸟瞰转换imgWarped = getWarp(imgresize, biggest)imageArray = ([imgresize,imgThres],[imgContour,imgWarped])cv2.imshow("ImageWarped", imgWarped)else:imageArray = ([imgContour, img])# 图像堆叠显示stackedImages = stackImages(0.5, imageArray)cv2.imshow("WorkFlow", stackedImages)cv2.waitKey(0)

10.3 车牌检测器
import cv2frameWidth = 640
frameHeight = 480
nPlateCascade = cv2.CascadeClassifier("Resources/haarcascade_russian_plate_number.xml")
minArea = 200
color = (255,0,255)cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)
cap.set(10,150)
count = 0while True:success, img = cap.read() imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #车牌检测numberPlates = nPlateCascade.detectMultiScale(imgGray, 1.1, 10)for (x, y, w, h) in numberPlates:area = w*hif area >minArea:#绘制矩形cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2)#绘制文字cv2.putText(img,"Number Plate",(x,y-5),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,color,2)imgRoi = img[y:y+h,x:x+w]cv2.imshow("ROI", imgRoi)cv2.imshow("Result", img)if cv2.waitKey(1) & 0xFF == ord('s'):cv2.imwrite("Resources/Scanned/NoPlate_"+str(count)+".jpg",imgRoi)cv2.rectangle(img,(0,200),(640,300),(0,255,0),cv2.FILLED)cv2.putText(img,"Scan Saved",(150,265),cv2.FONT_HERSHEY_DUPLEX,2,(0,0,255),2)cv2.imshow("Result",img)cv2.waitKey(500)count +=1break

按s键后可保存车牌

参考资料
ChatGPT (openai.com)
RGB Color Codes Chart 🎨 (rapidtables.com)
图像基本操作 - 【布客】OpenCV 4.0.0 中文翻译 (apachecn.org)
相关文章:
OpenCV
文章目录 OpenCV学习报告读取图片和网络摄像头1.1 图片读取1.2 视频读取1.1.1 读取视频文件1.1.2读取网络摄像头 OpenCV基础功能调整、裁剪图像3.1 调整图像大小3.2 裁剪图像 图像上绘制形状和文本4.1 图像上绘制形状4.2图像上写文字 透视变换图像拼接颜色检测轮廓检测人脸检测…...
hadoop解决数据倾斜的方法
分析&回答 1,如果预聚合不影响最终结果,可以使用conbine,提前对数据聚合,减少数据量。使用combinner合并,combinner是在map阶段,reduce之前的一个中间阶段,在这个阶段可以选择性的把大量的相同key数据先进行一个合并,可以看做…...
打造坚不可摧的代码堡垒 - 搭建GitLab私有仓库完全指南
在现代软件开发中,版本控制是一个不可或缺的环节。GitLab是一个流行的版本控制平台,允许开发团队协同工作并管理他们的代码。在某些情况下,您可能希望将您的代码托管在一个私有仓库中,以确保代码的安全性和机密性。在本文中&#…...
linux把文件压缩/解压成.tar.gz/tar/tgz等格式的命令大全
linux把文件压缩/解压成.tar.gz/tar/tgz等格式的命令大全 linux压缩命令常用的有:tar,tgz,gzip,zip,rar 一,tar(一) tar压缩命令#说明:#举例: (二…...
用户角色权限demo后续出现问题和解决
将demo账号给到理解和蒋老师,测试的时候将登录人账号改了,结果登录不了了,后续还需要分配权限无法更改他人的账号和密码 将用户和权限重新分配(数据库更改,不要学我) 试着登录还是报一样的错,但…...
SpringBoot在IDEA里实现热部署
使用步骤 1.引入依赖 <!--devtools热部署--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><scope>true</scope><versi…...
浅谈Linux中的mkdir -p
mkdir 是一个用于创建目录(目录树)的 Unix 和 Linux 命令。-p 选项允许创建一个目录和它不存在的父目录。换句话说,-p 选项确保了指定的整个目录路径都会被创建。 基础用法 如果你只是运行 mkdir new_directory,这个命令会尝试在…...
设计模式—职责链模式(Chain of Responsibility)
目录 思维导图 什么是职责链模式? 有什么优点呢? 有什么缺点呢? 什么场景使用呢? 代码展示 ①、职责链模式 ②、加薪代码重构 思维导图 什么是职责链模式? 使多个对象都有机会处理请求,从而避免请…...
vue小测试之拖拽、自定义事件
在开始之前我去复习了一下,clientX、clientY、pageX、pageY的区别,对于不熟悉offsetLeft和offsetTop的也可以在这里去复习一下。 vue拖拽指令之offsetX、clientX、pageX、screenX_wade3po的博客-CSDN博客_vue offset 客户区坐标位置(clientX&…...
时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价)
时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价) 目录 时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价)效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现DBN-SVM深度置信网络结合支持向量机…...
Python中异步编程是什么意思? - 易智编译EaseEditing
异步编程是一种编程模式,用于处理可能会导致程序等待的操作,例如网络请求、文件读写或长时间的计算任务,而不会阻塞整个程序的执行。 在传统的同步编程中,当程序执行一个耗时的操作时,它会等待该操作完成,…...
【JS真好玩】自动打字机效果
目录 一、前言二、布局分析三、总体样式四、中间部分五、底部5.1 div5.2 label5.3 input 六、JS让它动起来6.1定时器6.2 字符串处理6.2.1 slice6.2.2 splice6.3.3 split 七、总结 一、前言 大家好,今天实现一个自动打字机效果,旨在实现一些网上很小的de…...
宠物赛道,用AI定制宠物头像搞钱项目教程
今天给大家介绍一个非常有趣,而粉丝价值又极高,用AI去定制宠物头像或合照的AI项目。 接触过宠物行业应该知道,获取1位铲屎官到私域,这类用户的价值是极高的,一个宠物粉,是连铲个屎都要花钱的,每…...
基于vue和element的脚手架【vue-element-admin 和vue-element-plus-admin 】
vue-element-admin vue-element-admin 是一个后台前端解决方案,它基于 vue 和 element-ui实现 介绍 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide/ vue-element-plus-admin vue-element-plus-admin 是一…...
推荐Java开发常用的工具类库google guava
Guava Guava是一个Google开源的Java核心库,它提供了许多实用的工具和辅助类,使Java开发更加简洁、高效、可靠。目前和hutool一起,是业界常用的工具类库。shigen也比较喜欢使用,在这里列举一下常用的工具类库和使用的案例。 参考…...
stencilJs学习之构建 Drawer 组件
前言 在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop、State、Event、Listen、Method、Component 以及生命周期方法。这些知识是构建复杂组件和应用的基础,而抽屉组件是一个很好的示例,能够…...
hbase 国内镜像 极速下载
文章目录 国内镜像汇总-极速下载【JavaPub版】 lucene国内镜像 https://mirrors.cloud.tencent.com/apache/hbase/ 国内镜像汇总-极速下载【JavaPub版】...
Linux驱动——Tiny4412芯片_Source Insight的下载+Linux3.5内核下工程的创建
文章目录 前言Source Insight的下载1.下载地址2.下载步骤 linux3.5内核下工程的创建 前言 本博客仅作为笔记总结,以及帮助有需要的人,不作权威解释。 Source Insight的下载 1.下载地址 官网:https://www.sourceinsight.com/ 另外可以选择…...
rust交叉编译 在mac下编译linux和windows
系统版本macbook proVentura 13.5linux ubuntu22.04.3 LTS/18.04.6 LTSwindowswindows 10 专业版 20H2mac下rustc --versionrustc 1.74.0-nightly (58eefc33a 2023-08-24)查看当前系统支持的交叉编译指定系统版本列表 rustup target list如果已经安装这里会显示(installed)。…...
linux离线环境安装redis
先检查gcc版本,使用gcc --version进行检查,版本在5以下的,安装redis要安装redis6以下的版本 如果没有gcc命令,要先安装gcc命令。因为是离线环境,yum命令什么的用不了。为了安装gcc,进行了几种尝试。 1、下…...
Midjourney单色调风格失效诊断图谱(含8种典型失败案例+对应--no、--style、--seed三重校准方案)
更多请点击: https://intelliparadigm.com 第一章:Midjourney单色调风格失效诊断图谱(含8种典型失败案例对应--no、--style、--seed三重校准方案) 单色调(Monochrome)图像生成在Midjourney中高度依赖提示词…...
2026年四款主流 SaaS 收银系统:不同场景怎么选?
开店做生意,最让人头疼的往往不是选址或装修,而是每天打烊后对着乱糟糟的账本发愁。很多刚起步的老板为了省成本,初期只用纸笔或简单的 Excel 记账,一旦客流上来,库存对不上、会员积分算错、交接班混乱等问题接踵而至。…...
Claude Code 用户如何配置 Taotoken 解决密钥与额度困扰
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Claude Code 用户如何配置 Taotoken 解决密钥与额度困扰 对于依赖 Claude Code 进行编程辅助的开发者而言,直接管理多个…...
GLSL优化器核心优化技术详解:函数内联、死代码消除与常量传播
GLSL优化器核心优化技术详解:函数内联、死代码消除与常量传播 【免费下载链接】glsl-optimizer GLSL optimizer based on Mesas GLSL compiler. Used to be used in Unity for mobile shader optimization. 项目地址: https://gitcode.com/gh_mirrors/gl/glsl-opt…...
从扫描底片到AI生成:盐印相风格的5层衰减建模(曝光梯度/卤化银结晶/显影不均/微划痕/纸基透光)全拆解
更多请点击: https://intelliparadigm.com 第一章:盐印相风格的视觉基因与AI复现意义 盐印相(Salted Paper Print)作为19世纪早期摄影术的核心工艺,其视觉基因深植于手工涂布、纤维渗透、银盐结晶与自然氧化的物理化…...
如何三步实现AI虚拟试衣:OOTDiffusion从安装到实战的完整指南
如何三步实现AI虚拟试衣:OOTDiffusion从安装到实战的完整指南 【免费下载链接】OOTDiffusion [AAAI 2025] Official implementation of "OOTDiffusion: Outfitting Fusion based Latent Diffusion for Controllable Virtual Try-on" 项目地址: https://…...
【Appium 系列】第13节-混合测试执行器 — API + UI 的协同执行
对应代码:配套代码/test/core/hybrid_test_executor.py说明:本节讲解当一个测试用例需要同时使用接口测试和 UI 测试时,如何协调执行。这节讲什么有些测试用例,光靠接口测试或 UI 测试都不够。比如"验证用户注册后能登录&quo…...
从零到英雄:用AI瞄准技术彻底改变你的FPS游戏体验
从零到英雄:用AI瞄准技术彻底改变你的FPS游戏体验 【免费下载链接】yolov8_aimbot Aim-bot based on AI for all FPS games 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8_aimbot 你是否曾经在激烈的枪战中因为瞄准不准而错失良机?是否羡慕…...
Adobe-GenP:5分钟解锁Adobe全家桶的终极方案
Adobe-GenP:5分钟解锁Adobe全家桶的终极方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud的高昂订阅费用发愁吗ÿ…...
chatgpt-mirai-qq-bot输入输出参数:类型验证和默认值处理
chatgpt-mirai-qq-bot输入输出参数:类型验证和默认值处理 在构建复杂的聊天机器人系统时,输入输出参数的类型验证和默认值处理是确保系统稳定性和可靠性的关键。chatgpt-mirai-qq-bot项目通过精心设计的参数处理机制,为开发者提供了强大的类型…...
