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

C# Emgu裁剪图像,裁剪错误区域,c#,image,crop,emgucv,C#,Image,Crop,Emgucv,我正在练习emgu库,尝试裁剪和图像以稍后应用另一个过滤器搜索,问题是我用鼠标选择一个矩形,在ImageBox(emgu组件)中选择放大SizeMode属性,并将裁剪图片加载到另一个ImageBox中,但结果总是比我选择的区域高一点 我用GIMP检查了计算,我可以看到矩形是正确的,所以我不知道问题出在哪里 Point f1=scaleCalculation(firstPoint, pIma.Size, imOri.Size); Point f2= scaleCalculation(secondP

我正在练习emgu库,尝试裁剪和图像以稍后应用另一个过滤器搜索,问题是我用鼠标选择一个矩形,在ImageBox(emgu组件)中选择放大SizeMode属性,并将裁剪图片加载到另一个ImageBox中,但结果总是比我选择的区域高一点

我用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();
        }
    }
专用点比例计算(点实数、大小pBox、大小imCalc){
双刻度,备用;
试一试{
如果(计算高度>计算宽度){
比例=(双)计算高度/pBox.高度;
备用=pBox.宽度-((计算宽度/刻度));
var x=((real.x*比例)-(备用/4));
x=(x<0)?0:x;
返回新点((int)x,(int)(real.Y*scale));
}
否则{
比例=(双)imCalc.Width/pBox.Width;
备用=pBox.高度-((计算高度/刻度));
变量y=((真实y*比例)-(备用/4));
y=(y<0)?0:y;
返回新点((int)(real.X*scale),(int)y);
}
}
捕获(例外情况除外){
返回新点();
}
}

经过一段时间的查找,我发现问题出在scalecalculation函数中

        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();
        }
    }
(此解释适用于宽度大于高度时)

我做的第一件事是使用宽度或高度计算比例,取决于哪个更大

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

从Ym(Real.Y)中减去备用项以计算Y。检查结果是否为阴性

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


经过一段时间的查找,我发现问题出在scalecalculation函数中

        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();
        }
    }
(此解释适用于宽度大于高度时)

我做的第一件事是使用宽度或高度计算比例,取决于哪个更大

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

从Ym(Real.Y)中减去备用项以计算Y。检查结果是否为阴性

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