opencv基础55-获取轮廓的特征值及示例

轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本节介绍几个轮廓自身的属性特征及轮廓所包围对象的特征。

宽高比

可以使用宽高比(AspectRation)来描述轮廓,例如矩形轮廓的宽高比为:

宽高比 = 宽度(Width)/高度(Height)

示例:编写程序计算矩形轮廓的宽高比。

import cv2
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])
cv2.rectangle(o,(x,y),(x+w,y+h),(255,255,255),3)
aspectRatio = float(w)/hprint(aspectRatio)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:
同时,程序还会显示如下的运行结果:

2.1506849315068495

可以看出,轮廓的宽高比约为 2。
在这里插入图片描述

Extent(用轮廓面积与矩形边界(矩形包围框、矩形轮廓)面积之比 )

可以使用轮廓面积与矩形边界(矩形包围框、矩形轮廓)面积之比 Extend 来描述图像及
其轮廓特征。计算方法为:
在这里插入图片描述

示例:计算图像的轮廓面积与其矩形边界面积之比。

import cv2
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])
cv2.drawContours(o,contours[0],-1,(0,0,255),3)
cv2.rectangle(o,(x,y),(x+w,y+h),(255,0,0),3)
#----------------计算轮廓的面积与边界矩形的面积-------------------------
rectArea=w*h
cntArea=cv2.contourArea(contours[0])extend=float(cntArea)/rectArea
print(extend)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()

同时,程序还会显示如下的运行结果:

0.6717127650292296

可以看出,本例中图像的轮廓面积与矩形边界面积的比值大约为 0.7。
在这里插入图片描述

Solidity(轮廓面积与凸包面积之比)

可以使用轮廓面积与凸包面积之比 Solidity 来衡量图像、轮廓及凸包的特征。其计算方法为:

在这里插入图片描述

示例:编写程序计算图像轮廓面积与凸包面积之比。

import cv2
o = cv2.imread('hand.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy =cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(o,contours[0],-1,(0,0,255),3)
cntArea=cv2.contourArea(contours[0])
hull = cv2.convexHull(contours[0])
hullArea = cv2.contourArea(hull)
cv2.polylines(o, [hull], True, (0, 255, 0), 2)
solidity=float(cntArea)/hullArea
print(solidity)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()

同时,程序还会显示如下的运行结果:

0.6752344564084751

可以看出,本例中图像的轮廓面积与凸包面积的比值约为 0.7。

就是绿色的跟红色的面积之比
在这里插入图片描述

等效直径(Equivalent Diameter)

可以用等效直径来衡量轮廓的特征值,该值是与轮廓面积相等的圆形的直径。其计算公式为:

在这里插入图片描述

示例:计算与轮廓面积相等的圆形的直径,并绘制与该轮廓等面积的圆。

import cv2
import numpy as np
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(o,contours[0],-1,(0,0,255),3)
cntArea=cv2.contourArea(contours[0])
equiDiameter = np.sqrt(4*cntArea/np.pi)
print(equiDiameter)
cv2.circle(o,(100,100),int(equiDiameter/2),(0,0,255),3) #展示等直径大小的圆
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()

同时,程序还会显示如下的运行结果:

99.00522529212108

可以看出,与本例中与轮廓面积相等的圆形的直径约为 99。

在这里插入图片描述

方向

在 OpenCV 中,函数 cv2.fitEllipse()可以用来构造最优拟合椭圆,还可以在返回值内分别返回椭圆的中心点、轴长、旋转角度等信息。使用这种形式,能够更直观地获取椭圆的方向等信息。
函数 cv2.fitEllipse()返回各个属性值的语法格式为:

(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)

式中几个返回值的意义如下:

  • (x,y):椭圆的中心点。
  • (MA,ma):椭圆水平方向轴和垂直方向轴的长度。
  • angle:椭圆的旋转角度。

示例:观察函数 cv2.fitEllipse()的不同返回值

import cv2
o = cv2.imread('cc.bmp')cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)ellipse = cv2.fitEllipse(contours[0])
retval=cv2.fitEllipse(contours[0])
print("单个返回值形式:")
print("retval=\n",retval)
(x,y),(MA,ma),angle = cv2.fitEllipse(contours[0])
print("三个返回值形式:")
print("(x,y)=(",x,y,")")
print("(MA,ma)=(",MA,ma,")")
print("angle=",angle)
cv2.ellipse(o,ellipse,(0,0,255),2)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()

