Emgu裁剪图像,裁剪错误区域

时间:2019-05-29 04:42:38

标签: c# image crop emgucv

我正在使用emgu库进行练习,尝试裁剪和图像以稍后应用另一个filtesre或搜索,问题是我用鼠标选择了一个矩形,在ImageBox(Emgu组件)中选择了SizeMode属性中的zoom,并将裁剪后的图片加载到另一个图像框中,但结果始终是我选择的区域的一点。

我用GIMP检查了计算,发现矩形没问题,所以我不知道是什么问题

Point f1=scaleCalculation(firstPoint, pIma.Size, imOri.Size);
Point f2= scaleCalculation(secondPoint, pIma.Size, imOri.Size);
imGray.ROI = new Rectangle(Math.Min(f1.X, f2.X), Math.Min(f1.Y, f2.Y)
                        , Math.Abs(f1.X - f2.X), Math.Abs(f1.Y-f2.Y));
imOri.ROI = imGray.ROI;
pRec.Image = imOri.Copy();
imOri.ROI = new Rectangle();

这是函数

        private Point scaleCalculation(Point real, Size pBox, Size imCalc) {

        double scale, spare;

        try {
            if (imCalc.Height > imCalc.Width){
                scale = (double) imCalc.Height/ pBox.Height  ;
                spare =  pBox.Width-((imCalc.Width / scale));
                var x = ((real.X * scale) -(spare/4));
                x = (x < 0) ? 0 : x;
                return new Point((int) x, (int)(real.Y * scale));
            }
            else {
                scale = (double) imCalc.Width/ pBox.Width ;
                spare = pBox.Height - ((imCalc.Height / scale));
                var y = ((real.Y * scale) - (spare /4));
                y = (y < 0) ? 0 : y;
                return new Point((int)(real.X * scale), (int) y);
            }
        }
        catch (Exception ex) {
            return new Point();
        }
    }

enter image description here

1 个答案:

答案 0 :(得分:0)

看了一会儿,我发现问题出在秤计算功能上。

        private Point scaleCalculation(Point real, Size pBox, Size imCalc) {

        double scale, spare;

        try {
            if (imCalc.Height > imCalc.Width){
                scale = (double)imCalc.Height / pBox.Height;
                spare = (pBox.Width - (imCalc.Width / scale)) / 2;  
                var x = (real.X - spare);
                x = (x < 0) ? 0 : x;
                return new Point((int)(x * scale), (int)(real.Y * scale));
            }
            else {
                scale = (double)imCalc.Width / pBox.Width;
                spare = (pBox.Height - (imCalc.Height/scale))/2;
                var y = (real.Y - spare);
                y = (y < 0) ? 0 : y;
                return new Point((int)(real.X * scale),(int) (y *scale));
            }
        }
        catch (Exception ex) {
            return new Point();
        }
    }

我将尝试在图片的帮助下进行解释。

(Xr,Yr):我们想知道的坐标。 (Xm,Ym):鼠标的坐标。 (Wi,Hi):图片大小。 (Wp,Hp):ImageBox的大小。 S:从图片框的边缘到图片的间隔。

Xr = (Xm * scale)
S = [Hp -(Hi/scale)]/2
Yr = (Ym-S)

(这是当宽度大于高度时的解释)

首先,我要根据宽度或高度取较大的比例来计算比例。

要计算S(备用),必须将图像的高度缩放到Imagebox的高度,将其从Imagebox的高度中减去,然后将结果除以2,得到的值只有一个大小。

从Ym(Real.Y)中减去备用值以计算y。并检查结果是否为负。

最后,结果是Xm和y分别乘以比例

enter image description here