CUDAを使用したRGBからグレースケールへの変換

tinman248

そこで、RGB画像をグレースケールに変換するプログラムを作成しようとしています。Udacityの問題セットからアイデアを得ました。問題は、Udacity Web環境でカーネルを書き出すと、コードが機能すると表示されることです。ただし、コンピューターでローカルに書き出そうとすると、エラーは発生しませんが、グレースケールではなく画像が表示されます。完全に灰色になります。ロードした画像のサイズが1つの灰色のボックスのように見えます。コード内のエラーを見つけるのを手伝ってくれませんか。Udacityバージョンと比較しましたが、見つからないようです。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <string>
#include <cuda.h>
#include <stdio.h>
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <iostream>



#define CUDA_ERROR_CHECK

#define CudaSafeCall( err ) __cudaSafeCall( err, __FILE__, __LINE__ )
#define CudaCheckError()    __cudaCheckError( __FILE__, __LINE__ )

inline void __cudaSafeCall(cudaError err, const char *file, const int line)
{
#ifdef CUDA_ERROR_CHECK
    if (cudaSuccess != err)
    {
        fprintf(stderr, "cudaSafeCall() failed at %s:%i : %s\n",
            file, line, cudaGetErrorString(err));
        exit(-1);
    }
#endif

    return;
}

inline void __cudaCheckError(const char *file, const int line)
{
#ifdef CUDA_ERROR_CHECK
    cudaError err = cudaGetLastError();
    if (cudaSuccess != err)
    {
        fprintf(stderr, "cudaCheckError() failed at %s:%i : %s\n",
            file, line, cudaGetErrorString(err));
        exit(-1);
    }


    err = cudaDeviceSynchronize();
    if (cudaSuccess != err)
    {
        fprintf(stderr, "cudaCheckError() with sync failed at %s:%i : %s\n",
            file, line, cudaGetErrorString(err));
        exit(-1);
    }
#endif

    return;
}

__global__ void rgb_2_grey(uchar* const greyImage, const uchar4* const rgbImage, int rows, int columns)
{
    int rgb_x = blockIdx.x * blockDim.x + threadIdx.x; //x coordinate of pixel
    int rgb_y = blockIdx.y * blockDim.y + threadIdx.y; //y coordinate of pixel

    if ((rgb_x >= columns) && (rgb_y >= rows)) {
        return;
    }

    int rgb_ab = rgb_y*columns + rgb_x; //absolute pixel position
    uchar4 rgb_Img = rgbImage[rgb_ab];
    greyImage[rgb_ab] = uchar((float(rgb_Img.x))*0.299f + (float(rgb_Img.y))*0.587f + (float(rgb_Img.z))*0.114f);
}
using namespace cv;
using namespace std;

void Proc_Img(uchar4** h_RGBImage, uchar** h_greyImage, uchar4 **d_RGBImage, uchar** d_greyImage);
void RGB_2_Greyscale(uchar* const d_greyImage, uchar4* const d_RGBImage, size_t num_Rows, size_t num_Cols);
void Save_Img();

