如何用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
相关产品推荐
相关产品推荐

