2017-10-12 53 views
2

gtkmmが書いたGuiにcv :: Matを表示したい。だから私はテストをした。display gtkmmのopencv cv :: mat画像

私はウィジェットGtk::Image imageを持っている、と私は、次の2つの方法で画像を設定したい:

// first method, display from file 
void displayImage1() 
{ 
    Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_file("gtk.png"); 
    image.set(pixbuf); 
} 

// second method, display from cv::Mat 
void displayImage2() 
{ 
    cv::Mat outImage = cv::imread("gtk.png"); 
    cv::cvtColor(outImage, outImage, CV_BGR2RGB); 
    Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_data(outImage.data, Gdk::COLORSPACE_RGB,false, 8, outImage.cols, outImage.rows, outImage.step); 
    image.set(pixbuf); 
} 

第1の方法が適しています。

enter image description here

しかし、第2の方法はうまく機能しない画像に示すように、私は、画面上の破壊された画像を得ました。

enter image description here

私がtrueにhas_alphaパラメータを設定した場合、結果も奇妙である(写真を参照。以下)。 enter image description here

Gtk :: DrawingAreaを使用して同様のテストが行​​われました。異なるIDEが使用されます(ただし、linuxではg ++コンパイラがすべて使用されます)。すべての同じ結果。

アップデート:私は、画像の多くをテストした

。場合によっては画像が壊れて、時にはプログラムがクラッシュすることがあります

プログラムが予期せず終了しました。

+0

はあなたがイメージが実際にアルファチャンネルが含まれていないことを確認しましたか?灰色の背景が画像の一部でない限り、私のように思えます。 – KjMag

+0

@KjMag THANKSしかし、has_alphaが "true"の結果も正しくないので、質問の結果を更新しました。 –

+0

24の代わりに "bits_per_sample"? – Miki

答えて

0

通常、この種の「壊れた」画像は、私の頭の中で「間違ったrawstride!」という警告を引き起こします。 rawstrideはGdk::Pixbufで、データの行の長さはバイトです。これは、バイト整列の制約があるため、1行の最後にパディングがある可能性があるからです。

私はこのstep引数が何であるかを確認しました。それはOpenCVのGdk :: Pixbufのrawstrideと同じです。私が実現するまでoutImage.stepcv:MatStepオブジェクトであり、Gdk::Pixbuf::create_from_dataはintを期待しています。代わりにoutImage.step[0]を使用すると思われます。

ここで行くhttps://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat

+1

'cv :: MatStep'は暗黙的に' size_t'に変換されていますので、このように 'outImage.step'を使っても構いません。 – Miki

+0

あなたの優しい答えをありがとう。はい、私は@Mikiに同意します。それにもかかわらず、私はoutImage.step [0]で試してみました。 –

0

をお読みください:

auto lenna = imread("Lenna.png"); 
Image image; 

cvtColor(lenna, lenna, COLOR_BGR2RGB); 
auto size = lenna.size(); 
auto img = Gdk::Pixbuf::create_from_data(lenna.data, Gdk::COLORSPACE_RGB, lenna.channels() == 4, 8, size.width, size.height, (int) lenna.step); 

image.set(img); 
+0

あなたのコードをありがとうございますが、私は本質的に私と同じだと思います。私はそれをとにかく試して、結果は同じです。あなたの側で動作する場合は、それは私のコンパイラやシステムの問題、または私の知らないライブラリのバージョンでなければなりません:( –

+0

私はOpenCVとGTKmmのバージョンが同じではないという問題があると思います。 gtkmm 2.4 – moisrex

関連する問題