2017-10-23 23 views
3

OpenCVライブラリでcv :: cuda :: createMedianfilter関数を使用しようとしています。OpenCv 3.3 Cuda Medianfilterは画像の黒の2/3を生成します

この単純なコードは、2/3の黒で、1/3のみがフィルタリングされた画像を生成します。

using namespace cv; 
int main(int argc, char** argv) 
{ 
    Mat src; Mat dst; 
    src = imread("test.bmp", 1); 
    cuda::GpuMat imageGpu(src),imageGpuOut; 
    cuda::Stream stream; 
    try 
    { 
     Ptr<cuda::Filter> filterX = cuda::createMedianFilter(CV_8UC1, 31); 
     filterX->apply(imageGpu, imageGpuOut,stream); 
     imageGpuOut.download(dst,stream); 
     stream.waitForCompletion(); 
     imwrite("test_cuda31.bmp", dst); 
    } 
    catch (cv::Exception& e) 
    { 
     const char* err_msg = e.what(); 
     std::cout << "exception caught: " << err_msg << std::endl; 
    } 
} 

入力画像は、次のようになりますInput image
出力画像は、次のようになります。私は、さまざまなサイズともmedianfilter上の異なるカーネルサイズの他のいくつかの画像を試してみましたOutput image

。すべて同じ結果です。

私が間違っていることに関するアイデアはありますか?あなたはその後、3つのチャネル(BGR)

src = imread("test.bmp", 1); 

の画像をロードする

+4

私はそれはあなたがRGBとして画像を読み取るためだと思う - >それは3つのチャンネルで、メディアンフィルタ機能を作成するには、あなたがCV_8UC1を使う - >それは1つのチャンネルです....したがって、画像の1/3を処理します。まずグレースケールに変換するか、0で1をロードしてください。間違っているかもしれません.OpenCVのCUDAモジュールをあまり使用していません。 – api55

+0

@ api55 ..それが問題の正しい理由です。問題が解決済みとしてマークされるように、あなたのコメントを回答として追加してください。 – sgarizvi

答えて

2

、ソースのみ1チャネル

Ptr<cuda::Filter> filterX = cuda::createMedianFilter(CV_8UC1, 31); 

たかのように、それが唯一の1/3を処理する使用していますおそらく画像はすべての0で初期化され、したがって画像の残りの部分では黒のピクセルになります。

は悲しいことに、cuda::createMedianFilterCV_8UC1をサポートしていますので、それを変更することはできませんが、あなたはCV_8UC1

src = imread("test.bmp", 0); 

としてイメージをロードまたはロード後にグレースケールに変換することができます。

は、私は、これはあなたの問題を解決を願ってい

関連する問題