Opencv 图像旋转:透视变换还是Affline变换?
我想将下面的图像在中心旋转20度。 我可以通过两种不同的方式在OpenCV中实现这一点: 1.透视变换 2.仿射变换Opencv 图像旋转:透视变换还是Affline变换?,opencv,image-processing,Opencv,Image Processing,我想将下面的图像在中心旋转20度。 我可以通过两种不同的方式在OpenCV中实现这一点: 1.透视变换 2.仿射变换 旋转图像的首选方式是什么 这取决于:你是转头还是旋转纸张?对于纯旋转,仿射似乎更适合;通过透视变换旋转似乎是一种副作用。代码也更简单。@bicker我想旋转paper@MarkRansom我同意仿射的代码更简单,但让我惊讶的是,在透视变换的情况下,输出图像的质量比仿射的好。我的意思是,仿射的输出图像看起来很模糊。这是预期的还是我做错了什么?…仿射输出的图像似乎很模糊啊,所以我们
旋转图像的首选方式是什么 这取决于:你是转头还是旋转纸张?对于纯旋转,仿射似乎更适合;通过透视变换旋转似乎是一种副作用。代码也更简单。@bicker我想旋转paper@MarkRansom我同意仿射的代码更简单,但让我惊讶的是,在透视变换的情况下,输出图像的质量比仿射的好。我的意思是,仿射的输出图像看起来很模糊。这是预期的还是我做错了什么?…仿射输出的图像似乎很模糊啊,所以我们终于找到了真正的问题使用透视变换输出的图像质量是否更好?如果您正在执行等效的转换,我希望不会。总而言之,我同意@MarkRansom;仿射变换对于您要实现的目标似乎更为自然。
public void perspectiveXformation(String imgPath, List<Point> sourceCorners,
List<Point> targetCorners) {
// Load image in gray-scale format
Mat matIncomingImg = Highgui.imread(imgPath, 0);
// Check if size of list, process only if there are four points in list.
if (sourceCorners.size() == 4) {
// Convert vector points into Mat type of object.
Mat sourceCornersMat =
Converters.vector_Point2f_to_Mat(sourceCorners);
Mat targetCornersMat =
Converters.vector_Point2f_to_Mat(targetCorners);
Mat matResultant = new Mat();
// Do the Perspective transformation
Mat matPtransform =
Imgproc.getPerspectiveTransform(sourceCornersMat,
targetCornersMat);
Imgproc.warpPerspective(matIncomingImg, matResultant,
matPtransform,
new Size(targetCorners.get(2).x, targetCorners.get(2).y));
Highgui.imwrite("/tmp/perspectiveXform.png", matResultant);
}
}
public void afflineXformation(String imgPath, Point center) {
Mat selectedMat = Highgui.imread(imgPath, 0);
Mat res = Imgproc.getRotationMatrix2D(center, 20, 1.0);
Mat newMat = new Mat();
Imgproc.warpAffine(selectedMat, newMat, res, selectedMat.size());
Highgui.imwrite("/tmp/afflineXform.png", newMat);
}