同时,程序还会显示如下的运行结果:

单个返回值形式:
retval=
((276.2112731933594, 139.6067352294922), (63.01350021362305,
166.72308349609375), 82.60102844238281)
三个返回值形式:
(x,y)=( 276.2112731933594 139.6067352294922 )
(MA,ma)=( 63.01350021362305 166.72308349609375 )
angle= 82.60102844238281

从以上运行结果可以看出,函数 cv2.fitEllipse()以不同形式返回的值是相同的。

在这里插入图片描述

掩模和像素点

有时,我们希望获取某对象的掩模图像及其对应的点。51 节介绍了将函数cv2.drawContours()的轮廓宽度参数 thickness 设置为“-1”,即可获取特定对象的实心轮廓,即特定对象的掩模。

另外,我们可能还希望获取轮廓像素点的具体位置信息。本节介绍如何获取轮廓(实心、空心)的像素点位置信息。

一般情况下,轮廓是图像内非零的像素点,可以通过两种方式获取轮廓像素点的位置信息。

一种是使用 Numpy 函数,另外一种是使用 OpenCV 函数。
1.使用Numpy函数获取轮廓像素点
numpy.nonzero()函数能够找出数组内非零元素的位置,但是其返回值是将行、列分别显示
的。
例如,对于如下数组 a 应用函数 numpy.nonzero():

a=
[[0 0 0 1 0]
[0 0 1 0 1]
[0 0 1 1 1]
[1 0 0 0 0]
[1 0 0 0 1]]

返回的数组 a 内非零元素的位置信息为:
(array([0, 1, 1, 2, 2, 2, 3, 4, 4], dtype=int64), array([3, 2, 4, 2, 3, 4, 0,
0, 4], dtype=int64))
使用 numpy.transpose()函数处理上述返回值,则得到这些点的(x, y)形式的坐标:

[[0 3] [1 2] [1 4] [2 2] [2 3] [2 4] [3 0] [4 0] [4 4]]

示例:使用 Numpy 函数获取一个数组内的非零值元素的位置信息。

代码如下:

import numpy as np
#------------生成一个元素都是零值的数组 a-------------------
a=np.zeros((5,5),dtype=np.uint8)
#-------随机将其中 10 个位置上的数值设置为 1------------
#---times 控制次数
#---i,j 是随机生成的行、列位置#---a[i,j]=1,将随机挑选出来的位置上的值设置为 1
for times in range(10):i=np.random.randint(0,5)j=np.random.randint(0,5)a[i,j]=1
#-------打印数组 a,观察数组 a 内值的情况-----------
print("a=\n",a)
#------查找数组 a 内非零值的位置信息------------
loc=np.transpose(np.nonzero(a))
#-----输出数组 a 内非零值的位置信息------------
print("a 内非零值的位置:\n",loc)

运行上述程序,会显示如下的运行结果:

a=
[[1 1 0 0 0]
[1 1 0 1 1]
[1 0 0 0 0]
[0 0 0 1 0]
[1 1 0 0 0]]
a 内非零值的位置:
[[0 0]
[0 1]
[1 0]
[1 1]
[1 3]
[1 4]
[2 0]
[3 3]
[4 0]
[4 1]]

示例:使用 Numpy 函数获取一个图像内的轮廓点位置。

