Emgu裁剪图像,裁剪错误区域
Emgu crop image, crop wrong area
我正在练习 emgu 库,尝试裁剪和图像以稍后应用另一个滤镜或搜索,问题是我 select 用鼠标在 ImageBox(Emgu 组件)中创建一个矩形 selected 缩放 SizeMode 属性,并将裁剪图片加载到另一个图像框中,但结果总是比我 selected 的区域高一点。
我用 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();
}
}
看了一会儿,发现是比例计算函数的问题。
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: Space 形成Imagebox到图片的边缘。
Xr = (Xm * scale)
S = [Hp -(Hi/scale)]/2
Yr = (Ym-S)
(这个解释是width大于height的时候)
我首先做的是使用宽度或高度计算比例,具体取决于哪个较大。
要计算 S(备用)图像的高度必须缩放到图像框的高度,从图像框高度中减去它并将结果除以 2,结果只有一个尺寸的值。
从 Ym (Real.Y) 中减去余量来计算 y。并检查结果是否为负。
最后的结果是Xm和y分别乘以比例
我正在练习 emgu 库,尝试裁剪和图像以稍后应用另一个滤镜或搜索,问题是我 select 用鼠标在 ImageBox(Emgu 组件)中创建一个矩形 selected 缩放 SizeMode 属性,并将裁剪图片加载到另一个图像框中,但结果总是比我 selected 的区域高一点。
我用 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();
}
}
看了一会儿,发现是比例计算函数的问题。
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: Space 形成Imagebox到图片的边缘。
Xr = (Xm * scale)
S = [Hp -(Hi/scale)]/2
Yr = (Ym-S)
(这个解释是width大于height的时候)
我首先做的是使用宽度或高度计算比例,具体取决于哪个较大。
要计算 S(备用)图像的高度必须缩放到图像框的高度,从图像框高度中减去它并将结果除以 2,结果只有一个尺寸的值。
从 Ym (Real.Y) 中减去余量来计算 y。并检查结果是否为负。
最后的结果是Xm和y分别乘以比例