/// <summary> /// 各チャンネルの画像を取得する /// </summary> void GetRGBHSV() { // RGB取得 Mat[] srcBgrArray = Cv2.Split(SrcBmp.ToMat()); Mat[] targetBgrArray = Cv2.Split(TargetBmp.ToMat()); // HSV取得 Mat tempSrcHsv = new Mat(); Mat tempTargetHsv = new Mat(); Cv2.CvtColor(SrcBmp.ToMat(), tempSrcHsv, ColorConversionCodes.BGR2HSV); Cv2.CvtColor(TargetBmp.ToMat(), tempTargetHsv, ColorConversionCodes.BGR2HSV); Mat[] srcHsvArray = Cv2.Split(tempSrcHsv); Mat[] targetHsvArray = Cv2.Split(tempTargetHsv); // 格納 SrcImages[R] = srcBgrArray[2].ToBitmap(); SrcImages[G] = srcBgrArray[1].ToBitmap(); SrcImages[B] = srcBgrArray[0].ToBitmap(); SrcImages[H] = srcHsvArray[0].ToBitmap(); SrcImages[S] = srcHsvArray[1].ToBitmap(); SrcImages[V] = srcHsvArray[2].ToBitmap(); TargetImages[R] = targetBgrArray[2].ToBitmap(); TargetImages[G] = targetBgrArray[1].ToBitmap(); TargetImages[B] = targetBgrArray[0].ToBitmap(); TargetImages[H] = targetHsvArray[0].ToBitmap(); TargetImages[S] = targetHsvArray[1].ToBitmap(); TargetImages[V] = targetHsvArray[2].ToBitmap(); }
/// <summary> /// マッチングボタンイベント /// </summary> private void button_ExeMatching_Click(object sender, EventArgs e) { try { // マスクに基づいて画像のクロップを行う int x, y, width, height; Rectangle rect; // Src var maskBmpSrc = new Bitmap(SrcBmp.Width, SrcBmp.Height); x = (int)(ShowingMaskSrcRect.X / ScaleSrc); y = (int)(ShowingMaskSrcRect.Y / ScaleSrc); width = (int)(ShowingMaskSrcRect.Width / ScaleSrc); height = (int)(ShowingMaskSrcRect.Height / ScaleSrc); rect = new Rectangle(x, y, width, height); CroppedSrcBmp = SrcBmp.Clone(rect, SrcBmp.PixelFormat); var resizedCroppedSrcBmp = ReduceImage(CroppedSrcBmp, 800, 800); // Target var maskBmpTarget = new Bitmap(TargetBmp.Width, TargetBmp.Height); x = (int)(ShowingMaskTargetRect.X / ScaleTarget); y = (int)(ShowingMaskTargetRect.Y / ScaleTarget); width = (int)(ShowingMaskTargetRect.Width / ScaleTarget); height = (int)(ShowingMaskTargetRect.Height / ScaleTarget); rect = new Rectangle(x, y, width, height); CroppedTargetBmp = TargetBmp.Clone(rect, TargetBmp.PixelFormat); var resizedCroppedTargetBmp = ReduceImage(CroppedTargetBmp, 800, 800); // マッチング実行 OneMatching = new Matching(resizedCroppedSrcBmp.ToMat(), resizedCroppedTargetBmp.ToMat(), FeatureRate); OneMatching.RunMutching(); // 結果表示 MatchingResultBmp = OneMatching.MatchingResultMat.ToBitmap(); pictureBox_MatchingResult.Image = MatchingResultBmp; // 射影変換 OneMatching.FitSrcToTarget(); WarpedSrcBmp = OneMatching.WarpedSrcMat.ToBitmap(); // 差分画像作成 画像が大きすぎると処理が遅いのである程度縮小する var subimage = new Form2(WarpedSrcBmp, resizedCroppedTargetBmp); subimage.Show(); } catch (Exception) { MessageBox.Show("マッチング失敗"); } }
/// <summary> /// 片っ端から画像を保存する /// </summary> public void SaveImages(string dir) { // フォルダの存在確認 if (!System.IO.Directory.Exists(dir)) { System.IO.Directory.CreateDirectory(dir); } SrcBmp.Save(dir + "SrcBmp.bmp", ImageFormat.Bmp); TargetBmp.Save(dir + "TargetBmp.bmp", ImageFormat.Bmp); SrcImages[R].Save(dir + "_SrcR.bmp", ImageFormat.Bmp); SrcImages[G].Save(dir + "_SrcG.bmp", ImageFormat.Bmp); SrcImages[B].Save(dir + "_SrcB.bmp", ImageFormat.Bmp); SrcImages[H].Save(dir + "_SrcH.bmp", ImageFormat.Bmp); SrcImages[S].Save(dir + "_SrcS.bmp", ImageFormat.Bmp); SrcImages[V].Save(dir + "_SrcV.bmp", ImageFormat.Bmp); TargetImages[R].Save(dir + "_TargetR.bmp", ImageFormat.Bmp); TargetImages[G].Save(dir + "_TargetG.bmp", ImageFormat.Bmp); TargetImages[B].Save(dir + "_TargetB.bmp", ImageFormat.Bmp); TargetImages[H].Save(dir + "_TargetH.bmp", ImageFormat.Bmp); TargetImages[S].Save(dir + "_TargetS.bmp", ImageFormat.Bmp); TargetImages[V].Save(dir + "_TargetV.bmp", ImageFormat.Bmp); SubImages[R].Save(dir + "_SubR.bmp", ImageFormat.Bmp); SubImages[G].Save(dir + "_SubG.bmp", ImageFormat.Bmp); SubImages[B].Save(dir + "_SubB.bmp", ImageFormat.Bmp); SubImages[H].Save(dir + "_SubH.bmp", ImageFormat.Bmp); SubImages[S].Save(dir + "_SubS.bmp", ImageFormat.Bmp); SubImages[V].Save(dir + "_SubV.bmp", ImageFormat.Bmp); BinImages[R].Save(dir + "_BinR.bmp", ImageFormat.Bmp); BinImages[G].Save(dir + "_BinG.bmp", ImageFormat.Bmp); BinImages[B].Save(dir + "_BinB.bmp", ImageFormat.Bmp); BinImages[H].Save(dir + "_BinH.bmp", ImageFormat.Bmp); BinImages[S].Save(dir + "_BinS.bmp", ImageFormat.Bmp); BinImages[V].Save(dir + "_BinV.bmp", ImageFormat.Bmp); MedianImages[R].Save(dir + "_MedianR.bmp", ImageFormat.Bmp); MedianImages[G].Save(dir + "_MedianG.bmp", ImageFormat.Bmp); MedianImages[B].Save(dir + "_MedianB.bmp", ImageFormat.Bmp); MedianImages[H].Save(dir + "_MedianH.bmp", ImageFormat.Bmp); MedianImages[S].Save(dir + "_MedianS.bmp", ImageFormat.Bmp); MedianImages[V].Save(dir + "_MedianV.bmp", ImageFormat.Bmp); DilatedImage.Save(dir + "_Dilated.bmp", ImageFormat.Bmp); }