2016-08-17 1 views
-2

Il y a une différence très petite mais reconnaissable entre ma multiplication régulière et cuda de l'image. L'image régulière est un peu plus légère.Pourquoi y a-t-il une différence très petite mais reconnaissable entre ma multiplication régulière et cuda de l'image?

principale part de la fonction:

Mat im1 = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
int size = im1.rows * im1.cols; 
int i = 0; 
uint8_t * d_a; 
im1 = im1 * 3; //this made image a little lighter comparatively. 
imshow("Original", im1); 

cudaMalloc(&d_a, sizeof(uint8_t)*size); 
cudaMemcpy(d_a, &im1.data[0], sizeof(uint8_t)*size, cudaMemcpyHostToDevice); 

dim3 threadsPerBlock(im1.cols); 
dim3 numBlocks(im1.rows); 


colonal << <numBlocks, threadsPerBlock >> >(d_a); 
cudaMemcpy(&im1.data[0], d_a, sizeof(uint8_t)*size, cudaMemcpyDeviceToHost); 

cudaFree(d_a); 

imshow("new", im1); 
waitKey(); 

Voici le noyau:

__global__ 
void colonal(uint8_t * a) 
{ 
    int x = blockIdx.x; 
    int y = threadIdx.x; 
    int width = blockDim.x; 
    int index = (x * width)+y; 

    a[index] = a[index] * 3; 
} 
+4

Lorsque vous demandez une aide au débogage, vous devez fournir un [mcve] Ce que vous avez fourni ne l'est pas. –

+1

Lorsque la question est essentiellement "repérer mon erreur triviale à partir de cet exemple incomplet", vous n'apportez rien qui puisse aider les autres ou ajouter à l'ensemble des informations CUDA utiles sur [SO]. C'est pourquoi cette question a été votée. – talonmies

Répondre

3

Je me attendais pas à la fois les images que vous affichez d'être les mêmes. Cette ligne de code:

im1 = im1 * 3; 

modifie réellement les données im1. Chaque pixel im1 est maintenant 3 fois plus grand.

Ensuite, vous copiez ces données modifiées à l'appareil:

cudaMemcpy(d_a, &im1.data[0], sizeof(uint8_t)*size, cudaMemcpyHostToDevice); 

et en le multipliant à nouveau par 3.

Si vous voulez que les deux images à regarder la même chose, au lieu de cela:

im1 = im1 * 3; //this made image a little lighter comparatively. 
imshow("Original", im1); 

Je vous conseille de faire ceci:

Mat im2 = im1 * 3; 
imshow("Original", im2); 

Le problème devrait également être assez évident si vous imprimez simplement quelques pixels de valeurs numériques dans chaque cas. Dans votre code d'origine, vous devriez voir les pixels augmenter d'un facteur de 3 deux fois.

+1

oh c'était si évident. Je mérite des votes. –