import cv2
import numpy as np
#-----------------读取原始图像----------------------
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
#-----------------获取轮廓------------------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[0]#-----------------绘制空心轮廓------------------------
mask1 = np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask1,[cnt],0,255,2)
pixelpoints1 = np.transpose(np.nonzero(mask1))
print("pixelpoints1.shape=",pixelpoints1.shape)
print("pixelpoints1=\n",pixelpoints1)
cv2.imshow("mask1",mask1)
#-----------------绘制实心轮廓---------------------
mask2 = np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask2,[cnt],0,255,-1)
pixelpoints2 = np.transpose(np.nonzero(mask2))
print("pixelpoints2.shape=",pixelpoints2.shape)
print("pixelpoints2=\n",pixelpoints2)
cv2.imshow("mask2",mask2)
#-----------------释放窗口------------------------
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

  • 左图是图像 o。
  • 中间的是空心轮廓图像 mask1。
  • 右图是实心轮廓图像 mask2。

同时,程序还会显示如下的运行结果:

pixelpoints1.shape= (1400, 2)
pixelpoints1=[[106 292][106 293][106 294]...[180 222][180 223][180 224]]
pixelpoints2.shape= (7892, 2)
pixelpoints2=[[107 293][107 294][107 295]...[179 221][179 222][179 223]]

使用OpenCV函数获取轮廓点

OpenCV 提供了函数 cv2.findNonZero()用于查找非零元素的索引。该函数的语法格式为:

idx = cv2.findNonZero( src )

式中:

  • idx 为返回值,表示非零元素的索引位置。需要注意的是,在返回的索引中,每个元素对应的是(列号,行号)的格式。
  • src 为参数,表示要查找非零元素的图像。

示例: 使用 OpenCV 函数 cv2.findNonZero()获取一个数组内的非零值。

代码如下:

import cv2
import numpy as np
#------------生成一个元素都是零值的数组 a-------------------
a=np.zeros((5,5),dtype=np.uint8)
#-------随机将其中 10 个位置上的值设置为 1------------
#---times 控制次数
#---i,j 是随机生成的行、列位置
#---a[i,j]=1,将随机挑选出来的位置上的值设置为 1
for times in range(10):i=np.random.randint(0,5)j=np.random.randint(0,5)a[i,j]=1
#-------打印数组 a,观察数组 a 内值的情况-----------
print("a=\n",a)
#------查找数组 a 内非零值的位置信息------------
loc = cv2.findNonZero(a)
#-----输出数组 a 内非零值的位置信息------------
print("a 内非零值的位置:\n",loc)

运行上述程序,会显示如下的运行结果:

a=[[1 1 0 0 0][0 0 0 0 1][0 0 1 1 0][0 0 0 0 1][0 0 0 0 0]]
a 内非零值的位置:[[[0 0]][[1 0]][[4 1]][[2 2]][[3 2]][[4 3]]]

示例:使用 OpenCV 函数 cv2.findNonZero()获取一个图像内的轮廓点的位置。

import cv2
import numpy as np
#-----------------读取原始图像----------------------
o = cv2.imread('cc.bmp')
cv2.imshow("original",o)
#-----------------获取轮廓------------------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[0]
#-----------------绘制空心轮廓------------------------
mask1 = np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask1,[cnt],0,255,2)
pixelpoints1 = cv2.findNonZero(mask1)
print("pixelpoints1.shape=",pixelpoints1.shape)
print("pixelpoints1=\n",pixelpoints1)
cv2.imshow("mask1",mask1)
#-----------------绘制实心轮廓---------------------
mask2 = np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask2,[cnt],0,255,-1)
pixelpoints2 = cv2.findNonZero(mask2)
print("pixelpoints2.shape=",pixelpoints2.shape)
print("pixelpoints2=\n",pixelpoints2)
cv2.imshow("mask2",mask2)
#-----------------释放窗口------------------------
cv2.waitKey()
cv2.destroyAllWindows()
  • 左图是原图像 o。
  • 中间的是空心轮廓图像 mask1。
  • 右图是实心轮廓图像 mask2。
    在这里插入图片描述
    同时,程序还会显示如下的运行结果:
