通过python打开OpenCV:有一种快速的方法可以将一组矩形外的像素归零吗?

时间:2012-07-15 13:14:24

标签: python opencv

我有一张脸的图像,我用haar级联来检测嘴,鼻子和每只眼睛的位置(x,y,宽度,高度)。我想将这些区域外的所有像素设置为零。这样做的最快(计算)方式是什么?我最终会实时对视频帧进行操作。

2 个答案:

答案 0 :(得分:17)

我不知道这是否是最快的方式,但这是一种方法。

创建一个面部区域为白色的蒙版图像,然后将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)

对于尺寸为400x300的图像,我的系统(核心i5,4GB RAM)需要0.16 ms

编辑 - 更好的方法:您不需要像上面那样做。只需创建一个零图像,然后将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而不是上述参数。

结果:

输入图片:

enter image description here

输出:

enter image description here

答案 1 :(得分:0)

如果要创建多边形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)