调整在Python中使用Numpy和OpenCV绘制的多边形的大小

问题描述 投票:0回答:1

我使用dlib和OpenCV作为一个形状(1, 13, 2)的numpy数组读取面部地标的外唇多边形

现在,我不想绘制这个多边形,而是绘制这个多边形的缩放版本,比如增加2倍,然后绘制到黑色图像上。

我遇到了cv2.resize(),但似乎接受了缩放图像。直接给cv.resize()提供numpy数组点给出了这个错误:

OpenCV错误:cv :: hal :: resize中的断言失败(func!= 0)

那么,我的问题是,如何先缩放再绘制?我是否必须手动选择上半部并平移点并分别平移下半部,因为两者都需要在不同方向上平移。或者有什么方法可以直接使用cv2.resize

python numpy opencv
1个回答
0
投票
def scale(image, coords):
    '''
    image: cv2 image
    corods: e.g. [(ax, ay), (bx, by), (cx, cy), (dx, dy)]
    '''
    scale = 2
    ow, oh, och = image.shape

    scaled_img = cv2.resize(image,None,fx=scale,fy=scale)
    w, h, ch = scaled_img.shape
    M = cv2.getAffineTransform(np.float32([[ow, 0], [ow, oh], [0, oh]]), np.float32([[w, 0], [w, h], [0, h]]))
    newpointlist = []

    npcoords = np.array([coords], np.int32)
    scaledpoints = cv2.transform(npcoords,M)
    for p in scaledpoints[0]:
        newpointlist.append(p)

    #debugging pics
    for point in newpointlist:
        cv2.circle(scaled_img, (int(point[0]), int(point[1])), 5, (0,0,255), -1)

    cv2.imshow('img', scaled_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

像这样的东西可以工作。我用它来缩放图像和图像中的某些点。

© www.soinside.com 2019 - 2024. All rights reserved.