【问题标题】:watershed function provided by EmguCvEmguCv 提供的分水岭函数
【发布时间】:2011-12-17 19:21:27
【问题描述】:

我想使用emgucv提供的分水岭函数。我使用了以下代码,但我得到的只是一张白色的图片。请帮助我并更正此代码。谢谢。

Image im;
    Bitmap bm;
    Bitmap bmF;
    private void button1_Click(object sender, EventArgs e)//setting the background image
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            im = Image.FromFile(openFileDialog1.FileName);
           bm = new Bitmap(im);

        }
        panel1.BackgroundImage = im;
        panel1.Width = im.Width;
        panel1.Height = im.Height;
        panel1.Visible = true;


    }

    private void button2_Click(object sender, EventArgs e)
    {
        watershed(bm);
    }

    private void watershed(Bitmap bm)
    {
        Image<Bgr, Byte> imWa = new Image<Bgr, byte>(bm);
        Image<Gray, Int32> imgr = new Image<Gray, int>(imWa.Width, imWa.Height);
        Rectangle rec = imWa.ROI;
        imgr.Draw(new CircleF(new PointF(rec.Left + rec.Width / 2.0f, rec.Top + rec.Height / 2.0f), (float)(Math.Min(imWa.Width, imWa.Height) / 4.0f)), new Gray(255), 0);
        CvInvoke.cvWatershed(imWa, imgr);
        bmF=new Bitmap(bm.Width,bm.Height);
        bmF= imgr.ToBitmap();
        panel1.BackgroundImage = (Image)bmF;
        panel1.Invalidate();
    }

【问题讨论】:

  • 为了获得Bitmap 数据类型,您包含哪些标头?

标签: c# winforms emgucv watershed


【解决方案1】:

您需要更好地为分水岭准备掩码文件(即 imgr)。

为此,您需要先将所有设置为零。你可以通过调用来做到这一点:

CvInvoke.cvZero(imgr);

那么你应该至少引入第二个“类”。因此,您可以绘制具有不同坐标的第二个圆(属于背景的东西)。为了安全起见,第一个圆(例如new Gray(100))与第二个圆(例如new Gray(200))使用不同的灰度值。

您将在最后的掩码文件 imgr 中获得结果,两个类以不同的灰度值显示。

我不确定您是否需要 ROI 位...

【讨论】:

    【解决方案2】:

    代替:

    bmF= imgr.ToBitmap();
    

    试试这个:

    bmF= imgr.Convert<Gray,byte>().ToBitmap();
    

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多