【计算机视觉OpenCV基础】实验二 基元检测

news2025/2/24 3:11:05

实验二 基元检测

计算机视觉OpenCV基础实验合辑(实验1234+扩展)
资源下载地址: https://download.csdn.net/download/weixin_53403301
合辑:(加在下载地址后面)
/87113581
讲义(包括理论、图例、PPT、实验、代码、手册):(加在下载地址后面)
/87113633

matplotlib中载入中文字体

plt.rcParams['font.sans-serif'] = ['SimHei'] # 载入字体

实验目的:
1、 熟练掌握OpenCV使用方法;
2、 编程实现基元检测算法,加深对基元检测技术的理解,初步掌握基元检测运用方法。
实验内容:
1、边缘检测
(1)边缘检测的原理
基于搜索:利用一阶导数的最大值获取边界

基于零穿越:利用二阶导数为0获取边界

(2)Sobel算子
基于搜索的方法获取边界

cv.sobel()

cv.convertScaleAbs()

cv.addweights()

(3)Laplacian算子
基于零穿越获取边界

(4)Canny算法
噪声去除:高斯滤波

计算图像梯度:sobel算子,计算梯度大小和方向

非极大值抑制:利用梯度方向像素来判断当前像素是否为边界点

滞后阈值:设置两个阈值,确定最终的边界

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 21 14:44:28 2021
​
@author: ZHOU
"""import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 载入字体
# 1 读取图像
img = cv.imread('./image/horse.jpg',0)
# 2 计算Sobel卷积结果
x = cv.Sobel(img, cv.CV_16S, 1, 0)
y = cv.Sobel(img, cv.CV_16S, 0, 1)
# 3 将数据进行转换
Scale_absX = cv.convertScaleAbs(x)  # convert 转换  scale 缩放
Scale_absY = cv.convertScaleAbs(y)
# 4 结果合成
result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# 5 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap = plt.cm.gray),plt.title('Sobel滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()
​
​
x = cv.Sobel(img, cv.CV_16S, 1, 0, ksize = -1) # 利用Scharr进行边缘检测。
y = cv.Sobel(img, cv.CV_16S, 0, 1, ksize = -1)
# 3 将数据进行转换
Scale_absX = cv.convertScaleAbs(x)  # convert 转换  scale 缩放
Scale_absY = cv.convertScaleAbs(y)
# 4 结果合成
result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# 5 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap = plt.cm.gray),plt.title('Scharr滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()# 1 读取图像
img = cv.imread('./image/horse.jpg',0)
# 2 laplacian转换
result = cv.Laplacian(img,cv.CV_16S)
Scale_abs = cv.convertScaleAbs(result)
# 3 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(Scale_abs,cmap = plt.cm.gray),plt.title('Laplacian检测后结果')
plt.xticks([]), plt.yticks([])
plt.show()# 1 图像读取
img = cv.imread('./image/horse.jpg',0)
# 2 Canny边缘检测
lowThreshold = 0
max_lowThreshold = 100
canny = cv.Canny(img, lowThreshold, max_lowThreshold) 
# 3 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(canny,cmap = plt.cm.gray),plt.title('Canny检测后结果')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、模板匹配
原理:在给定的图片中查找和模板最相似的区域

API:利用cv.matchTemplate()进行模板匹配,然后使用cv.minMaxLoc()搜索最匹配的位置。

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 21 15:04:31 2021
​
@author: ZHOU
"""import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 载入字体
# 1 图像和模板读取
img = cv.imread('./image/wulin.jpeg')
template = cv.imread('./image/bai.jpeg')
h,w,l = template.shape
# 2 模板匹配
# 2.1 模板匹配
res = cv.matchTemplate(img, template, cv.TM_CCORR)
# 2.2 返回图像中最匹配的位置,确定左上角的坐标,并将匹配位置绘制在图像上
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# 使用平方差时最小值为最佳匹配位置
# top_left = min_loc
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img, top_left, bottom_right, (0,255,0), 2)
# 3 图像显示
plt.imshow(img[:,:,::-1])
plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

3、霍夫变换
(1)霍夫线检测
原理:将要检测的内容转换到霍夫空间中,利用累加器统计最优解,将检测结果表示处理

API:cv2.HoughLines()