pixelpoints1.shape= (1400, 1, 2)
pixelpoints1=
[[[292 106]]
[[293 106]]
[[294 106]]
...
[[222 180]]
[[223 180]]
[[224 180]]]
pixelpoints2.shape= (7892, 1, 2)
pixelpoints2=
[[[293 107]]
[[294 107]]
[[295 107]]
...
[[221 179]]
[[222 179]]
[[223 179]]]

最大值和最小值及它们的位置

OpenCV 提供了函数 cv2.minMaxLoc(),用于在指定的对象内查找最大值、最小值及其位
置。该函数的语法格式是:

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)

式中的返回值为:

  • min_val:最小值。

  • max_val:最大值。

  • min_loc:最小值的位置。

  • max_loc:最大值的位置。
    式中的参数如下:

  • imgray:单通道图像。

  • mask:掩模。通过使用掩模图像,可以得到掩模指定区域内的最值信息。

示例:使用函数 cv2.minMaxLoc()在图像内查找掩模指定区域内的最大值、最小值及其位置。

import cv2
import numpy as np
o = cv2.imread('ct.png')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[2] #coutours[0]、coutours[1]是左侧字母 R
#--------使用掩模获取感兴趣区域的最值-----------------
#需要注意函数 minMaxLoc 处理的对象为灰度图像,本例中处理的对象为灰度图像 gray
#如果希望获取彩色图像的最值,需要提取各个通道图像,为每个通道独立计算最值
mask = np.zeros(gray.shape,np.uint8)
mask=cv2.drawContours(mask,[cnt],-1,255,-1)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(gray,mask = mask)
print("minVal=",minVal)
print("maxVal=",maxVal)
print("minLoc=",minLoc)
print("maxLoc=",maxLoc)
#--------使用掩模获取感兴趣区域并显示-----------------
masko = np.zeros(o.shape,np.uint8)
masko=cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)
loc=cv2.bitwise_and(o,masko)
cv2.imshow("mask",loc)
#显示灰度结果
#loc=cv2.bitwise_and(gray,mask)
#cv2.imshow("mask",loc)
#--------释放窗口-----------------
cv2.waitKey()
cv2.destroyAllWindows()

示例原图

在这里插入图片描述

  • 左图是图像 o。
  • 右图是掩模图像 mask。
    在这里插入图片描述

同时,程序还会显示如下的运行结果:

minVal= 42.0
maxVal= 200.0
minLoc= (87, 90)
maxLoc= (90, 110)

平均颜色及平均灰度

OpenCV 提供了函数 cv2.mean(),用于计算一个对象的平均颜色或平均灰度。该函数的语
法格式为:

mean_val = cv2.mean(im,mask = mask)

式中的返回值为 mean_val,表示返回的平均值。
式中的参数如下:

  • im:原图像。
  • mask:掩模。

示例:使用函数 cv2.mean()计算一个对象的平均灰度。

import cv2
import numpy as np
#--------读取并显示原始图像-----------------
o = cv2.imread('ct.png')
cv2.imshow("original",o)
#--------获取轮廓-----------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[2] #coutours[0]、coutours[1]是左侧字母 R
#--------使用掩模获取感兴趣区域的均值-----------------
mask = np.zeros(gray.shape,np.uint8) #构造 mean 所使用的掩模(必须是单通道的)cv2.drawContours(mask,[cnt],0,(255,255,255),-1)
meanVal = cv2.mean(o,mask = mask) # mask 是一个区域,所以必须是单通道的
print("meanVal=\n",meanVal)
#--------使用掩模获取感兴趣区域并显示-----------------
masko = np.zeros(o.shape,np.uint8)
cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)
loc=cv2.bitwise_and(o,masko)
cv2.imshow("mask",loc)
#--------释放窗口-----------------
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

  • 左图是图像 o。
  • 右图是获取的感兴趣区域。

同时,程序还会显示如下的运行结果:

meanVal= (85.45594913714805, 85.45594913714805, 85.45594913714805, 0.0)

