2017-01-06 2 views
-1

イメージがデバイスのグローバルメモリ内の行メジャーまたは列メジャーの順番で格納されるかどうか混乱します。 両方の注文で画像にアクセスしている間に、画像の2つの異なる出力を取得しています。
使用行優先order-cudaのスレッドインデックスの行メジャーまたはカラムメジャーアクセス?

int x = threadIdx.x + blockDim.x * blockIdx.x; 
int y = threadIdx.y + blockDim.y * blockIdx.y; 

int m = numCols * y + x; 

if (x >= numCols || y >= numRows) 
    return; 

//marking column boundaries 
if (x <= 2){      
    d_Image[m].x = 255; 
    d_Image[m].y = 0; 
    d_Image[m].z = 0; 
} 
else if (x >= numCols-2){ 
    d_Image[m].x = 0; 
    d_Image[m].y = 0; 
    d_Image[m].z = 255; 
} 
else{ 
    d_Image[m].x = d_sample[m].x; 
    d_Image[m].y = d_sample[m].y; 
    d_Image[m].z = d_sample[m].z; 
} 
d_Image[m].w = d_sample[m].w; 

outputにアクセスする行優先
列優先でアクセスCOL-主要
Dimensions-使用order-

int m = x * numRows + y; 

output

const dim3 blockSize(16,16); 
const dim3 gridSize(numCols/16+1, numRows/16+1, 1); 
blur << < gridSize, blockSize >> >(d_Image, d_sample, numRows, numCols); 

opencvを使用してイメージをロードして保存しています。
最初の出力では、赤い点と青い点が画像全体に点在しています。そして2番目の出力(col-major)では、カラムをマークしようとしている間に境界行がマークされます。私はあまりにも混乱しています。 編集

void helper(uchar4* d_sample, uchar4* d_Image, size_t numRows, size_t numCols); 

cv::Mat sample; 
cv::Mat Image; 

size_t numRows() { return sample.rows; } 
size_t numCols() { return sample.cols; } 

__global__ void blur(const uchar4 *d_sample, uchar4* d_Image, size_t numRows, size_t numCols){ 

    int x = threadIdx.x + blockDim.x * blockIdx.x; 
    int y = threadIdx.y + blockDim.y * blockIdx.y; 

    int m = y*numCols + x;      

    if (x >= numCols || y >= numRows) 
     return; 

    if (x <= 2){ 
     d_Image[m].x = 255; 
     d_Image[m].y = 0; 
     d_Image[m].z = 0; 
    } 
    else if (x >= (numCols-2)){ 
     d_Image[m].x = 0; 
     d_Image[m].y = 0; 
     d_Image[m].z = 255; 
    } 
    else{ 
     d_Image[m].x = d_sample[m].x; 
     d_Image[m].y = d_sample[m].y; 
     d_Image[m].z = d_sample[m].z; 
    } 
    d_Image[m].w = d_sample[m].w; 
    } 

int main(){ 

    uchar4 *h_sample, *d_sample, *d_Image, *h_Image; 
    int filter[9]; 
    sample = cv::imread("sample.jpg", CV_LOAD_IMAGE_COLOR); 
    if (sample.empty()){ 
     std::cout << "error in loading image."; 
     system("pause"); 
    } 

    cv::cvtColor(sample,sample,CV_BGR2RGBA); 
    Image.create(numRows(), numCols(), CV_8UC4); 

    if (!sample.isContinuous() || !Image.isContinuous()) { 
     std::cerr << "Images aren't continuous!! Exiting." << std::endl; 
     system("pause"); 
     exit(1); 
    } 
    cv::cvtColor(Image,Image,CV_BGR2RGBA); 

    h_sample = (uchar4*)sample.data; 
    h_Image = (uchar4*)Image.data; 

    size_t numPixels = numRows() * numCols(); 

    //allocate mmeory on device 
    checkCudaErrors(cudaMalloc((void**)&d_sample, sizeof(uchar4) * numPixels)); 
    checkCudaErrors(cudaMalloc((void**)&d_Image, sizeof(uchar4) * numPixels)); 

    checkCudaErrors(cudaMemset(d_sample, 0, sizeof(uchar4) * numPixels)); 
    checkCudaErrors(cudaMemset(d_Image, 0, sizeof(uchar4) * numPixels)); 

//copy to device 
    checkCudaErrors(cudaMemcpy(d_sample, h_sample, sizeof(uchar4) * numPixels, cudaMemcpyHostToDevice)); 

    helper(d_sample, d_Image, numCols(), numRows()); 

//copy back to host 
    checkCudaErrors(cudaMemcpy(h_Image, d_Image, sizeof(uchar4) * numPixels, cudaMemcpyDeviceToHost)); 

    cv::cvtColor(Image,Image,CV_RGBA2BGR); 

    cv::namedWindow("Image", CV_WINDOW_AUTOSIZE); 
    cv::imshow("Image", Image); 
    cv::waitKey(0); 
    cv::imwrite("sample.jpg", Image); 

    return 0; 
} 

void helper(uchar4* d_sample, uchar4* d_Image, size_t numRows, size_t numCols){ 

    const dim3 blockSize(16,16); 
    const dim3 gridSize(numCols/16+1, numRows/16+1, 1); 
    blur << < gridSize, blockSize >> >(d_sample, d_Image, numRows, numCols); 
    cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); 
} 
+0

をCOLSと行を切り替えているかもしれないと思う

helper(d_sample, d_Image, numCols(), numRows()); 

を呼び出します結果のメモリ/イメージは正しくなりましたか?おそらく、列メジャーを使用してイメージを保存/表示していますが、他のすべては行メジャーです。 –

+0

opencvはマット/イメージデータを行メジャーに保存します。 –

+2

AFAIK 'cv :: cuda :: GpuMat'の基礎となるデバイス割り当ては、ピッチの割り当てです。あなたが完全なコードを表示していないので、あなたが使っているものかどうかはわかりません(「なぜこのコードは動作しませんか?」という質問には、[mcve]が含まれているはずです)。しかし、あなたの投稿されたコードは、投げられた割り当てを考慮していないようです。スライド15 [ここ](http://on-demand.gputechconf.com/gtc/2013/webinar/gtc-express-itseez-opencv-webinar.pdf) –

答えて

1
void helper(uchar4* d_sample, uchar4* d_Image, size_t numRows, size_t numCols){ 

、あなたはあなたがあなたを見ているよろしいです私はあなたがヘルパーを呼び出すときに...

関連する問題