我有一张脸的图像,我使用 haar 级联来检测嘴巴、鼻子和每只眼睛的位置(x、y、宽度、高度)。我想将这些区域之外的所有像素设置为零。最快(计算)的方法是什么?我最终会实时处理视频帧。
问问题
16296 次
2 回答
22
我不知道这是否是最快的方法,但这是一种方法。
创建一个面部区域为白色的蒙版图像,然后对原始图像和蒙版图像应用 bitwise_and 函数。
x = y = 30
w = h = 100
mask = np.zeros(img.shape[:2],np.uint8)
mask[y:y+h,x:x+w] = 255
res = cv2.bitwise_and(img,img,mask = mask)
它0.16 ms
在我的系统(核心 i5,4GB RAM)中获取大小为 400x300 的图像
编辑 - 更好的方法:你不需要像上面那样做。只需创建一个零图像,然后将 ROI 从原始图像复制到零图像。就这样。
mask = np.zeros(img.shape,np.uint8)
mask[y:y+h,x:x+w] = img[y:y+h,x:x+w]
它仅0.032 ms
在我的系统中接受上述参数,5 times faster
而不是上述参数。
结果 :
输入图像:
输出 :
于 2012-07-15T13:46:09.653 回答
2
如果要制作多边形 ROI。创建多边形并为其制作蒙版。将图像与创建的帧相乘。
ret,frame = cv2.imread()
xr=1
yr=1
# y,x
pts = np.array([[int(112*yr),int(32*xr)],[int(0*yr),int(623*xr)],[int(789*yr),int(628*xr)],[int(381*yr),int(4*xr)]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(frame,[pts],True,(0,255,255))
mask = np.zeros(frame.shape[:2],np.uint8)
cv2.fillPoly(mask,[pts],(255,255,255))
frame = cv2.bitwise_and(frame,frame,mask = mask)
cv2.imshow("masked frame", frame)
于 2020-02-20T09:11:18.250 回答