pytorch实现图像投影变换

python 复制代码
import cv2
import torch


def cpu_remap(numpy_img,mapx,mapy):
    return cv2.remap(numpy_img,mapx,mapy,cv2.INTER_LINEAR)

def gpu_remap(numpy_img,map_tensor):
    '''
    numpy_img:原始图像格式为ndarray
    map_tensor:[N,H,W,C]用于grid_sample的map参数,需要规制到-1到1
    '''
    # 准备图像数据
    img_tensor = torch.from_numpy(numpy_img).contiguous().cuda(non_blocking=True)
    img_tensor = img_tensor.permute(2,0,1).unsqueeze(0).cuda().float()
    res = torch.nn.functional.grid_sample(img_tensor,map_tensor,
                                          mode='bilinear',
                                          padding_mode='zeros',
                                          align_corners=None)
    res = res.char()
    res = res[0].permute(1,2,0)
    res = res.cpu()
    res = res.numpy()
    res = np.uint8(res)
    return res
@profile
def main():
   #已知单应矩阵(投影矩阵M)
   M=np.asarray([[-5.23249213e+00, -2.83428439e+01,  2.74163372e+03],
       [-2.71994329e+00, -2.52929752e+01,  1.13544900e+04],
       [-1.38531350e-04, -1.40379841e-02,  1.00000000e+00]])
   
   
   img_revise = cv2.imread('206_revise.jpg') # 无畸变的图像
   img_perspect = cv2.warpPerspective(img_revise, M, (2800, 1500), borderValue=0)
   cv2.imwrite('warpPerspective.jpg',img_perspect)

   x, y = np.meshgrid(np.arange(2800), np.arange(1500))
   grid = np.vstack([x.flatten(),y.flatten(),np.ones(y.flatten().shape)])
   grid_trans = np.linalg.inv(M)@grid
   grid_trans = grid_trans/grid_trans[2]
   grid_trans = grid_trans[:2]
   mapx = np.float32(np.reshape(grid_trans[0],[1500,2800]))#/1920*2-1
   mapy = np.float32(np.reshape(grid_trans[1],[1500,2800]))#/1080*2-1
   print(mapx.shape)
   img_perspcet = cpu_remap(img_revise,mapx,mapy)
   cv2.imwrite('cpu_remap.jpg',img_perspect)

   grid_trans_x = torch.from_numpy(mapx).unsqueeze(2)/1920*2-1
   grid_trans_y = torch.from_numpy(mapy).unsqueeze(2)/1080*2-1
   map_tensor = torch.cat([grid_trans_x,grid_trans_y],2).unsqueeze(0).float().cuda()
   img_perspect = gpu_remap(img_revise,map_tensor)
   cv2.imwrite('gpu_remap.jpg',img_perspect)
if __name__=='__main__':
    main()

还是那个问题,数据在cpu->GPU拷贝时会慢,单GPU的计算耗时很短

相关推荐
Dawson Zhu12 小时前
智能体记忆系统:原理解析与工程实践
人工智能·语言模型·架构·aigc·agi
具身AGI12 小时前
ARR还是交付量,物理AI 国产 的三种收入口径
大数据·人工智能
xianghongtao011612 小时前
AI重塑财务的真正难题_德勤未来财务报告深度解读_CSDN
人工智能
AC赳赳老秦12 小时前
OpenClaw 数据引用规范自动生成:为公开数据构建可信来源标注与标准引用体系
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
xx_xxxxx_12 小时前
论文阅读-RoTTA
论文阅读·人工智能·深度学习·机器学习
孙启超12 小时前
【FDE开发指南】第 1 课:认识 FDE —— 从一次生产事故说起
人工智能·ai·职场技能
乐迪信息12 小时前
AI防爆摄像机,监测港口船舶航行偏航隐患
大数据·人工智能·深度学习·算法·计算机视觉
悟天特斯12 小时前
安防一体化:从“孤岛式监控“到“全域联动“的楼宇安全体系
人工智能·安全
知几蜗牛12 小时前
Python接入Gemini 3.8 Flash实现票据视觉抽取与规则校验
人工智能
云卷云舒___________12 小时前
Qwen 4首测泄露!DeepSeek V4 mini展示名为flash?蚂蚁Ling-3.1-flash同步炸场 | 10月1日 AI日报
人工智能·开源模型·deepseek·ai日报·qwen4·ling31flash·蚂蚁百灵