我在 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 时是错误的。
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);
我是一名优秀的程序员,十分优秀!