функция водораздела, предоставляемая EmguCv - PullRequest
0 голосов
/ 17 декабря 2011

Я хочу использовать функцию водораздела, предоставленную 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();
    }

Ответы [ 2 ]

2 голосов
/ 13 июня 2012

Вам нужно лучше подготовить файл маски для водораздела (т. Е. Imgr).

Для этого вам нужно сначала установить все на ноль.Вы можете сделать это, позвонив по номеру:

CvInvoke.cvZero(imgr);

Тогда вам следует ввести хотя бы второй «класс».Следовательно, вы можете нарисовать второй круг с разными координатами (что-то, принадлежащее фону).Чтобы быть в безопасности, используйте другое значение серого для первого круга (например, new Gray(100)), чем для второго (например, new Gray(200)).

Вы получите свой результат в файле маски imgr наконец, с двумя классами, показывающими разные значения серого.

Я не совсем уверен, что вам нужен бит ROI ...

1 голос
/ 02 января 2012

Вместо:

bmF= imgr.ToBitmap();

Попробуйте это:

bmF= imgr.Convert<Gray,byte>().ToBitmap();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...