从上述结果可以看出,函数 cv2.mean()能够计算各个通道的均值。上述 4 个值分别是 RGB和 A 通道(alpha
通道)的均值。本例中,RGB 三个通道的值相同,所以计算出的均值也是一样的。

极点

有时,我们希望获取某个对象内的极值点,例如最左端、最右端、最上端、最下端的四个
点。OpenCV 提供了相应的函数来找出这些点,通常的语法格式是:

leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

示例: 计算一幅图像内的极值点。

import cv2
import numpy as np
o = cv2.imread('cs.bmp')
#--------获取并绘制轮廓-----------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
mask = np.zeros(gray.shape,np.uint8)
cnt=contours[0]
cv2.drawContours(mask,[cnt],0,255,-1)
#--------计算极值-----------------
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
#--------打印极值-----------------
print("leftmost=",leftmost)
print("rightmost=",rightmost)
print("topmost=",topmost)
print("bottommost=",bottommost)
#--------绘制说明文字-----------------
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(o,'A',leftmost, font, 1,(0,0,255),2)
cv2.putText(o,'B',rightmost, font, 1,(0,0,255),2)
cv2.putText(o,'C',topmost, font, 1,(0,0,255),2)
cv2.putText(o,'D',bottommost, font, 1,(0,0,255),2)
#--------绘制图像-----------------
cv2.imshow("result",o)
#--------释放窗口-----------------
cv2.waitKey()
cv2.destroyAllWindows()

其中的A,B,C,D 就是该图像的极点
在这里插入图片描述
同时,程序还会显示如下的运行结果:

leftmost= (202, 135)
rightmost= (423, 120)
topmost= (369, 69)
bottommost= (216, 179)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3使用vue-print-nb插件调起打印功能

一、效果图 二、使用方式 安装插件 //Vue2.0版本安装方法 npm install vue-print-nb --save yarn add vue-print-nb//Vue3.0版本安装方法: npm install vue3-print-nb --save yarn add vue3-print-nb在全局引用 import Print from vue-print-nb Vue.use(Print)打…

Stable Diffusion WebUI 从零基础到入门

本文主要介绍Stable Diffusion WebUI的实际操作方法,涵盖prompt推导、lora模型、vae模型和controlNet应用等内容,并给出了可操作的文生图、图生图实战示例。适合对Stable Diffusion感兴趣,但又对Stable Diffusion WebUI使用感到困惑的同学&am…

序列模型和循环网络

Sequence Modeling and Recurrent Networks Sequence modeling tasks 在以往的模型中,各个输入之间是独立分布的 x ( i ) x^{(i)} x(i) 之间是相互独立的,同样输出 y ( i ) y^{(i)} y(i)之间也是相互独立的。 但是在序列模型中,输入输出是…

STM32基于CubeIDE和HAL库 基础入门学习笔记:功能驱动与应用

文章目录: 一:LED与按键驱动程序 main.c 1.闪灯 led.h led.c 2.按键控制LED亮灭 key.h key.c 二:蜂鸣器与继电器驱动程序 main.c 1.蜂鸣器 buzzer.h buzzer.c delay.h delay.c 2.继电器 relay.h relay.c 三&#xff1…

“MongoDB基础知识【超详细】

"探索MongoDB的无边之境:沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界!在这个博客中,我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者,MongoDB都将为您带来一场令人心动…

PLY模型格式详解【3D】

本文介绍PLY 多边形文件格式,这是一种用于存储被描述为多边形集合的图形对象。 PLY文件格式的目标是提供一种简单且易于实现但通用的格式足以适用于各种模型。 PLY有两种子格式:易于入门的 ASCII 表示形式和用于紧凑存储和快速保存和加载的二进制格式。 …

搭建 Python 环境 | Python、PyCharm

计算机 计算机能完成的工作: 算术运算逻辑判断数据存储网络通信…更多的更复杂的任务 以下这些都可以称为 “计算机”: 一台计算机主要由以下这几个重要的组件构成 CPU 中央处理器:大脑,算术运算,逻辑判断 存储器&…

Redis——常见数据结构与单线程模型