注意:该方法输入是的二值化图像,在进行检测前要将图像进行二值化处理

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 21 15:06:51 2021
​
@author: ZHOU
"""import numpy as np
import random
import cv2 as cv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 载入字体
# 1.加载图片,转为二值图
img = cv.imread('./image/rili.jpg')
​
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 150)# 2.霍夫直线变换
lines = cv.HoughLines(edges, 0.8, np.pi / 180, 150)
# 3.将检测的线绘制在图像上(注意是极坐标噢)
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    cv.line(img, (x1, y1), (x2, y2), (0, 255, 0))
# 4. 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('霍夫变换线检测')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

(2)霍夫圆检测
方法:霍夫梯度法

API:cv.HoughCircles()

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 21 15:06:51 2021
​
@author: ZHOU
"""import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 1 读取图像,并转换为灰度图
planets = cv.imread("./image/star.jpeg")
gay_img = cv.cvtColor(planets, cv.COLOR_BGRA2GRAY)
# 2 进行中值模糊,去噪点
img = cv.medianBlur(gay_img, 7)  
# 3 霍夫圆检测
circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1, 200, param1=100, param2=30, minRadius=0, maxRadius=100)
# 4 将检测结果绘制在图像上
for i in circles[0, :]:  # 遍历矩阵每一行的数据
    # 绘制圆形
    cv.circle(planets, (i[0], i[1]), i[2], (0, 255, 0), 2)
    # 绘制圆心
    cv.circle(planets, (i[0], i[1]), 2, (0, 0, 255), 3)
# 5 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(planets[:,:,::-1]),plt.title('霍夫变换圆检测')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

4、角点检测
(1)Harris算法
思想:通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化。

API: cv.cornerHarris()

(2)Shi-Tomasi算法
对Harris算法的改进,能够更好地检测角点