Mat img_RGB;
Mat img_Grey;
uchar4 *d_rgbImg;
uchar *d_greyImg; 
int main()
{
        uchar4* h_rgbImg;
        //uchar4* d_rgbImge=0;
        uchar* h_greyImg;
        //uchar* d_greyImge=0;

        Proc_Img(&h_rgbImg, &h_greyImg, &d_rgbImg, &d_greyImg);
        RGB_2_Greyscale(d_greyImg, d_rgbImg, img_RGB.rows, img_RGB.cols);
        Save_Img();





    return 0;
}
void Proc_Img(uchar4** h_RGBImage, uchar** h_greyImage, uchar4 **d_RGBImage, uchar** d_greyImage){
    cudaFree(0);
    CudaCheckError();

    //loads image into a matrix object along with the colors in BGR format (must convert to rgb).
    Mat img = imread("C:\\Users\\Austin\\Pictures\\wallpapers\\IMG_3581.JPG", CV_LOAD_IMAGE_COLOR);
    if (img.empty()){
        cerr << "couldnt open file dumbas..." << "C:\\Users\\Austin\\Pictures\\wallpapers\\IMG_3581.JPG" << endl;
        exit(1);
    }

    //converts color type from BGR to RGB
    cvtColor(img, img_RGB, CV_BGR2RGBA);

    //allocate memory for new greyscale image. 
    //img.rows returns the range of pixels in y, img.cols returns range of pixels in x
    //CV_8UC1 means 8 bit unsigned(non-negative) single channel of color, aka greyscale.
    //all three of the parameters allow the create function in the Mat class to determine how much memory to allocate
    img_Grey.create(img.rows, img.cols, CV_8UC1);

    //creates rgb and greyscale image arrays
    *h_RGBImage = (uchar4*)img_RGB.ptr<uchar>(0); //.ptr is a method in the mat class that returns a pointer to the first element of the matrix.
    *h_greyImage = (uchar*)img_Grey.ptr<uchar>(0);        //this is just like a regular array/pointer mem address to first element of the array. This is templated
                                                          //in this case the compiler runs the function for returning pointer of type unsigned char. for rgb image it is
                                                          //cast to uchar4 struct to hold r,g, and b values.

    const size_t num_pix = (img_RGB.rows) * (img_RGB.cols); //amount of pixels 

    //allocate memory on gpu
    cudaMalloc(d_RGBImage, sizeof(uchar4) * num_pix); //bites of 1 uchar4 times # of pixels gives number of bites necessary for array
    CudaCheckError();
    cudaMalloc(d_greyImage, sizeof(uchar) * num_pix);//bites of uchar times # pixels gives number of bites necessary for array
    CudaCheckError();
    cudaMemset(*d_greyImage, 0, sizeof(uchar) * num_pix);
    CudaCheckError();


    //copy array into allocated space
    cudaMemcpy(*d_RGBImage, *h_RGBImage, sizeof(uchar4)*num_pix, cudaMemcpyHostToDevice);
    CudaCheckError();


    d_rgbImg = *d_RGBImage;
    d_greyImg = *d_greyImage; 
}


void RGB_2_Greyscale(uchar* const d_greyImage, uchar4* const d_RGBImage, size_t num_Rows, size_t num_Cols){

    const int BS = 16;
    const dim3 blockSize(BS, BS);
    const dim3 gridSize((num_Cols / BS) + 1, (num_Rows / BS) + 1); 

    rgb_2_grey <<<gridSize, blockSize>>>(d_greyImage, d_RGBImage, num_Rows, num_Cols);

    cudaDeviceSynchronize(); CudaCheckError();


}



void Save_Img(){

    const size_t num_pix = (img_RGB.rows) * (img_RGB.cols);
    cudaMemcpy(img_Grey.ptr<uchar>(0), d_greyImg, sizeof(uchar)*num_pix, cudaMemcpyDeviceToHost);
    CudaCheckError();


    imwrite("C:\\Users\\Austin\\Pictures\\wallpapers\\IMG_3581GR.JPG", img_Grey);

    cudaFree(d_rgbImg);
    cudaFree(d_greyImg);

}

編集:メインのローカル変数がグローバル変数と同じ名前であることに気付きました。ここでコードを編集しました。ビジュアルスタジオからエラーが発生しました。

変数d_rgbImeは初期化されずに使用されています

上記ですでに初期化したとき。それらをゼロに設定すると、CUDAエラーが発生します。

不正なメモリアクセスが発生しました

cuda-memcheckを実行しようとしましたが、ファイルを実行できなかったというエラーが表示されます...

tinman248

