【问题标题】:OpenCV CUDA C++ C Image GrayOpenCV CUDA C++ C 图像灰色
【发布时间】:2014-05-15 15:20:22
【问题描述】:

我是新来的... 我需要以下代码中的帮助.. 我是编码的初学者。 我正在尝试使用 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;
}

【问题讨论】:

    标签: c++ c image opencv cuda


    【解决方案1】:

    通过查看您的代码,我可以指出的一件事是,在对 cudaMemcpy 的第二次调用中(在 convertImage 之后),您应该将“cudaMemcpyDeviceToHost”作为标志传递,而不是“cudaMemcpyHostToDevice”。您想从卡中取回转换后的图像。

    我不确定这是否足以让您的程序正常运行。

    【讨论】:

    • 那肯定是个错误,谢谢。但是我仍然没有得到输出...你能再帮我一次吗...
    • 我在那个代码中有另一个错误..@Shubhra 你能纠正它吗...我已经把它发布在ling
    【解决方案2】:

    代码有很多问题!

    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 个值写入输出,而输出图像只有一个通道。要么只将一个值写入输出,要么创建具有 3 个通道的输出图像。

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

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

    【讨论】:

    • 非常感谢......它工作......我之前尝试修改所有内容,除了没有第三个......在你建议的最后一点之后。
    • 我在那个代码中有另一个错误..@sgar91 你能纠正它吗...我已经把它发布在ling
    猜你喜欢
    • 2019-03-04
    • 2013-01-12
    • 2016-09-03
    • 2021-03-16
    • 2012-05-28
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多