Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EmguCv提供的分水岭函数_C#_Winforms_Emgucv_Watershed - Fatal编程技术网

C# EmguCv提供的分水岭函数

C# EmguCv提供的分水岭函数,c#,winforms,emgucv,watershed,C#,Winforms,Emgucv,Watershed,我想使用emgucv提供的分水岭函数。我使用了以下代码,但得到的只是一张白色图片。请帮助我更正此代码。谢谢 Image im; Bitmap bm; Bitmap bmF; private void button1_Click(object sender, EventArgs e)//setting the background image { if (openFileDialog1.ShowDialog() == DialogResult.OK)

我想使用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();
    }
图像im;
位图bm;
位图bmF;
私有无效按钮1\u单击(对象发送者,事件参数)//设置背景图像
{
如果(openFileDialog1.ShowDialog()==DialogResult.OK)
{
im=Image.FromFile(openFileDialog1.FileName);
bm=新位图(im);
}
panel1.BackgroundImage=im;
面板1.宽度=im.宽度;
面板1.高度=im.高度;
面板1.可见=真实;
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
流域(bm);
}
专用空心分水岭(位图bm)
{
图像imWa=新图像(bm);
图像imgr=新图像(imWa.Width,imWa.Height);
矩形rec=imWa.ROI;
图像绘制(新的圆圈(新的点F(记录左+记录宽度/2.0f,记录顶部+记录高度/2.0f),(浮动)(数学最小值(记录宽度,记录高度)/4.0f)),新的灰色(255),0);
CvInvoke.cv流域(imWa、imgr);
bmF=新位图(bm.宽度,bm.高度);
bmF=imgr.ToBitmap();
panel1.BackgroundImage=(图像)bmF;
1.使无效();
}
而不是:

bmF= imgr.ToBitmap();
试试这个:

bmF= imgr.Convert<Gray,byte>().ToBitmap();
bmF=imgr.Convert().ToBitmap();
而不是:

bmF= imgr.ToBitmap();
试试这个:

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

您需要更好地为流域(即imgr)准备遮罩文件

为此,您需要先将all设置为零。您可以拨打以下电话:

CvInvoke.cvZero(imgr);
然后你至少应该介绍第二个“类”。因此,您可以使用不同的坐标(属于背景的东西)绘制第二个圆。为了安全起见,第一圈(例如
新灰色(100)
)的灰度值与第二圈(例如
新灰色(200)
)的灰度值不同

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


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

您需要更好地为分水岭(即imgr)准备遮罩文件

为此,您需要先将all设置为零。您可以拨打以下电话:

CvInvoke.cvZero(imgr);
然后你至少应该介绍第二个“类”。因此,您可以使用不同的坐标(属于背景的东西)绘制第二个圆。为了安全起见,第一圈(例如
新灰色(100)
)的灰度值与第二圈(例如
新灰色(200)
)的灰度值不同

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


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

获取
位图
数据类型时包含了哪些标题?获取
位图
数据类型时包含了哪些标题?