python实现图片的大小变换之后图片中的目标坐标一起等比例变换

目录

1.坐标值变换

(1)关键

(2)坐标变换完整实现


提示:由于我们要训练的网络模型输入的尺寸一般都是自己根据实际情况规定的,但当我们使用迁移学习的时候,我们使用的是预训练的模型,所以输入网络图片的大小必须和预训练模型要求的图片大小一致,但是我们在使用labelimg标注图像中的目标时,得到的坐标值是相对于当前原图的坐标值,但是当图片的大小发生变换之后,那么坐标值也必须发生相应的变换,所以基于上面这种情况使用python实现坐标值的转换。

LabelImg标注的YOLO格式txt标签中心坐标和物体边界框长宽的转换

使用python修改文件名并保存

1.坐标值变换

由于这里是基于上一篇文章:LabelImg标注的YOLO格式txt标签中心坐标和物体边界框长宽的转换。使用labelimg标注一张图片之后得到一个.txt文件,并且关于怎么将.txt文件中的0-1坐标相对值转换到正常的坐标值已经在上面一篇文章详解,这里介绍怎么将坐标值转转为图片缩放之后的坐标值。

(1)关键

#计算原图与变换后的图(224x224)进行高宽和比例计算
    ratio_w=float(224/w*1.0)
    ratio_h=float(224/h*1.0)
#缩放图片之后的坐标变换结果
    xmin_ratio=ratio_w*xmin
    xmax_ratio=ratio_w*xmax
    ymin_ratio=ratio_h*ymin
    ymax_ratio=ratio_h*ymax

(2)坐标变换完整实现

提示:由于我要变换的坐标值是存放在一个.txt文件中的 :

"""
@Author : Keep_Trying_Go
@Major  : Computer Science and Technology
@Hobby  : Computer Vision
@Time   : 2023-01-03 7:26
"""

#将一张图片为640x480=>224x224并且其中对图像中的坐标进行变换
def equalScaleImage(img_path, txt_path):
    """
    :param img_path: 图片文件的路径
    :param txt_path: 坐标文件的路径
    :return:
    """
    img = cv2.imread(img_path)
    # 获取图片的高宽
    h, w, _ = img.shape
    #计算原图与变换后的图(224x224)进行高宽和比例计算
    ratio_w=float(224/w*1.0)
    ratio_h=float(224/h*1.0)

    print(ratio_w)
    print(ratio_h)

    # 读取TXT文件 中的中心坐标和框大小
    with open(txt_path, "r") as fp:
        # 以空格划分
        contline = fp.readline().split(' ')
        # contline : class  x_center y_center width height
        print(contline)
    # 计算框的左上角坐标和右下角坐标,使用strip将首尾空格去掉
    xmin = float((contline[1]).strip())
    xmax = float(contline[2].strip())
    ymin = float(contline[3].strip())
    ymax = float(contline[4].strip())

    print((xmin,ymin))
    print((xmax,ymax))

    #缩放图片之后的坐标变换结果
    xmin_ratio=ratio_w*xmin
    xmax_ratio=ratio_w*xmax
    ymin_ratio=ratio_h*ymin
    ymax_ratio=ratio_h*ymax

    print((xmin_ratio,ymin_ratio))
    print((xmax_ratio,ymax_ratio))

    # 返回:类别,xleft,yleft,xright,yright
    return (xmin_ratio,xmax_ratio,ymin_ratio,ymax_ratio)

绘制框:

def draw(img_path,tupelist):
    img = cv2.imread(img_path)
    # 将图片从(640,480)=>(224,224)
    newImg = cv2.resize(img, (224, 224))

    xmin=tupelist[0]
    xmax=tupelist[1]
    ymin=tupelist[2]
    ymax=tupelist[3]
    cv2.rectangle(newImg,(int(xmin),int(ymin)),(int(xmax),int(ymax)),(255,0,255),2)

    cv2.imshow('newimg',newImg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    tupeList=equalScaleImage(img_path='data/0.png',txt_path='data/000_0.txt')
    draw(img_path='data/0.png',tupelist=tupeList)

猜你喜欢

转载自blog.csdn.net/Keep_Trying_Go/article/details/128527401