[02] 転け始め — OpenCVsharp3
さて、 VB.net でやる、といっておきながら、いきなり C#.net で作業をしています。時間制限のため、考えたあげくの選択です。苦渋の選択です、断腸の思いです(本日、高名な相撲部屋がひとつ、消滅しました。この団体はどっかの団体そっくりです。日本をむしばむ厚顔とはいつもおぞましいモノです・・・)。
さて、さて、先の作者のサイトの最初の記事にあるサンプルをまずはコピーアンドペーストで少し修正して動かしてみました。
ところが早速動きません。
まず、名前空間 Cv が拒否されます。
したがって、IplImage ing のインスタンスが作れないようです。
同様に、NuGet の紹介の記事のサンプルも同様です。Cv名前空間の関数は基本的には転けます。これを突破しないとなかなか前には進めないよう、、、です。
今のところ動いているのは、以下の3つです。
ちなみに以下のソースは、オープンファイルダイアログで読み込んだファイル名を、配列 Imgs に読み込んで、その先頭のファイル名 Imgs[0] を読み込んだ後、各処理を行っています。
●グレースケール化
private void trialGrayScaleToolStripMenuItem_Click(object sender, EventArgs e)
{
// 画像 img に元画像 imgs[0] を読み込んで OpenCV のウインドウに表示する
var img = new Mat(Imgs[0]);
Cv2.ImShow(“Original Image”, img);
Cv2.WaitKey();
// 画像を直接読み込んでそのままグレースケール化する
Cv2.ImShow(“gray”, img);
{
Mat ImgGray = new Mat();
// img を ImgGray へグレー化モード BGRA2GRAY を使ってコピーする
Cv2.CvtColor(img, imgGray,ColorConversionCodes.BGRA2GRAY);
// 結果 ImgGray を OpenCVのウインドウに表示する
using (new Window(“Gray Image”, ImgGray))
{
Cv2.WaitKey();
}
}
}
●白黒二値化
private void trialBlackWhiteToolStripMenuItem_Click(object sender, EventArgs e)
{
var img = new Mat(Imgs[0]);
Cv2.ImShow(“Original Image”, img);
Cv2.WaitKey();
Cv2.ImShow(“gray”, img);
{
{
// Img[0] を グレーに変換しながら ImgBW に読み込む
Mat ImgBW = new Mat(Imgs[0], ImreadModes.GrayScale);
//Cv2.CvtColor(img, ImgBW, ColorConversionCodes.BGRA2GRAY);
// グレー画像 ImgBW を 大津法で二値化処理して再び ImgBW に代入
ImgBW = ImgBW.Threshold(0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary);
using (new Window(“Gray Image”, ImgBW))
{
Cv2.WaitKey();
}
}
}
}
●エッジ検出
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
Mat src = new Mat(Imgs[0], ImreadModes.GrayScale);
Mat dst = new Mat();
// Canny で二値化処理してグレーと二値化結果をウインドウで表示
Cv2.Canny(src, dst, 50, 200);
using (new Window(“src image”, src))
using (new Window(“dst image”, dst))
{
Cv2.WaitKey();
}
}
ここで、画像の宣言が var と Mat が混在しています。
# C#では、変数の定義式でインスタンス化したりするときに、
# 代入符号=の左辺右辺でともに型を指定します。
# このときあんまり長い名前空間だとコードが見にくくなるので、
# 右辺の型を踏襲する var 型で左辺を宣言しておくと、
# コードがすっきりするので便利、という使い方をするそうです。
エッヂ処理の Canny は、内部で賢く二値化して、その結果をエッジ検出しているそうです。したがって入力はグレー画像です。
パラメーター設定とかできていないので使い勝手がいまいちです。やっぱり直接要素をいじくれるようにならないと最終的にはいろんなことが実行できないでしょう。もっと関数、というかメソッドを Cv名前空間 に対応するものを Cv2名前空間 から探してこないといけないようです。作者さんの記事を読み込むところから始めないと。
円検出とパターン検出は、今日はまだ遠いようです。
孤高の戦士に捧ぐ
追記
こちらのサイトは Cv2 名前空間の関数を使ってましたのでたいへん参考になって助かりました
ラインアートのサンプル
private void maskToolStripMenuItem_Click(object sender, EventArgs e)
{
var img = new Mat(240, 320, MatType.CV_8UC3, new Scalar(0, 0, 0));
var mat3 = new MatOfByte3(img);
var indexer = mat3.GetIndexer();
var lineNum = 20; // 描画する線の数
for (var i = 0; i < lineNum; i++)
{
var val = (float)i / lineNum;
var x = val * img.Width;
var y = val * img.Height;
Cv2.Line(img, new OpenCvSharp.Point(0, y), new OpenCvSharp.Point(x, img.Height), new Scalar(0, val * 255, 255 – (val * 255)));
}
Cv2.ImShow(“image”, img);
Cv2.WaitKey();
}