在opencv2中将仿射变换应用于图像时出现错误

3

我在Java中使用warpAffine函数对图像进行了去斜校正,但运行时出现以下提示:

OpenCV Error: Assertion failed ((M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 2 && M0.cols == 3) in warpAffine

这是我的函数:
private  Mat deskew(Mat image,boolean negated){
        if(!negated) {
            for (int row = 0; row < image.rows(); row++) {
                for (int col = 0; col < image.cols(); col++) {
                    double value = 255 - image.get(row, col)[0];
                    image.put(row, col, value);
                }
            }
        }
        Moments m = Imgproc.moments(image);
        if(Math.abs(m.get_m02()) < 1e-2) {
            return image;
        }
        double skew = m.get_m11() / m.get_m02();
        int rows = 2,cols = 3;
        Size size = new Size(rows,cols);

        Mat M = new Mat(size,CvType.CV_32F);
        M.put(0, 0, 1.0);
        M.put(0, 1, skew);
        M.put(0, 2, -0.5*image.rows()*skew);
        M.put(1, 0, 0.0);
        M.put(1, 1, 1.0);
        M.put(1, 2, 0.0);
        Mat imagedst = new Mat();
        Imgproc.warpAffine(image, imagedst, M, image.size(),Imgproc.WARP_INVERSE_MAP|Imgproc.INTER_LINEAR);
        return imagedst;
    }

我认为当我使用CvType.CV_32F类型初始化Mat M时是错误的。
1个回答

2
< p > M 的大小有误。

Size 需要 (width, height),而不是 (rows, cols)。因此,您需要将 size 创建为:

Size size = new Size(cols,rows);
Mat M = new Mat(size, CvType.CV_32F);

你可以将M创建为:

Mat M = new Mat(rows, cols, CvType.CV_32F);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接