前提・実現したいこと
C++/CLIのWindowsFormsアプリケーションで画像処理のプログラムを作成しています。
ファイル選択ダイアログで選択した画像を表示させ、その隣にOpenCVで画像処理したものを表示させようとしていますがファイル選択ダイアログで選択したビットマップファイルをMatへ変換及び、Matからビットマップファイルへの変換方法がわからず困っています。
Bitmap→Mat、Mat→Bitmapの変換について教えていただきたいです。
該当のソースコード
下記のコードはボタンをクリックするとファイル選択ダイアログが開かれ選択した画像をpicturebox1に表示し、画像処理したものをpicturebox2に表示させようとしています。
C++
1 private: System::Void button_Click(System::Object^ sender, System::EventArgs^ e) { 2 //ファイルを開くダイアログの作成 3 OpenFileDialog^ dlg = gcnew OpenFileDialog; 4 //ファイルフィルタ 5 dlg->Filter = "画像ファイル(*.bmp,*.jpg,*.png,*.tif,*.ico)|*.bmp;*.jpg;*.png;*.tif;*.ico"; 6 //ダイアログの表示 (Cancelボタンがクリックされた場合は何もしない) 7 if (dlg->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) return; 8 //ビットマップファイルから、元画像Bitmapを作成 9 Bitmap^ bmp1 = gcnew Bitmap(dlg->FileName); 10 //picturebox1に表示 11 pictureBox1->Image = bmp1; 12 //ビットマップファイルから、処理用Bitmapを作成 13 Bitmap^ bmp2 = gcnew Bitmap(dlg->FileName); 14-------------------------------- 15ファイル選択ダイアログで選択したbmp2をMatに変換 16 ↓ 17 OpenCVを用いて画像処理 18 ↓ 19画像処理済みのMatをビットマップファイル(bmp3とか)に変換 20-------------------------------- 21 //picturebox2に画像処理したものを表示 22 pictureBox2->Image = bmp3; 23 }
補足情報(FW/ツールのバージョンなど)
Visual studio community 2015
OpenCV 3.4.0
###追記
下記のコードはBitmapをMatに変換するのではなくファイル選択で選んだパス(dlg->FileName)をSystem::String ^型からstd::stringに変換してimreadで読み込ませています。そのあとimreadで読み込んだ画像を画像処理してからpicureBox2に表示させようとしています。
ここで問題なのですがimshowで表示させた時点で上下左右反転しdrawImage関数でpictureBox2に表示させると画像が崩れてしまいます。
申し訳ございませんがヒントや参考になりそうなサイト等でも教えていただけると幸いです。
C++
1 private: System::Void button_Click(System::Object^ sender, System::EventArgs^ e) { 2 //ファイルを開くダイアログの作成 3 OpenFileDialog^ dlg = gcnew OpenFileDialog; 4 //ファイルフィルタ 5 dlg->Filter = "画像ファイル(*.bmp,*.jpg,*.png,*.tif,*.ico)|*.bmp;*.jpg;*.png;*.tif;*.ico"; 6 //ダイアログの表示 (Cancelボタンがクリックされた場合は何もしない) 7 if (dlg->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) return; 8 //ビットマップファイルから、元画像Bitmapを作成 9 Bitmap^ bmp1 = gcnew Bitmap(dlg->FileName); 10 //picturebox1に表示 11 pictureBox1->Image = bmp1; 12 13 //ファイル選択ダイアログで選択したファイルのパス(dlg->FileName(System::String ^型))をstd::stringに変換 14 string imgfl = msclr::interop::marshal_as<std::string>(dlg->FileName); 15 //imreadでよみこむ 16 Mat img = imread(imgfl); 17 -------------------------- 18 OpenCVを用いて画像処理 19 -------------------------- 20 //picturebox2に画像処理したものを表示 21 drawImage(pictureBox2, img); 22 } 23 //描画 24 private: System::Void drawImage(PictureBox^ pic, Mat mat) { 25 26 if ((pic->Image == nullptr) || (pic->Width != mat.cols) 27 || (pic->Height != mat.rows)) { 28 pic->Width = mat.cols; 29 pic->Height = mat.rows; 30 Bitmap^ bmpPicBox = gcnew Bitmap(pic->Width, pic->Height); 31 pic->Image = bmpPicBox; 32 } 33 Graphics^g = Graphics::FromImage(pic->Image); 34 Bitmap^ bmp = gcnew Bitmap(mat.cols, mat.rows, mat.step, 35 System::Drawing::Imaging::PixelFormat::Format32bppRgb, IntPtr(mat.data)); 36 g->DrawImage(bmp, 0, 0, mat.cols, mat.rows); 37 pic->Refresh(); 38 delete g; 39 }
左からBitmapで読み込んでpictureBox1に出力したもの、Matで読み込んでpictureBox2に表示させたもの、Matで読み込んでimshowで表示させたものです。
まずimreadで読み込まれた際になぜか上下左右が反転してしまい、pictureBox2に出力しようとすると画像が崩れてしまいます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/27 06:51
2019/11/27 08:53
2019/11/28 04:10