Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CUDA和纹理进行图像减法 我的目标是使用C++与CUDA一起从原始图像中减去暗帧。我想用纹理来加速。图像的输入是cv::Mat,类型为cv_8UC4(我使用指向cv::Mat数据的指针)。这是我提出的内核,但我不知道如何最终将纹理相互减去: __global__ void DarkFrameSubtractionKernel(unsigned char* outputImage, size_t pitchOutputImage, cudaTextureObject_t inputImage, cudaTextureObject_t darkImage, int width, int height) { const int x = blockIdx.x * blockDim.x + threadIdx.x; const int y = blockDim.y * blockIdx.y + threadIdx.y; const float tx = (x + 0.5f); const float ty = (y + 0.5f); if (x >= width || y >= height) return; uchar4 inputImageTemp = tex2D<uchar4>(inputImage, tx, ty); uchar4 darkImageTemp = tex2D<uchar4>(darkImage, tx, ty); outputImage[y * pitchOutputImage + x] = inputImageTemp - darkImageTemp; // this line will throw an error } \uuuuu全局\uuuuuu无效暗帧减法内核(无符号字符*outputImage,size\t pitchOutputImage, cudaTextureObject\u t输入图像、cudaTextureObject\u t暗图像、整型宽度、整型高度) { 常量int x=blockIdx.x*blockDim.x+threadIdx.x; const int y=blockDim.y*blockIdx.y+threadIdx.y; 常数浮点tx=(x+0.5f); 常数浮点ty=(y+0.5f); 如果(x>=宽度| y>=高度)返回; uchar4 inputImageTemp=tex2D(inputImage,tx,ty); uchar4 darkImageTemp=tex2D(德克萨斯州darkImage); outputImage[y*pitchOutputImage+x]=inputImageTemp-darkImageTemp;//此行将抛出一个错误 }_C++_Opencv_Cuda - Fatal编程技术网

使用CUDA和纹理进行图像减法 我的目标是使用C++与CUDA一起从原始图像中减去暗帧。我想用纹理来加速。图像的输入是cv::Mat,类型为cv_8UC4(我使用指向cv::Mat数据的指针)。这是我提出的内核,但我不知道如何最终将纹理相互减去: __global__ void DarkFrameSubtractionKernel(unsigned char* outputImage, size_t pitchOutputImage, cudaTextureObject_t inputImage, cudaTextureObject_t darkImage, int width, int height) { const int x = blockIdx.x * blockDim.x + threadIdx.x; const int y = blockDim.y * blockIdx.y + threadIdx.y; const float tx = (x + 0.5f); const float ty = (y + 0.5f); if (x >= width || y >= height) return; uchar4 inputImageTemp = tex2D<uchar4>(inputImage, tx, ty); uchar4 darkImageTemp = tex2D<uchar4>(darkImage, tx, ty); outputImage[y * pitchOutputImage + x] = inputImageTemp - darkImageTemp; // this line will throw an error } \uuuuu全局\uuuuuu无效暗帧减法内核(无符号字符*outputImage,size\t pitchOutputImage, cudaTextureObject\u t输入图像、cudaTextureObject\u t暗图像、整型宽度、整型高度) { 常量int x=blockIdx.x*blockDim.x+threadIdx.x; const int y=blockDim.y*blockIdx.y+threadIdx.y; 常数浮点tx=(x+0.5f); 常数浮点ty=(y+0.5f); 如果(x>=宽度| y>=高度)返回; uchar4 inputImageTemp=tex2D(inputImage,tx,ty); uchar4 darkImageTemp=tex2D(德克萨斯州darkImage); outputImage[y*pitchOutputImage+x]=inputImageTemp-darkImageTemp;//此行将抛出一个错误 }

使用CUDA和纹理进行图像减法 我的目标是使用C++与CUDA一起从原始图像中减去暗帧。我想用纹理来加速。图像的输入是cv::Mat,类型为cv_8UC4(我使用指向cv::Mat数据的指针)。这是我提出的内核,但我不知道如何最终将纹理相互减去: __global__ void DarkFrameSubtractionKernel(unsigned char* outputImage, size_t pitchOutputImage, cudaTextureObject_t inputImage, cudaTextureObject_t darkImage, int width, int height) { const int x = blockIdx.x * blockDim.x + threadIdx.x; const int y = blockDim.y * blockIdx.y + threadIdx.y; const float tx = (x + 0.5f); const float ty = (y + 0.5f); if (x >= width || y >= height) return; uchar4 inputImageTemp = tex2D<uchar4>(inputImage, tx, ty); uchar4 darkImageTemp = tex2D<uchar4>(darkImage, tx, ty); outputImage[y * pitchOutputImage + x] = inputImageTemp - darkImageTemp; // this line will throw an error } \uuuuu全局\uuuuuu无效暗帧减法内核(无符号字符*outputImage,size\t pitchOutputImage, cudaTextureObject\u t输入图像、cudaTextureObject\u t暗图像、整型宽度、整型高度) { 常量int x=blockIdx.x*blockDim.x+threadIdx.x; const int y=blockDim.y*blockIdx.y+threadIdx.y; 常数浮点tx=(x+0.5f); 常数浮点ty=(y+0.5f); 如果(x>=宽度| y>=高度)返回; uchar4 inputImageTemp=tex2D(inputImage,tx,ty); uchar4 darkImageTemp=tex2D(德克萨斯州darkImage); outputImage[y*pitchOutputImage+x]=inputImageTemp-darkImageTemp;//此行将抛出一个错误 },c++,opencv,cuda,C++,Opencv,Cuda,这是调用内核的函数(您可以看到我从unsigned char创建纹理): void subtractDarkImage(无符号字符*inputImage,大小\u t pitchInputImage,无符号字符*outputImage, 大小\u t pitchOutputImage,无符号字符*darkImage,大小\u t pitchDarkImage,整数宽度,整数高度, cudaStream_t stream) { cudaResourceDesc resDesc={}; resDes

这是调用内核的函数(您可以看到我从unsigned char创建纹理):

void subtractDarkImage(无符号字符*inputImage,大小\u t pitchInputImage,无符号字符*outputImage,
大小\u t pitchOutputImage,无符号字符*darkImage,大小\u t pitchDarkImage,整数宽度,整数高度,
cudaStream_t stream)
{
cudaResourceDesc resDesc={};
resDesc.resType=cudaResourceTypePitch2D;
resDesc.res.pitch2D.width=宽度;
resDesc.res.pitch2D.height=高度;
resDesc.res.pitch2D.devPtr=inputImage;
resDesc.res.pitch2D.pitchInBytes=pitchInputImage;
resDesc.res.pitch2D.desc=cudaCreateChannelDesc(8,8,8,8,cudaChannelFormatKindUnsigned);
cudaTextureDesc texDesc={};
texDesc.readMode=cudaReadModeElementType;
texDesc.addressMode[0]=cudaAddressModeBorder;
texDesc.addressMode[1]=cudaAddressModeBorder;
cudaTextureObject_t ImageInputEx、imageDarkTex;
CUDA_检查(cudaCreateTextureObject(&imageInputEx,&resDesc,&texDesc,0));
resDesc.res.pitch2D.devPtr=darkImage;
resDesc.res.pitch2D.pitchInBytes=pitchDarkImage;
CUDA_检查(cudaCreateTextureObject(&imageDarkTex,&resDesc,&texDesc,0));
dim3块(32,8);
dim3网格=paddedGrid(block.x、block.y、宽度、高度);
DarkimageDepationKernel>(重新解释投射(输出图像),pitchOutputImage/sizeof(uchar4),
ImageInputEx、imageDarkTex、宽度、高度);
CUDA_检查(cudaDestroyTextureObject(ImageInputEx));
CUDA_检查(cudaDestroyTextureObject(imageDarkTex));
}
代码没有编译,因为我不能从另一个uchar4中减去一个uchar4(在内核中)。这里有简单的减法吗

非常感谢您的帮助

这里有简单的减法吗

没有为CUDA内置向量类型定义算术运算符。如果你更换

outputImage[y * pitchOutputImage + x] = inputImageTemp - darkImageTemp;


事情会成功的。如果这让您不舒服,我建议编写一个小的帮助函数库来隐藏混乱。

错误是什么?Visual Studio显示:没有运算符“-”匹配这些操作数;操作数类型为:uchar4-uchar4这是一个非常简单的错误。除了为任何CUDA内置向量类型定义的赋值之外,没有其他运算符谢谢。我刚刚研究了uchar4的定义,发现它是由4个单无符号字符组成的结构。再次非常感谢!我不想吹毛求疵,但uchar4的第四个值是“w”而不是“h”(至少在我的系统上是这样)。@GreenCoder:这是我的错别字
outputImage[y * pitchOutputImage + x] = inputImageTemp - darkImageTemp;
uchar4 val;
val.x = inputImageTemp.x - darkImageTemp.x;
val.y = inputImageTemp.y - darkImageTemp.y;
val.z = inputImageTemp.z - darkImageTemp.z;
val.w = inputImageTemp.w - darkImageTemp.w;
outputImage[y * pitchOutputImage + x] = val;