【问题标题】:OpenCV detecting a face, cropping a profile, programmatically marking and removing background with grabCutOpenCV 检测人脸、裁剪轮廓、使用 grabCut 以编程方式标记和移除背景
【发布时间】:2019-08-09 07:20:40
【问题描述】:

给定一个random picture,我成功地检测到一张脸并裁剪出计算出的投资回报率。我要实现的下一件事是删除我目前卡住的背景。

我正在尝试操纵grabcut.py 以编程方式标记背景和前景,以便使用grabCut()GC_WITH_INIT_MASK 获得更好的结果

import cv2 as cv
import numpy as np

img = cv.imread('./man.jpeg', cv.IMREAD_UNCHANGED)

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

profile = cv.CascadeClassifier('/usr/local/Cellar/opencv/4.1.0_2/share/opencv4/haarcascades/haarcascade_frontalface_default.xml')

faces = profile.detectMultiScale(gray, 1.3, 5)

print(len(faces))

if len(faces) > 1 or len(faces) == 0:
  print('more than one or zero found')
  exit()

for (x, y, w, h) in faces:
  y1 = int(y - h/2)
  y2 = int(y + h*2)
  x1 = int(x - w/2)
  x2 = int(x + w*2)
  //TODO: check if dimensions outside original img
  cropped = img[y1:y2, x1:x2]

//estimate marking sections which are BG and FG
cv.line(cropped, (int(cropped.shape[0]/6), 0), (int(cropped.shape[0]/6), int(cropped.shape[1]/3)), (0), 5)
cv.line(cropped, (int(cropped.shape[0]), 0), (int(cropped.shape[0] - cropped.shape[0]/4), int(cropped.shape[1]/3)), (0), 5)
cv.line(cropped, (int(cropped.shape[0]/6), int(cropped.shape[1] - cropped.shape[1]/6)), (int(cropped.shape[0] - cropped.shape[0]/6*2), int(cropped.shape[1] - cropped.shape[1]/6)), (255), 5)

mask = np.zeros(cropped.shape[:2], np.uint8)

bgModel = np.zeros((1, 65), np.float64) 
fgModel = np.zeros((1, 65), np.float64)

//getting an error of incorrect indicies?
#mask[cropped == 0] = 0
#mask[cropped == 255] = 1

cv.grabCut(cropped, mask, None, bgModel, fgModel, 5, cv.GC_INIT_WITH_MASK)

//tried both...second from grabcut.py
#mask2 = np.where((mask==2) | (mask==0), 0, 1).astype('uint8')
mask2 = np.where((mask==1) + (mask==3), 255, 0).astype('uint8')

output = cv.bitwise_and(cropped, cropped, mask=mask2)

cv.imshow('img', output)
cv.waitKey(0)
cv.destroyAllWindows()

现在我得到 error: (-215:Assertion failed) !bgdSamples.empty() && !fgdSamples.empty() in function 'initGMMs'

这基本上是许多不同教程、试验和错误的集合。我将其用作学习经验,因此将不胜感激任何指导。提前致谢!

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    你可以试试

    gray = cv2.cvtColor(cropped, cv2.COLOR_BGR2GRAY)
    mask[gray == 0] = 0
    mask[gray == 255] = 1
    

    我想也许cv.GC_INIT_WITH_MASK模式下掩码不应该为空

    【讨论】:

    • cv.imgshow('img', cropped) 并显示图像......正如我所说,我还在学习。其他一切似乎都应该正常工作吗? bgmodel 和 fgmodel 不能为空是什么意思?我看到的所有地方都用np.zeros 初始化,所以全为零。
    • 当我取消注释时,我收到mask[cropped == 0] = 0 IndexError: too many indices for array 的错误。 print(cropped) 产生 (665, 665, 3) 和 print(mask) 产生 (665, 665)。 cropped.ndim = 3 和 mask.ndim = 2。这是问题吗?如果是这样,解决方法是什么?
    • 这应该修复裁剪的是具有三个维度的 rgb 图像。您可以查看此网页了解更多详情:docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html
    • 该部分已修复,现在错误为(-215:Assertion failed) N >= K in function 'kmeans'。发现这是潜在的解决方法? github.com/opencv/opencv/blob/master/modules/core/src/…
    • 我建议你使用调试模式来看看这个graph-cut算法如何选择k(也不要看github,因为它在master分支而不是你本地版本的opencv)。此消息表示不会生成 k 簇,因为您的样本量小于 k
    猜你喜欢
    • 2016-10-29
    • 2016-01-01
    • 1970-01-01
    • 2019-12-06
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2013-01-23
    相关资源
    最近更新 更多