色空間の変換は Android版では グレースケール化だけをUpしました。ここでは 最初にBGRからRGBへの変換の実験をしてみます。
色空間の変換は CvCppクラスのCvtColorで行います。CvCppクラスのCvtColorの詳細は、ここを参照してください。
コーディング |
前回作ったプログラムのpictureBox1_Paint()に1行追加しました。
private void pictureBox1_Paint(object sender, PaintEventArgs e){ if (flg){ // どれかのボタンがクリックされたか? CvCpp.CvtColor(mat, mat, ColorConversion.BgraToRgb, 0); Bitmap bmp = new Bitmap(mat.Cols, mat.Rows); bmp = mat.ToBitmap(); // MatをBitmapに変換 e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height); bmp.Dispose(); } }
その結果 Redボタンをクリックすると青 Greenボタンは緑のまま Blueボタンを押すと赤 が表示されるようになりました。
B→R G→G R→B と変換されています。
次はお定まり グレースケール化 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.CPlusPlus; namespace OpenCvShp { public partial class Form1 : Form { private Mat mat = new Mat(); public Form1(){ InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e){ mat = new Mat(@”C:VCTestDatayuri.jpg”, LoadMode.Color); timer1.Enabled = false; pictureBox1.Invalidate(); } private void btnGray_Click(object sender, EventArgs e){ CvCpp.CvtColor(mat, mat, ColorConversion.BgraToGray, 0); pictureBox1.Invalidate(); } private void pictureBox1_Paint(object sender, PaintEventArgs e){ if (!timer1.Enabled){ //画像データ読み込み済み判断にtimerのEnableを使っている Bitmap bmp = new Bitmap(mat.Cols, mat.Rows); bmp = mat.ToBitmap(); e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height); bmp.Dispose(); } } } }
Matに取り込んだ画像を初期表示するイベントをいろいろ試したのですが、うまくいかず Timerコントロールを使い実現しました。(インターバル=100msec)
元の画像 | グレースケールボタンをクリックして 表示された画像 |
Windows7 Vs2008 OpenCv2.4 And OpenCvSharp |