python下使用TPS进行变换

python下使用TPS进行变换_第1张图片

import cv2
import numpy as np
import random
# 首先读入img
img = cv2.imread('0000003.jpg')
label = open('0000003.txt','r',encoding='utf8')

lines = label.readlines()

for line in lines:
    points=[]
    point_ = line.split(',')[0:-1]
    for i in range(len(point_)//2):
        points.append((int(point_[2*i]),int(point_[2*i+1])))
    x,y,w,h = cv2.boundingRect(np.array(points))
    roi_img = img[y:y+h,x:x+w]
    cv2.imshow('roi_img',roi_img)
    cv2.waitKey()
    # 画上绿色的圆圈
    for i in range(len(points)):
        points[i] = (points[i][0]-x,points[i][1]-y)
    for point in points:
        cv2.circle(roi_img, point, 1, (0, 255, 0), 2)

        cv2.imshow('img',roi_img)
        cv2.waitKey()

    tps = cv2.createThinPlateSplineShapeTransformer()

    sourceshape = np.array(points,np.int32)
    sourceshape = sourceshape.reshape(1,-1,2)
    
    matches =[]
    N = len(points)
    for i in range(0,N):
        matches.append(cv2.DMatch(i,i,0))

    # 开始变动
    newpoints=[]
    N = N//2
    dx=int(w/(N-1))
    for i in range(0,N):
        newpoints.append((dx*i,2))
    for i in range(N-1,-1,-1):
        newpoints.append((dx*i,h-2))

    print(points,newpoints)
    targetshape = np.array(newpoints,np.int32)
    targetshape=targetshape.reshape(1,-1,2)
    tps.estimateTransformation(targetshape,sourceshape ,matches)
    roi_img_=tps.warpImage(roi_img)

    for point in newpoints:
        cv2.circle(roi_img_, (int(point[0]),int(point[1])), 1, (0, 0, 255), 2)

    cv2.namedWindow('img2',cv2.WINDOW_FREERATIO)
    cv2.imshow('img2',roi_img_)
    cv2.waitKey()

 

你可能感兴趣的:(python,opncv)