我想使用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();
}
答案 0 :(得分:2)
您需要为分水岭(即imgr)更好地准备掩码文件。
为此,您需要先将all设置为零。您可以通过致电:
来做到这一点CvInvoke.cvZero(imgr);
然后你应该至少引入第二个“课程”。因此,您可以绘制具有不同坐标的第二个圆(属于背景的东西)。为了安全起见,对第一个圆圈使用不同的灰色值(例如new Gray(100)
)而不是第二个圆圈(例如new Gray(200)
)。
最后,您将在掩码文件imgr中得到结果,两个类显示在不同的灰度值中。
我不确定你需要ROI位......
答案 1 :(得分:1)
而不是:
bmF= imgr.ToBitmap();
试试这个:
bmF= imgr.Convert<Gray,byte>().ToBitmap();