Beispiel #1
0
        /// <summary>ラベルの包含関係を調べる</summary>
        /// <param name="label">ラベリングデータ</param>
        /// <param name="token">キャンセルトークン</param>
        /// <returns>包含関係</returns>
        public int[][] GetInclusionLink(LabelStructure label, CancellationTokenSource token)
        {
            logWriter.Write("ラベルの包含関係を調べます");

            if (label == null)
            {
                logWriter.WriteError("ラベル情報がありません");
                logWriter.WriteError("処理を中止します");
                return(null);
            }

            label.SetMinMax();
            int[][] link = new int[label.Max - label.Min + 1][];

            using (PrograssWindow pw = new PrograssWindow("包含検査", label.Max - label.Min + 1))
            {
                Parallel.For(label.Min, label.Max + 1, (n, state) =>
                {
                    if (token.IsCancellationRequested)
                    {
                        state.Break();
                    }
                    link[n - label.Min] = GetInclusionNumber3(label, n);
                    pw.Add();
                });
            }

            logWriter.Write("ラベルの包含関係を調べました");
            return(link);
        }
Beispiel #2
0
        /// <summary>ラベル情報を視覚化する</summary>
        /// <param name="label">視覚化したいラベルデータ</param>
        /// <returns>視覚化された画像<see cref="Bitmap"/></returns>
        private Bitmap GetLabelImage(LabelStructure label)
        {
            logWriter.Write("ラベルデータの画像作成を行います");

            if (label == null)
            {
                logWriter.WriteError("ラベルデータが存在しません");
                logWriter.WriteError("画像作成を中止します");
                return(null);
            }

            Bitmap bitmap = new Bitmap(label.Width, label.Height);

            label.SetMinMax();
            int val = label.Max - label.Min + 1;
            int c   = (byte.MaxValue + 1) / val;

            if (c == 0)
            {
                c = 16;
            }

            logWriter.Write("分割数  =" + val);
            logWriter.Write("色の変化量=" + c);

            {
                BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
                byte[]     buf  = new byte[bitmap.Width * bitmap.Height * 4];
                Marshal.Copy(data.Scan0, buf, 0, buf.Length);

                for (int y = 0; y < bitmap.Height; y++)
                {
                    for (int x = 0; x < bitmap.Width; x++)
                    {
                        int index = y * bitmap.Width * 4 + x * 4;
                        int color = label[y, x] * c;
                        buf[index + 0] = buf[index + 1] = buf[index + 2] = (byte)color;
                        buf[index + 3] = byte.MaxValue;
                    }
                }

                Marshal.Copy(buf, 0, data.Scan0, buf.Length);
                bitmap.UnlockBits(data);
            }

            logWriter.Write("ラベルデータの画像作成が完了しました");

            return(bitmap);
        }
Beispiel #3
0
        /// <summary>画像を保存します</summary>
        /// <param name="image">画像</param>
        /// <param name="depth">深さ</param>
        private void SaveImage(Bitmap image, LabelStructure depth)
        {
            DialogResult com = MessageBox.Show("3次元画像を保存しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (com == DialogResult.Yes)
            {
                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.Filter     = "3次元画像|*.rgbad;*.txt";
                saveDialog.Title      = "保存";
                saveDialog.DefaultExt = "rgbad";
                if (saveDialog.ShowDialog() == DialogResult.OK)
                {
                    string    path      = Path.GetDirectoryName(saveDialog.FileName) + "\\" + Path.GetFileNameWithoutExtension(saveDialog.FileName);
                    SaveImage saveImage = new SaveImage(logWriter);
                    saveImage.Save(image, depth, path + ".txt");
                    saveImage.SaveBinary(image, depth, path + ".rgbad");
                    depth.SetMinMax();
                    saveImage.SaveChip(image, depth, path);
                }
            }
        }