iam处理多尺度图像,3种尺寸:原始,半尺寸和双 我分别从每个组件中提取连接的组件,然后进行一些计算
最后我想要映射半角和半角的边界矩形。将原始图像中的原始位置和大小双重缩放连接组件
这是我的调整大小和重新定位边界矩形的代码
Matrix<int> src = new Matrix<int>(3, 2,3);
Matrix<int> dst = new Matrix<int>(3, 2,2);
IntPtr mat = CvInvoke.cvCreateMat(2, 3, MAT_DEPTH.CV_32F);
src[0,0]=componentBRect.X;
src[0,1]=componentBRect.Y ;
src[1,0]=componentBRect.Right;
src[1,1]=componentBRect.Y;
src[2,0]=componentBRect.X;
src[2,1]=componentBRect.Bottom;
CvInvoke.cvGetAffineTransform(img2, img, mat); //img is the original image & img2 has been resized to 1/2 imgWidth and 1/2 imgHeight
CvInvoke.cvTransform(src.Ptr, dst.Ptr, mat, IntPtr.Zero);
它应该让dst积分重新定位并重新定位 但不幸的是,再次返回相同的点,我认为getAffineTransform存在问题,因为它返回一个单位矩阵
mat=
|1 0 0 |
|0 1 0 | !!
任何建议?还是有另一种方法可以在不使用仿射变换的情况下做我想做的事情
提前致谢
答案 0 :(得分:1)
我已经解决了,
我只是找到了另一个功能 - 它是cvConvertScale
for (int i = 0; i < Brectangles.Count; i++) {
src[0, 0] = Brectangles[i].X; //top left
src[0, 1] = Brectangles[i].Y;
src[1, 0] = Brectangles[i].Right; //top right
src[1, 1] = Brectangles[i].Y;
src[2, 0] = Brectangles[i].X; //bottom left
src[2, 1] = Brectangles[i].Bottom;
CvInvoke.cvConvertScale(src, dst, rescaleFactor, 0); // rescaleFactor variable is 2 for half size & 0.5 for double size
temp.X = dst[0, 0];
temp.Y = dst[0, 1];
temp.Width = dst[1, 0] - dst[0, 0];
temp.Height = dst[2, 1] - dst[0, 1];
Brectangles[i] = temp;
}
它调整矩形的大小并将其重新定位在适当的位置是新的大小