在没有任何外部库的情况下获取图像的一部分,然后是该正方形的中心?

Get a section of an image, and then the center of that square, without any external libraries?

我正在做一个需要我提取人脸的项目:

我已经用 dlib 做到了。下一步是从该区域提取关键点并存储它们。问题是我无法提取该区域。

我正在使用 OpenCV 的子矩形函数:

for k, d in enumerate(dets):

    a = d.left()
    b = d.top()
    c = d.right()
    d = d.bottom()

    print ("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(k, a, b, c, d))
#   showImg(img1, "Image")

    temp1 = img1
    cv2.rectangle(temp1, (a, b), (c, d), (255, 0, 0), 2)
#   showImg(temp1, "Face")

    aa = a
    print ("Selection Size: " + str(aa))


#   x1 = (a, b)
#   x2 = (d, b)
#   y1 = (a, d)
#   y2 = (c, d)
#   r, z = (x1+x2/2, y1+y2/2)

    x = ((a+d)/2)
    y = ((b+c)/2)

    temp2 = cv2.getRectSubPix(img1, (aa,aa), (x,y))
    showImg(temp2, "Face Image")

尽管阅读了多本几何和微积分教程,但我还是无法正确理解数学。它总是显得太小,或偏离中心。我终于断定它需要考虑整个图像,而不仅仅是框架:

但这也不准确,底角是图像,而不是框架中心。

为了让它变得更难,我必须使用cv2.getRectSubPix。我的 numpy 有问题,无法正确处理图片,PIL/Pillow/PythonImageLybrary 给我安装问题。它必须全部在 OpenCV 中。

谁能帮我解决这个问题?

如果你不能使用 numpy 切片,你应该修复你的代码:

这是您的主要错误:

x = ((a+d)/2)
y = ((b+c)/2)

等于:

x = ((left+bottom)/2)
y = ((top+right)/2)

还有一个错误是重新声明变量 'd',最初 'detection rect' 变成 'bottom'

因此解决方案可能如下所示:

c = d.center();
center = (c.x, c.y)
patch_size = (d.width(), d.height())
cv2.rectangle(temp1, patch_size, center, (255, 0, 0), 2)