0

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();
    }
4

2 に答える 2

2

流域用のマスク ファイル (つまり、imgr) をより適切に準備する必要があります。

この目的のために、最初にすべてをゼロに設定する必要があります。これを行うには、次のように呼び出します。

CvInvoke.cvZero(imgr);

次に、少なくとも 2 番目の「クラス」を導入する必要があります。したがって、異なる座標 (背景に属するもの) で 2 番目の円を描くことができます。安全のために、最初の円 (例: new Gray(100)) には 2 番目の円 (例: ) とは異なるグレー値を使用しnew Gray(200)ます。

最後にマスク ファイル imgr に結果が表示され、2 つのクラスが異なるグレー値で表示されます。

ROIビットが必要かどうかはよくわかりません...

于 2012-06-13T12:44:34.370 に答える
1

それ以外の:

bmF= imgr.ToBitmap();

これを試して:

bmF= imgr.Convert<Gray,byte>().ToBitmap();
于 2012-01-02T04:32:37.257 に答える