実現したいこと
背景のマスク処理の速度を改善するために、画像処理をする上で何が足りていないのか知りたい。
前提
この処理がやっている内容としては、人物をイメージセグメンテーションしており、
人物以外は、黒く塗りつぶし、人物のみをカラー画像で表示したい。
発生している問題・エラーメッセージ
背景のマスク処理が遅くてムラが生じてしまう。
該当のソースコード
C#
1 private void MaskColor2Black([In, Out] byte[] pixels, byte[] colorArray, byte[] bodyindex) 2 { 3 4 for (int i = 0; i < colorArray.Length; i++) 5 { 6 7 if (bodyindex[i] == 255) 8 { 9 pixels[i * 4] = 0; 10 pixels[i * 4 + 1] = 0; 11 pixels[i * 4 + 2] = 0; 12 } 13 else 14 { 15 pixels[i * 4] = colorArray[i * 4]; 16 pixels[i * 4 + 1] = colorArray[i * 4 + 1]; 17 pixels[i * 4 + 2] = colorArray[i * 4 + 2]; 18 } 19 pixels[i * 4 + 3] = 255; 20 } 21 }
<ソースコードの説明>
- colorArrayは、画像フォーマットをBGRAで取得してきたカラー画像
- pixelsは、画像フォーマットをBGRでcolorArrayから色情報を取得し、この配列を画像として表示
- bodyindexに人物とそれ以外の情報が格納されており、人物の場合は0 / それ以外は255
試したこと
C#
1 else 2 { 3 pixels[i * 4] = 100; 4 pixels[i * 4 + 1] = 100; 5 pixels[i * 4 + 2] = 100; 6 }
- 上記のコードのように** 単色で人物を染めるとムラが生じない **
- WPFだとコマンドライン引数が使えない(<=試した限りの情報だけなので根拠不足、訂正があればご教授願います)ことから
OpenMPIなどのCPUを用いた並列処理を行えなかった。(OpenMPも試行してみたが画像の状態に変化なし)
0. GPUを用いた並列処理を実装し、CUDAを用いるためにC++のWrapperを記述したが画像の状態に変化なし
下記に該当コードを示す
C++
1 2__global__ void PrrallelProcessingLoop(unsigned char* pixels, unsigned char* colorArray, unsigned char* bodyindex, int len) { 3 int id = (blockIdx.x * blockDim.x) + threadIdx.x; 4 5 if (id < len) { 6 7 if (bodyindex[id] != 255) { 8 pixels[id * 4] = colorArray[id * 4]; 9 pixels[id * 4 + 1] = colorArray[id * 4 + 1]; 10 pixels[id * 4 + 2] = colorArray[id * 4 + 2]; 11 } 12 else { 13 pixels[id * 4] = 0; 14 pixels[id * 4 + 1] = 0; 15 pixels[id * 4 + 2] = 0; 16 } 17 18 19 pixels[id * 4 + 3] = 255; 20 } 21} 22 23 24void PrrallelProcessing(unsigned char* pixels, unsigned char* colorArray, unsigned char* bodyindex, int len, int len2) 25{ 26 unsigned char* dB; 27 unsigned char* dC; 28 unsigned char* dP; 29 cudaSetDevice(0); 30 31 CUDA_SAFE_CALL(cudaMalloc((void**)&dB, len * sizeof(unsigned char))); 32 CUDA_SAFE_CALL(cudaMalloc((void**)&dC, len2 * sizeof(unsigned char))); 33 CUDA_SAFE_CALL(cudaMalloc((void**)&dP, len2 * sizeof(unsigned char))); 34 35 CUDA_SAFE_CALL(cudaMemcpy(dB, bodyindex, len * sizeof(unsigned char), cudaMemcpyHostToDevice)); 36 CUDA_SAFE_CALL(cudaMemcpy(dC, colorArray, len2 * sizeof(unsigned char), cudaMemcpyHostToDevice)); 37 CUDA_SAFE_CALL(cudaMemcpy(dP, pixels, len2 * sizeof(unsigned char), cudaMemcpyHostToDevice)); 38 //cudaMemcpy(dP, pixels, len * sizeof(unsigned char), cudaMemcpyHostToDevice); 39 40 int th = 1024; 41 int bl = (len / th); 42 dim3 blocks(bl, 1, 1); 43 dim3 threads(th, 1, 1); 44 45 PrrallelProcessingLoop <<<blocks, threads>>> (dP, dC, dB, len); 46 47 cudaDeviceSynchronize(); 48 49 cudaMemcpy(pixels, dP, len2 * sizeof(unsigned char), cudaMemcpyDeviceToHost); 50 51 cudaFree(dB); 52 cudaFree(dC); 53 cudaFree(dP); 54}
補足情報(FW/ツールのバージョンなど)
- OS : Windows10
- CUDA 11.2
- Visual Studio 2019
- WPF
- .NETFramework 4.7.2
何か足りない情報があれば適宜おっしゃっていただけると幸いです
回答2件
あなたの回答
tips
プレビュー