Robert Crovellaのコメントのおかげでエラーが見つかりました。彼はこれに非常に役立ちました!私のカーネルでは、ifステートメントは次のようになります。if ((rgb_x >= columns) || (rgb_y >= rows)) {

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

「標準」RGBからグレースケールへの変換

分類Dev

Python RGBからグレースケールへの変換(ExGG)行列演算

分類Dev

QImage:カラーテーブルを使用してグレースケールからRGBに変換

分類Dev

QImage:カラーテーブルを使用してグレースケールからRGBに変換

分類Dev

画像のピクセル値をRGBからグレースケールに手動で変換しますPythonPIL?

分類Dev

keyDecodingStrategyを使用したスネークケースからキャメルケースへの変換

分類Dev

Android opengl esYUVからシェーダーを使用したRGBへの変換

分類Dev

グレースケールから黒の不透明度への変換

分類Dev

Python を使用して 32*32*3 の RGB 画像を 32*32*1 次元のグレースケールに変換したい

分類Dev

Pythonでユーザー定義の変換関数を使用してグレースケール画像をRGB画像に変換し直す際の問題

分類Dev

OpenCVを使用してRGB画像をグレースケールに変換すると緑色の画像が表示されるのはなぜですか?

分類Dev

BGRからグレースケールへのOpenCVカラー変換でエラーが発生しました

分類Dev

Numpyを使用してRGBピクセル配列をグレースケールに変換する

分類Dev

tfrecordでグレースケールをRGBに変換する

分類Dev

SSISパッケージを使用したcvs列からテーブル列への日付形式の変換?

分類Dev

.pngをグレースケールに変換するcuda

分類Dev

tf.reduce_mean&tf.concatを使用したグレースケール変換

分類Dev

RGBからLαβ色空間への変換とOpenCVを使用したRGBへの変換

分類Dev

重複するグループ名を使用したロングからワイドへの変換

分類Dev

ケースを使用したHiveSQLへのTeradata変換

分類Dev

Java8のストリームとコレクターを使用したコレクションからマップへの変換のカプセル化

分類Dev

ffmpegを使用したFLACからALACへのロスレスオーディオ変換

分類Dev

2つの連結列を使用したMySQLグループ連結からPostgresへの変換

分類Dev

OpenCV cvtColor()はどのグレースケール変換アルゴリズムを使用しますか?

分類Dev

cv2.imread()で画像を読み取り、それをグレースケールに変換しています。しかし、表示したときにグレースケールにならないのはなぜですか?

分類Dev

MySQL ストアド プロシージャを使用した CSV 文字列からテーブルへの変換

分類Dev

グレースケールからARGBへの変換用のC ++ SSE2またはAVX2組み込み関数

分類Dev

Javaストリームを使用したList <String>からStringへの変換

分類Dev

XMLスキーマを使用したXMLからJSONへの変換

Related 関連記事

  1. 1

    「標準」RGBからグレースケールへの変換

  2. 2

    Python RGBからグレースケールへの変換(ExGG)行列演算

  3. 3

    QImage:カラーテーブルを使用してグレースケールからRGBに変換

  4. 4

    QImage:カラーテーブルを使用してグレースケールからRGBに変換

  5. 5

    画像のピクセル値をRGBからグレースケールに手動で変換しますPythonPIL?

  6. 6

    keyDecodingStrategyを使用したスネークケースからキャメルケースへの変換

  7. 7

    Android opengl esYUVからシェーダーを使用したRGBへの変換

  8. 8

    グレースケールから黒の不透明度への変換

  9. 9

    Python を使用して 32*32*3 の RGB 画像を 32*32*1 次元のグレースケールに変換したい

  10. 10

    Pythonでユーザー定義の変換関数を使用してグレースケール画像をRGB画像に変換し直す際の問題

  11. 11

    OpenCVを使用してRGB画像をグレースケールに変換すると緑色の画像が表示されるのはなぜですか?

  12. 12

    BGRからグレースケールへのOpenCVカラー変換でエラーが発生しました

  13. 13

    Numpyを使用してRGBピクセル配列をグレースケールに変換する

  14. 14

    tfrecordでグレースケールをRGBに変換する

  15. 15

    SSISパッケージを使用したcvs列からテーブル列への日付形式の変換?

  16. 16

    .pngをグレースケールに変換するcuda

  17. 17

    tf.reduce_mean&tf.concatを使用したグレースケール変換

  18. 18

    RGBからLαβ色空間への変換とOpenCVを使用したRGBへの変換

  19. 19

    重複するグループ名を使用したロングからワイドへの変換

  20. 20

    ケースを使用したHiveSQLへのTeradata変換

  21. 21

    Java8のストリームとコレクターを使用したコレクションからマップへの変換のカプセル化

  22. 22

    ffmpegを使用したFLACからALACへのロスレスオーディオ変換

  23. 23

    2つの連結列を使用したMySQLグループ連結からPostgresへの変換

  24. 24

    OpenCV cvtColor()はどのグレースケール変換アルゴリズムを使用しますか?

  25. 25

    cv2.imread()で画像を読み取り、それをグレースケールに変換しています。しかし、表示したときにグレースケールにならないのはなぜですか?

  26. 26

    MySQL ストアド プロシージャを使用した CSV 文字列からテーブルへの変換

  27. 27

    グレースケールからARGBへの変換用のC ++ SSE2またはAVX2組み込み関数

  28. 28

    Javaストリームを使用したList <String>からStringへの変換

  29. 29

    XMLスキーマを使用したXMLからJSONへの変換

ホットタグ

アーカイブ