Redis中的数据结构 Redis中所有的数据都是基于key,value实现的,这里的数据结构指的是value有不同的类型。 当前版本Redis支持10种数据类型,下面介绍常用的五种数据类型 底层编码 Redis在实现上述数据结构时,会在源码有特定的…

Docker数据卷容器

1.数据卷容器介绍 即使数据卷容器c3挂掉也不会影响c1和c2通信。 2.配置数据卷容器 创建启动c3数据卷容器,使用-v参数设置数据卷。volume为目录,这种方式数据卷目录就不用写了,直接写宿主机目录。 创建c1、c2容器,使用–volum…

三星霸主地位“无可撼动“,DRAM内存市场份额创近 9 年新低仍第一

三星电子在DRAM市场的竞争地位一直备受关注。据报告显示,除了市场份额下降外,三星电子在上半年的销售额也出现了下滑。这主要是由于全球消费电子产品需求下滑,导致三星电子的芯片需求减少。 存储芯片业务所在的设备解决方案部门的营收和利润也…

24届近3年上海电力大学自动化考研院校分析

今天给大家带来的是上海电力大学控制考研分析 满满干货~还不快快点赞收藏 一、上海电力大学 学校简介 上海电力大学(Shanghai University of Electric Power),位于上海市,是中央与上海市共建、以上海市管理为主的全日…

经典人体模型SMPL介绍(一)

SMPL是马普所提出的经典人体模型,目前已成为姿态估计、人体重建等领域必不可少的基础先验。SMPL基于蒙皮和BlendShape实现,从数千个三维人体扫描结果得来,后通过PCA统计学习得来。 论文:SMPL: A Skinned Multi-Person Linear Mode…

基于Python的HTTP代理爬虫开发初探

前言 随着互联网的发展,爬虫技术已经成为了信息采集、数据分析的重要手段。然而在进行爬虫开发的过程中,由于个人或机构的目的不同,也会面临一些访问限制或者防护措施。这时候,使用HTTP代理爬虫可以有效地解决这些问题&#xff0…

普华永道踩坑MOVEit漏洞,泄露银行8万名储户的信息

8月14日,波多黎各自治区最大的银行——人民银行向缅因州司法部长提交了一份客户信息泄露报告。该报告指出,由于供应商普华永道使用的MOVEit软件存在安全漏洞,导致银行82217名储户的个人信息被泄露。 目前,波多黎各人民银行已经陆续…

javaScript:数组方法(增删/提取类/截取/操作方法等)

目录 一.数组的增删方法 1.push()数组末尾添加元素 解释 代码 运行截图 2.unshift()向数组的头部添加数组 解释 代码 运行截图 3.pop()数组的尾部删除一个元素 解释 代码 运行截图 4.shift()数组的头部删除一个元素 解释 代码 运行截图 5. splice()任意位…

使用 Visual Studio Code 调试 CMake 脚本

之前被引入到 Visual Studio 中的 CMake 调试器,现已在 Visual Studio Code 中可用。 也就是说,现在你可以通过在 VS Code 中安装 CMake 工具扩展,来调试你的 CMakeLists.txt 脚本了。是不是很棒? 背景知识 Visual C 开发团队和 CMake 的维…

最全的【DDD领域建模】小白学习手册(文末附资料)

1、前言: 在当时的环境下,单体应用仍然是市场的主体,但是大型复杂软件系统已经出现,给团队的设计和开发工作带来了比较大的挑战。 DDD提供了一种新的设计思路,通过对于业务子域和限界上下文的划分,建立跨…

【Oracle 数据库 SQL 语句 】积累1

Oracle 数据库 SQL 语句 1、分组之后再合计2、显示不为空的值 1、分组之后再合计 关键字: grouping sets ((分组字段1,分组字段2),()) select sylbdm ,count(sylbmc) a…

【数据结构OJ题】链表中倒数第k个结点

原题链接:https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId13&&tqId11167&rp2&ru/activity/oj&qru/ta/coding-interviews/question-ranking 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 …