You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python OpenCV CUDA拼接图像?新手遇语法问题求助

OpenCV CUDA 2x2图像拼接问题修正

错误原因

  • GpuMat初始化错误:cv2.cuda_GpuMat(2, 2)的写法完全错误,该构造函数需要传入图像高度、宽度、数据类型,而非行列数。拼接后的GpuMat尺寸应根据输入图像计算(如2倍原图高×2倍原图宽)。
  • copyTo调用逻辑颠倒:copyTo是将当前GpuMat的内容复制到目标GpuMat,正确调用应为源GpuMat.copyTo(目标GpuMat, ...),你搞反了源和目标。
  • 目标区域指定错误:需要使用cv2.cuda.Rect定义复制的目标位置与尺寸,不能直接传入坐标元组。

修正后的代码

import cv2

# 读取图像(确保四张图尺寸相同)
image01 = cv2.imread('img1.png')
image02 = cv2.imread('img2.png')
image03 = cv2.imread('img3.png')
image04 = cv2.imread('img4.png')

# 检查所有图像尺寸是否一致
h, w = image01.shape[:2]
for img in [image02, image03, image04]:
    if img.shape[:2] != (h, w):
        raise ValueError("所有输入图像必须具有相同的尺寸")

# 将图像上传到GPU
gpu_image01 = cv2.cuda_GpuMat()
gpu_image02 = cv2.cuda_GpuMat()
gpu_image03 = cv2.cuda_GpuMat()
gpu_image04 = cv2.cuda_GpuMat()

gpu_image01.upload(image01)
gpu_image02.upload(image02)
gpu_image03.upload(image03)
gpu_image04.upload(image04)

# 创建拼接后的GPU图像:高度2h,宽度2w,数据类型与原图一致
new_image = cv2.cuda_GpuMat(2*h, 2*w, image01.dtype)

# 将每张图复制到对应区域
# 第一行第一列(左上角)
gpu_image01.copyTo(new_image, None, cv2.cuda.Rect(0, 0, w, h))
# 第一行第二列(右上角)
gpu_image02.copyTo(new_image, None, cv2.cuda.Rect(w, 0, w, h))
# 第二行第一列(左下角)
gpu_image03.copyTo(new_image, None, cv2.cuda.Rect(0, h, w, h))
# 第二行第二列(右下角)
gpu_image04.copyTo(new_image, None, cv2.cuda.Rect(w, h, w, h))

# 将拼接结果下载到CPU
result = new_image.download()

# 可选:保存或显示结果
cv2.imwrite('拼接结果.png', result)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键说明

  • GpuMat初始化:cv2.cuda_GpuMat(高度, 宽度, 数据类型),这里用2倍原图高度和宽度,确保能容纳四张图像。
  • copyTo参数:源.copyTo(目标, 掩码, 目标区域),掩码传None表示无遮罩,目标区域用cv2.cuda.Rect(x, y, 宽, 高)定义,x为横向偏移,y为纵向偏移。
  • 尺寸检查:提前验证输入图像尺寸一致,避免拼接后出现错位或运行错误。

内容的提问来源于stack exchange,提问作者JanneI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:55:15