Как вырезать и снять среднюю часть с коврика? - PullRequest
0 голосов
/ 03 апреля 2019

Может ли mat или umat иметь нулевые значения в середине? Мне нужно, чтобы он вел себя как формат .png. Если нет, как я могу достичь этой цели? Мат и Умат для меня ведут себя как прямоугольник.

Я пробовал метод копирования прямоугольника, метод grabcut, но ни один из методов не работает правильно.

Я начал код как показано ниже:

Bitmap bmpUImage = new Bitmap(plotBox.Image);
Image<Bgr, Byte> uimage = new Image<Bgr, byte>(bmpUImage);
UMat input = uimage.ToUMat();

Мат или umat действуют как .png, имея некоторые значения выреза / нуля в средней части изображения.

1 Ответ

0 голосов
/ 03 апреля 2019
///////////////// add black as transparency /////////////////
        Bitmap bmpUImage = new Bitmap(plotBox_Method.Image);

        Mat output = new Mat();
        Mat Shading_Image = new Image<Bgr, byte>(bmpUImage).Mat;

        // puting a black rectangle for transparent area later
        Shading_Image.CopyTo(output);
        CvInvoke.Rectangle(output, mask_rect, new MCvScalar(0,0,0), -1);

        Mat imageMat = output;
        Mat finalMat = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 4);
        Mat tmp = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);
        Mat alpha = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);

        CvInvoke.CvtColor(imageMat, tmp, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
        CvInvoke.Threshold(tmp, alpha, 0, 255, Emgu.CV.CvEnum.ThresholdType.Binary);

        CvInvoke.Imshow("alpha", alpha);

        VectorOfMat rgb = new VectorOfMat(3);

        CvInvoke.Split(imageMat, rgb);

        Mat[] rgba = { rgb[0], rgb[1], rgb[2], alpha };

        VectorOfMat vector = new VectorOfMat(rgba);

        CvInvoke.Merge(vector, finalMat);

        imgPlot.Image = finalMat.ToImage<Bgra, Byte>().ToBitmap(); 
        ///////////////// end of add black as transparency /////////////////
...