使用cvTransform和cvGetAffineTransform openCv调整矩形大小



iam处理多尺度图像,有三种尺寸:原始、半&双重的我分别从每个组件中提取连接的组件,然后进行一些计算

最后我想映射半个&在原始图像中,将连接组件按两倍比例缩放到其原始位置和大小

这是我调整和重新定位边界矩形的代码

        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 | !!

有什么建议吗??或者有没有其他方法可以在不使用仿射变换的情况下完成我想要的操作

提前感谢

我已经解决了,

我只是找到了另一个功能——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;

         }

它调整矩形的大小并将其重新定位到新大小的正确位置

相关内容

  • 没有找到相关文章

最新更新