C# EmguCv提供的分水岭函数
我想使用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)
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位…获取
位图
数据类型时包含了哪些标题?获取位图
数据类型时包含了哪些标题?