C++ OpenCV CUDA C++;C图像灰度

C++ OpenCV CUDA C++;C图像灰度,c++,c,image,opencv,cuda,C++,C,Image,Opencv,Cuda,我是新来的。。。 我需要以下代码方面的帮助。。 我是一名编码初学者。 我正在尝试使用CUDA和openCV将.bmp格式的彩色图像转换为灰度图像 任何人都可以找到我在代码中犯的错误或bug,并帮助我。 我还附加了我使用的输入和我从代码(代码中的图像)中获得的输出(截图-图像名称输出)。。在屏幕截图中,背景中的图像是原始图像。你可以使用任何你想要的图像 #include "cuda_runtime.h" #include <iostream> #include <ctime>

我是新来的。。。 我需要以下代码方面的帮助。。 我是一名编码初学者。 我正在尝试使用CUDA和openCV将.bmp格式的彩色图像转换为灰度图像 任何人都可以找到我在代码中犯的错误或bug,并帮助我。 我还附加了我使用的输入和我从代码(代码中的图像)中获得的输出(截图-图像名称输出)。。在屏幕截图中,背景中的图像是原始图像。你可以使用任何你想要的图像

#include "cuda_runtime.h"
#include <iostream>
#include <ctime>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

__global__ void convertImage(int width, int height, int nchannels, int step, uchar *d_data, int nchannels2, int step2, uchar *d_data2)
{
int i, j, r, g, b, byte, z = 0;
for(i=0; i<height; i++)
    for(j=0; j<width; j++)
    {
        r = d_data[i*step + j*nchannels + 0];
        g = d_data[i*step + j*nchannels + 1];
        b = d_data[i*step + j*nchannels + 2];

        byte = (r+g+b)/3;

        d_data2[i*step2 + j*nchannels2 + 0] = byte;
        d_data2[i*step2 + j*nchannels2 + 1] = byte;
        d_data2[i*step2 + j*nchannels2 + 2] = byte;
    }
}

int main()
{
IplImage *img = cvLoadImage("D://1.bmp", CV_LOAD_IMAGE_COLOR);
int width = img->width;
int height = img->height;
int nchannels = img->nChannels;
int step = img->widthStep;
cout<<"Image 1 : "<<width<<"\t"<<height<<"\t"<<nchannels<<"\t"<<step<<endl;
uchar *data = (uchar*)img->imageData;
uchar *d_data;
int size = sizeof(data);
cudaMalloc(&d_data, size);
cudaMemcpy(d_data, data, size, cudaMemcpyHostToDevice);

IplImage *img2 = cvCreateImage(cvSize(img->height, img->width), IPL_DEPTH_8U, 1);
int width2 = img2->width;
int height2 = img2->height;
int nchannels2 = img2->nChannels;
int step2 = img2->widthStep;
cout<<"Image 2 : "<<width2<<"\t"<<height2<<"\t"<<nchannels2<<"\t"<<step2<<endl;
uchar *data2 = (uchar*)img2->imageData;
uchar *d_data2;
int size2 = sizeof(data2);
cudaMalloc(&d_data2, size2);

long long i;
uchar *temp = data;
convertImage<<<1,1>>>(width, height, nchannels, step, d_data, nchannels2, step2, d_data2);
cudaMemcpy(data2, d_data2, sizeof(data2), cudaMemcpyHostToDevice);

cvNamedWindow("Imagecolor");
cvShowImage("Imagecolor", img);

cvNamedWindow("Gray");
cvShowImage("Gray", img2);

cvWaitKey();

return 0;
}
#包括“cuda_runtime.h”
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
__全局无效转换映像(int-width、int-height、int-nchannels、int-step、uchar*d_数据、int-nchannels2、int-step2、uchar*d_数据2)
{
int i,j,r,g,b,字节,z=0;
对于(i=0;i高;
int nchannels=img->nchannels;
int step=img->widthStep;

通过查看您的代码,我可以指出的一点是,在第二次调用cudaMemcpy(在convertImage之后)时,您应该传入“cudaMemcpyDeviceToHost”作为标志,而不是“cudaMemcpyHostToDevice”。您希望从卡中获取转换后的图像


我不确定这是否就是让您的程序正常运行所需要的全部。

代码有很多问题

1:正在分配的设备内存大小

int size = sizeof(data);
sizeof(data)
将返回当前平台上指针的大小。最有可能是4或8字节。因此,您最多分配8字节的设备内存,并将整个映像复制到其中

图像的实际字节数应计算为:

int size = step * height;

2:第二次调用的方向标志和数据大小
cudaMemcpy
call:

正如在另一份答复中指出的那样

  cudaMemcpy(data2, d_data2, sizeof(data2), cudaMemcpyHostToDevice);
应该是

  cudaMemcpy(data2, d_data2, size2, cudaMemcpyDeviceToHost);
3:输出图像的类型

在内核中,每次迭代都会向输出写入3个值,而输出映像只有一个通道。要么只向输出写入一个值,要么创建具有3个通道的输出映像

创建
img2
时,
cvSize
函数应被称为
cvSize(width,height)
而不是
cvSize(height,width)


此外,内核仅使用一个线程启动,如果映像大小过大,很可能会触发执行超时错误。

这肯定是个错误,谢谢。但我仍然没有得到输出…你能再次帮助我吗?请…我在代码中有另一个错误。@Shubhra你能纠正它吗?请…我已经在感谢中发布了它很多…它工作了…我以前尝试过修改所有东西,除了没有第三个…在最后一点之后你建议它工作了。我在代码中有另一个错误。@sgar91你能纠正它吗请…我已经发布了它
  cudaMemcpy(data2, d_data2, size2, cudaMemcpyDeviceToHost);