c++ - OpenCV CUDA C++ C 图像灰色

标签 c++ c image opencv cuda

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

#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;
}

enter image description here

最佳答案

代码有很多问题!

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

int size = sizeof(data);

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

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

int size = step * height;

int size2 = step2 * height2;

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

正如另一个答案所指出的...

  cudaMemcpy(data2, d_data2, sizeof(data2), cudaMemcpyHostToDevice);

应该是

  cudaMemcpy(data2, d_data2, size2, cudaMemcpyDeviceToHost);

3:输出图片类型

在内核中,每次迭代将 3 个值写入输出,而输出图像只有一个 channel 。要么只向输出写入一个值,要么创建具有 3 个 channel 的输出图像。

在创建 时,cvSize 函数应该被调用为 cvSize(width,height) 而不是 cvSize(height, width) img2.

此外,内核仅以 1 个线程启动,如果图像尺寸较大,很可能会触发执行超时错误。

关于c++ - OpenCV CUDA C++ C 图像灰色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22843689/

相关文章:

c++ - 检查另一个进程中的线程是否正在休眠

c - 在这种情况下,如何将 double 归因于 int 呢?

C、虽然不起作用,

连接 2 个矩阵

php - 在 HTML 中以 SVG 格式显示图像

c++ - 理想的缓冲区大小是多少?

c++:将其所有参数连接为字符串的函数

javascript - SetVisibleRect 使图像困惑(gwt)

c++ - 从 C++ 中的析构函数中恢复对象?

css - 这个图像按钮可以在 CSS 跨浏览器中重现吗?