API: cv2.goodFeatureToTrack()

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 21 15:24:03 2021
​
@author: ZHOU
"""import cv2 as cv
import numpy as np 
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 载入字体
# 1 读取图像,并转换成灰度图像
img = cv.imread('./image/chessboard.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 角点检测
# 2.1 输入图像必须是 float32
gray = np.float32(gray)# 2.2 最后一个参数在 0.04 到 0.05 之间
dst = cv.cornerHarris(gray,2,3,0.04)
# 3 设置阈值,将角点绘制出来,阈值根据图像进行选择
img[dst>0.001*dst.max()] = [0,0,255]
# 4 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('Harris角点检测')
plt.xticks([]), plt.yticks([])
plt.show()# 1 读取图像
img = cv.imread('./image/tv.jpg') 
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 2 角点检测
corners = cv.goodFeaturesToTrack(gray,1000,0.01,10)  
# 3 绘制角点
for i in corners:
    x,y = i.ravel()
    cv.circle(img,(x,y),2,(0,0,255),-1)
# 4 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('shi-tomasi角点检测')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
在这里插入图片描述

5、轮廓检测
(1)轮廓搜索:
cv2.findContours(img,mode,method)

mode:轮廓检索模式

• RETR_EXTERNAL :只检索最外面的轮廓;

• RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;

• RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;

• RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;

method:轮廓逼近方法

• CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。

• CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

(2)轮廓绘制
cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)

(3)轮廓特征计算:面积、周长、边界矩形、外接圆、饱和度(轮廓面积与边界矩形面积之比)。
cv2.contourArea(cnt) #面积

cv2.arcLength(cnt,True) #周长,True表示闭合的

x,y,w,h = cv2.boundingRect(cnt) #获得边界矩形

img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) #绘制边界矩形

area = cv2.contourArea(cnt) #轮廓面积

x, y, w, h = cv2.boundingRect(cnt) #获得轮廓的边界矩形

rect_area = w * h#边界矩形面积

extent = float(area) / rect_area#面积比

print (‘轮廓面积与边界矩形比’,extent)

(x,y),radius = cv2.minEnclosingCircle(cnt)#外接圆

(4)轮廓近似(多边形逼近)
epsilon = 0.15*cv2.arcLength(cnt,True) #以周长的0.15作为误差标准

approx = cv2.approxPolyDP(cnt,epsilon,True) #对轮廓cnt以误差标准epsilon进行近似

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 21 15:24:03 2021
​
@author: ZHOU
"""import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 载入字体
# 1 读取图像,并转换成灰度图像
img = cv2.imread('./image1/contours.png')
plt.imshow(img[:,:,::-1])
plt.title('原图'), plt.xticks([]), plt.yticks([])
plt.show()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold (gray, 127, 255, cv2.THRESH_BINARY)
binary=thresh
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)# 绘制轮廓 传入图像 -1
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
plt.imshow(res[:,:,::-1])
plt.title('绘制轮廓 -1'), plt.xticks([]), plt.yticks([])
plt.show()
# 绘制轮廓 传入图像 0
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, 0, (0, 0, 255), 2)
plt.imshow(res[:,:,::-1])
plt.title('绘制轮廓 0'), plt.xticks([]), plt.yticks([])
plt.show()
# 计算面积
cnt = contours[0]
print('面积',cv2.contourArea(cnt))
print('周长',cv2.arcLength(cnt,True))# 边界矩形
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
plt.imshow(img[:,:,::-1])
plt.title('边界矩形'), plt.xticks([]), plt.yticks([])
plt.show()
area = cv2.contourArea(cnt)
rect_area = w*h
extent = float(area) / rect_area
print('轮廓面积与边界矩形之比',extent)
# 外接圆
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img, center, radius, (0,255,0), 2)
plt.imshow(img[:,:,::-1])
plt.title('外接圆'), plt.xticks([]), plt.yticks([])
plt.show()# 1 读取图像2,并转换成灰度图像
img = cv2.imread('./image1/contours2.png')
plt.imshow(img[:,:,::-1])
plt.title('原图'), plt.xticks([]), plt.yticks([])
plt.show()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold (gray, 127, 255, cv2.THRESH_BINARY)
binary=thresh
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
​
cnt = contours[0]
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
plt.imshow(res[:,:,::-1])
plt.title('绘制轮廓'), plt.xticks([]), plt.yticks([])
plt.show()
epsilon = 0.15*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
print('0.15倍周长',epsilon)
print('对轮廓cnt以误差标准epsilon进行近似',approx)
draw_img = img.copy()
res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
plt.imshow(res[:,:,::-1])
plt.title('轮廓近似'), plt.xticks([]), plt.yticks([])
plt.show()# 边界矩形
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
plt.imshow(img[:,:,::-1])
plt.title('边界矩形'), plt.xticks([]), plt.yticks([])
plt.show()
area = cv2.contourArea(cnt)
rect_area = w*h
extent = float(area) / rect_area
print('轮廓面积与边界矩形之比',extent)
# 外接圆
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img, center, radius, (0,255,0), 2)
plt.imshow(img[:,:,::-1])
plt.title('外接圆'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
面积 8500.5
周长 437.9482651948929

在这里插入图片描述
轮廓面积与边界矩形之比 0.5154317244724715
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

0.15倍周长 189.8943818628788
对轮廓cnt以误差标准epsilon进行近似 [[[291 30]]

[[ 40 263]]

[[335 257]]]
在这里插入图片描述
在这里插入图片描述
轮廓面积与边界矩形之比 0.7800798598378357
在这里插入图片描述

6、形态学图像处理
• 腐蚀和膨胀:

腐蚀:求局部最大值,缩小或细化,能将小于结构体的细节从图像中滤除。

膨胀:求局部最小值,增长或粗化

• 开闭运算:

开:先腐蚀后膨胀。平滑物体轮廓、断开较窄的连接、消除细的突出物。

闭:先膨胀后腐蚀。平滑轮廓、弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线中的断裂。

• 礼帽和黑帽:

礼帽:原图像与开运算之差。

开运算放大了裂缝或者局部低亮度的区域,所以,从原图中减去开运算后的图,得到的结果突出了比原图轮廓周围的区域更明亮的区域,

这个操作与选择的核的大小有关。TopHat运算一般用来分离比邻近点亮一些的斑块,可以使用这个运算提取背景。

黑帽:闭运算与原图像之差

黑帽运算的结果突出了比原图轮廓周围区域更暗的区域,所以黑帽运算用来分离比邻近点暗一些的斑块。

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 21 16:48:59 2021
​
@author: ZHOU
"""import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 载入字体
# 1 读取图像
img = cv.imread("./image/letter.png")
# 2 创建核结构
kernel = np.ones((5, 5), np.uint8)# 3 图像腐蚀和膨胀
erosion = cv.erode(img, kernel) # 腐蚀
dilate = cv.dilate(img,kernel) # 膨胀# 4 图像展示
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(img)
axes[0].set_title("原图")
axes[1].imshow(erosion)
axes[1].set_title("腐蚀后结果")
axes[2].imshow(dilate)
axes[2].set_title("膨胀后结果")
plt.show()
​
img1 = cv.imread("./image/letteropen.png")
img2 = cv.imread("./image/letterclose.png")
# 2 创建核结构
kernel = np.ones((10, 10), np.uint8)
# 3 图像的开闭运算
cvOpen = cv.morphologyEx(img1,cv.MORPH_OPEN,kernel) # 开运算
cvClose = cv.morphologyEx(img2,cv.MORPH_CLOSE,kernel)# 闭运算
# 4 图像展示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img1)
axes[0,0].set_title("原图")
axes[0,1].imshow(cvOpen)
axes[0,1].set_title("开运算结果")
axes[1,0].imshow(img2)
axes[1,0].set_title("原图")
axes[1,1].imshow(cvClose)
axes[1,1].set_title("闭运算结果")
plt.show()# 2 创建核结构
kernel = np.ones((10, 10), np.uint8)
# 3 图像的礼帽和黑帽运算
cvOpen = cv.morphologyEx(img1,cv.MORPH_TOPHAT,kernel) # 礼帽运算
cvClose = cv.morphologyEx(img2,cv.MORPH_BLACKHAT,kernel)# 黑帽运算
# 4 图像显示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img1)
axes[0,0].set_title("原图")
axes[0,1].imshow(cvOpen)
axes[0,1].set_title("礼帽运算结果")
axes[1,0].imshow(img2)
axes[1,0].set_title("原图")
axes[1,1].imshow(cvClose)
axes[1,1].set_title("黑帽运算结果")
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验收获:
编程实现基元检测算法,加深对基元检测技术的理解,初步掌握基元检测运用方法。 学会了利用OpenCV进行边缘检测、角点检测、霍夫变换、形态学处理、基元检测以及模板匹配。


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

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

相关文章

[附源码]SSM计算机毕业设计火车售票系统论文JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

antd table 表格滚动高度适配

文章の目录问题产生背景如何解决写在最后问题产生背景 在开发一个后台管理系统,某一页面用到了table表格,产品的需求是: table表格无论展示多少条数据,表头和分页信息要展示出来 此时我们一定首先想到了table表格的 scroll 属性…

【设计模式】原型模式

原型模式属于创建型模式,主要作用是利用一个原型对象的克隆方法,在保证性能的情况下创建多个重复的对象,本质就是通过克隆一个原有的对象来复制出一个新对象。 文章目录原型模式的介绍使用场景原型模式的实现类图实现方法第一步,编…

一文解决 Go 安装和常用环境变量的配置

一文解决 Go 安装和常用环境变量的配置下载链接Windows 操作系统下安装Linux 操作系统下安装安装多个 Go 版本常用环境变量的解释结尾耐心和持久胜过激烈和狂热。 下载链接 官网:https://golang.org/dl中国大陆的镜像站点:https://golang.google.cn/dl/…

跨境电商卖家只青睐亚马逊?其实你不知道,“备胎”早已选好!(Starday)

跨境电商平台作为一个新的国际贸易形态,打破传统贸易形态的方式,将互联网与外贸交易相结合,从而大大降低外贸的运营成本,因此在这两年逐渐燃爆电商行业,让许多行业的人趋之若鹜,从观察中我们可以发现&#…

线性插值方法

插值,通俗来说当在一个离散的事件中,想知道某一个位置确定的值时,就可以利用插值方式计算得到,即利用已知数据估计未知位置数值。插值的方式有很多,下面介绍几种常用的插值方式。 一、最近邻插值(Nearest Neighbour …

矩阵分析:特征值分解都在这里了

矩阵分析:特征值分解前置知识空间变换伸缩旋转对称矩阵对称矩阵对角化正交矩阵向量的基基变换不同基下的向量变换逆矩阵不同基下的空间变换内积的几何意义特征值、特征向量特征值分解代码前置知识 空间变换 伸缩 一个矩阵其实就是一个线性变换,因为一个…

借道元宇宙 一汽-大众揽巡打造沉浸式上市体验

11月18日,一汽-大众以元宇宙科技为载体,举行了行业首场元宇宙游戏形式的“巡梦之旅”线上虚拟发布会,宣布旗下“硬核大五座SUV”揽巡Tavendor正式上市。全新揽巡共提供330TSI 精英巡行版、330TSI 豪华巡逸版、380TSI 四驱R-Line 巡游版、380T…

代码库制作与使用

静态库 假定有以下目录结构,main.c 为src测试文件,所以要调用src目录下的四个文件。我们可以把src打包成一个静态库供main.c使用 tree 命令展示目录结构制作 1.先把目标代码编译生成.o文件 需要包含头文件,否则会报错,使用-I来…

dB family cheat sheet: dB, dBW, dBm, dBi, dBc, etc

目录 1. dB 2. dBi 3. dBW和dBm 4. dBc(Decibel relative to carrier power level) 5. dBuV(dB over 1 microvolt), dBmV(dB over 1 millivolt) 6. 功率、电压、匹配阻抗 7. dBFS 1. dB dB用于表示功率之间的对数比率,所以它没有单位,其定义为&am…

【2022.11最新】Python疫情数据采集 + 可视化展示

嗨害大家好鸭!我是小熊猫 最近我又又又在家里居家办公了 闲来无事,用python采集一下 再做个可视化 康康现在疫情如何 源码、资料素材电子书点击这里 知识点: 1. 爬虫基本流程 2. requests 发送请求 3. re 正则表达式 4. json 结构化数据解析 5. pyech…

【深度学习】CycleGAN开源项目学习笔记 | 完整流程 | 报错总结 | pytorch

文章目录前言一、下载项目,文件结构观察二、数据集下载三、训练3.1、训练初体验3.2、命令行输入参数3.3、继续训练命令四、预测4.1、使用自己训练完的权重文件进行预测4.2、使用网上的预训练文件进行预测前言 你敢想象,就是这么一个简单的开源网站&…

南卡电容笔和绿联哪款更好用?性价比高的电容笔推荐

随着生活节奏逐渐加快,从而Apple Pencil的出现引来了不少热度,不过Apple Pencil由于价格昂贵,让不少用户望而止步。然而现在出现了平替电容笔,而且品牌众多,有很多百元左右的平替电容笔,性能和配置都做的不…

适合运动的耳机有哪些?六款相当不错的运动耳机分享

户外运动是现代青年最常见的一种生活方式,无论是在公交地铁上,还是晚上散步的公园里,都能看到很多人在运动,然而他们在做运动的时候都会佩戴上一款运动耳机,音乐能够让我们沉醉于运动中。也越来越多人会问,…

一款可以阻止网络钓鱼诈骗的解决方案?

“你继承了一笔财富。要转账,我需要你的银行账户凭证。” 你是否也遇见过此类的电话诈骗话术。 根据2022年数据泄露调查报告,25%的数据泄露涉及网络钓鱼。 这是怎么发生的?参与网络钓鱼的欺诈者一般都是心理方面的高手。他们知道如何营造紧…

蓄电池电压检测单元 电池监控模块 24路电池电压采样模块电源检测

24路巡检单元的主要功能是对串联蓄电池组的单电池电压进行实时在线巡回检测,并智能分析电池的使用状况,根据用户设置不同的上下限、平均偏差自动判断并输出告警。本电池巡检单元主要应用于发电厂、变电站或其它行业中的直流电源、UPS电源的蓄电池组的电压…

载紫杉醇D-α-生育酚聚乙二醇1000琥珀酸酯/纳米粒包裹紫杉醇的肝素纳米粒

下面整理了载紫杉醇D-α-生育酚聚乙二醇1000琥珀酸酯/纳米粒包裹紫杉醇的肝素纳米粒,一起看! 包裹紫杉醇的肝素纳米粒制备方法: 以肝素为原料制备生物素化包裹紫杉醇的肝素纳米粒,动态光散射仪测定其粒径及电位,透射电镜观察其形态,紫外分光…

cuda 编程:矩阵运算讲解

本文主要介绍用CUDA实现矩阵运算(C A x B)的几个基本方法,帮助大家理解矩阵在GPU上面的运算与CPU上的有何异同,通过实践上手CUDA的优化计算,相比基础方法,能提速10倍以上。 本文内容涉及到CUDA矩阵1D运算,2D运算,共享内存,CUBLAS…

808. 分汤 : 挺有意思的 DP 题

题目描述 这是 LeetCode 上的 808. 分汤 ,难度为 中等。 Tag : 「数学」、「动态规划」、「线性 DP」 有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作: 提供 100ml 的 汤A 和 0ml 的 汤B 。提供 75ml 的 汤A 和 25ml 的 汤B…

还在用Python爬壁纸网站?不如来试试搜索引擎的图片库

前言 嗨嗨,又来给你们带来爬美女照片的文章了 今天就不去搞什么壁纸网站了,之前也发了蛮多了 今天搞点不一样的,来试试搜索引擎的图片库 话不多说,直接用Python来开发一下此处资源! 开发环境 & 第三方模块 环…