Python 如何从具有许多不同前景的图像中提取任意背景矩形面片
我正在研究如何从同一幅图像中提取人脸和相同数量的背景Python 如何从具有许多不同前景的图像中提取任意背景矩形面片,python,opencv,image-processing,computer-vision,dataset,Python,Opencv,Image Processing,Computer Vision,Dataset,我正在研究如何从同一幅图像中提取人脸和相同数量的背景 我能够(从注释的坐标)获得面 我的问题是: 我想裁剪具有相同数量面(不一定相同大小)的地面面片, 对背景的限制是: 任何背景图像的大小应不小于20 x 20像素 与面(其中任何一个面)的最大重叠率(IOU:联合体上的交点)不应超过20%(0.2) 背景面片的计数应与同一图像中的面计数相同 示例图像: 注释数据: [Rmax RminθXc Yc] [[ 52 38 1 154 72] [ 57 38 -2 368 1
[[ 52 38 1 154 72]
[ 57 38 -2 368 103]
[ 14 9 -2 11 64]
[ 11 8 1 29 16]
[ 10 6 1 56 61]
[ 10 6 -2 68 66]
[ 14 9 1 46 126]
[ 15 11 1 21 192]
[ 22 12 1 11 157]
[ 13 9 1 267 133]
[ 19 13 1 312 186]
[ 12 9 1 300 19]
[ 11 9 -2 334 139]
[ 14 10 -2 437 87]
[ 11 8 1 232 27]]
我的代码是:
#--------------------
#进口图书馆
#====================
将numpy作为np导入
将matplotlib.pyplot作为plt导入
导入操作系统
进口cv2
datasetPath=“/home/myPath”
#---------------------------------------------
#从图像中提取人脸和背景
#=============================================
def extData(imgPath、annots、foldPath、index):
'''
函数从图像中提取人脸和背景。
参数:
@Param:imgPath:指定的映像路径(在数据库中)。
@Param:annots:nd数组,形状为m x 5,:m图像中检测到的面数。
(5) :最大半径|最小半径|角度|中心x |中心y
@Param:foldPath:保存提取图像的折叠路径。
@Param:index:一个开始命名面和背景的数字。
在foldPath中保存:m nd数组(m个面)和m nd数组(m个背景)
'''
fullImagePath=os.path.join(datasetPath,imgPath)
img=cv2.imread(完整图像路径)
img=cv2.cvt颜色(img,cv2.COLOR\u BGR2RGB)
#创建面
facesList=[]
对于范围内的行(注释形状[0]):
#初始化变量
xc=注释[行][3]
yc=注释[行][4]
Rmax=注释[行][0]
Rmin=注释[行][1]
θ=注释[行][2]
#矩形边框
#表示矩形的左上角
x0=数学楼层(xc-Rmin*math.sin(θ))
y0=数学地板(yc-Rmax*math.sin(θ))
#表示矩形的右下角
x1=数学地板(xc+Rmin*数学sin(θ))
y1=数学地板(yc+Rmax*数学sin(θ))
#在矩形窗口中裁剪面
面=img[y0:y1,x0:x1,:]
#存储面的坐标
facesList.append([x0,x1,y0,y1])
#制作一个目录来保存里面的面。
mkdir(os.path.join(foldPath,“/face/”)
imwrite(os.path.join(foldPath,“/face/”,“face”{}.format(str(index+row)),face))
#创造背景
对于行,枚举中的面(面列表):
#背景=img[xb1:xb2,yb1:yb2,:]
#制作一个目录来保存里面的背景。
mkdir(os.path.join(foldPath,“/background/”)
#imwrite(os.path.join(foldPath,“/background/”,“background”{}.format(str(index+row)),background))
#---------------------------------------------
您可以使用来计算与面之间的L1距离,并根据距离对矩形中心进行采样,从而确保裁剪不会与“面”重叠:
将numpy导入为np
img=cv2.imread(完整图像路径)
#在“面”和bonudary中创建一个带零的遮罩
掩码=np.zero(img.shape[:2],dtype=np.uint8)
掩码[1:-1,1:-1]=1
对于范围内的行(注释形状[0]):
#初始化变量
xc=注释[行][3]
yc=注释[行][4]
Rmax=注释[行][0]
Rmin=注释[行][1]
θ=注释[行][2]
#如果旋转角度超过45度,则交换半径
如果(θ>45):
R=Rmax
Rmax=Rmin
Rmin=R
#矩形边框
#表示矩形的左上角
st=数学sin(θ)
如果st>0,则st=st,否则-st
x0=数学楼层(xc-Rmin*st)
y0=数学楼层(yc-Rmax*st)
#表示矩形的右下角
x1=数学楼层(xc+Rmin*st)
y1=数学楼层(yc+Rmax*st)
#在矩形窗口中裁剪面
掩模[y0:y1,x0:x1]=0
#一旦我们有了一张地图,我们就可以计算每个非人脸像素到最近人脸的距离
dst=cv2.distanceTransform(掩码,cv2.DistanceL1,3)
#距离人脸小于10像素(20//2)的像素不能被视为好的候选像素。如果允许IoU>0,则可以稍微放宽。
dst[dst您可以使用来计算与面之间的L1距离,并根据距离对矩形中心进行采样,从而确保裁剪不会与“面”重叠:
将numpy导入为np
img=cv2.imread(完整图像路径)
#在“面”和bonudary中创建一个带零的遮罩
掩码=np.zero(img.shape[:2],dtype=np.uint8)
掩码[1:-1,1:-1]=1
对于范围内的行(注释形状[0]):
#初始化变量
xc=注释[行][3]
yc=注释[行][4]
Rmax=注释[行][0]
Rmin=注释[行][1]
θ=注释[行][2]
#如果旋转角度超过45度,则交换半径
如果(θ>45):
R=Rmax
Rmax=Rmin
Rmin=R
#矩形边框
#表示矩形的左上角
st=数学sin(θ)
如果st>0,则st=st,否则-st
x0=数学楼层(xc-Rmin*st)
y0=数学楼层(yc-Rmax*st)
#表示矩形的右下角
x1=数学楼层(xc+Rmin*st)
y1=数学楼层(yc+Rmax*st)
#在矩形窗口中裁剪面
掩模[y0:y1,x0:x1]=0
#一旦我们有了一张地图,我们就可以计算每个非人脸像素到最近人脸的距离
dst=cv2.distanceTransform(掩码,cv2.DistanceL1,3)
#距离人脸小于10像素(20//2)的像素不能被视为好的候选像素。如果允许IoU>0,则可以将其放宽为l