裁剪和旋转图片OpenCV
我是OpenCV的新手,所以请宽容一点。裁剪和旋转图片OpenCV,opencv,rotation,crop,Opencv,Rotation,Crop,我是OpenCV的新手,所以请宽容一点。 我正在做一个Android应用程序来识别正方形/矩形并裁剪它们。查找正方形/矩形的函数将找到的对象放置到向量>正方形。我只是想知道如何根据矢量>正方形中存储的点数据裁剪图片,以及如何计算图片旋转的角度。谢谢你的帮助周围有很多有用的帖子,我相信你可以做得更好 作物: 轮换: 计算角度: 这篇文章引用的是 有一篇关于旋转和倾斜图像的很棒的文章。这还显示了如何提取RotatedRect中的数据: 基本上,您只需要获得仿射变换的旋转矩阵,
我正在做一个Android应用程序来识别正方形/矩形并裁剪它们。查找正方形/矩形的函数将找到的对象放置到向量>正方形。我只是想知道如何根据矢量>正方形中存储的点数据裁剪图片,以及如何计算图片旋转的角度。谢谢你的帮助周围有很多有用的帖子,我相信你可以做得更好 作物:
- 这篇文章引用的是
有一篇关于旋转和倾斜图像的很棒的文章。这还显示了如何提取RotatedRect中的数据:
//这是RotatedRect,我从一个轮廓中得到它,例如。。。
RotatedRect=。。。;
//我们将使用矩阵
垫M,旋转,裁剪;
//从边界框中获取角度和大小
浮动角度=矩形角度;
Size rect_Size=rect.Size;
//多亏了http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/
如果(直角<-45.){
角度+=90.0;
交换(rect_size.width、rect_size.height);
}
//得到旋转矩阵
M=getRotationMatrix2D(直线中心,角度,1.0);
//在src中对图像执行仿射变换,
//结果是在“已旋转”中旋转图像。我在做什么
//这里是三次插值
翘曲仿射(src,旋转,M,src.size(),INTER_CUBIC);
//裁剪生成的图像,然后在“裁剪”中给出
getRectSubPix(旋转、矩形大小、矩形中心、裁剪);
尽管这个问题已经很老了,但我认为需要一个不需要像旋转整个图像那样昂贵的答案(参见@bytefish的答案)。你需要一个边界矩形,因为某种原因,rotatedRect.boundingRect()
对我不起作用,所以我不得不使用Imgproc.boundingRect(轮廓)
。这是适用于Android的OpenCV,其他环境的操作几乎相同:
Rect roi = Imgproc.boundingRect(contour);
// we only work with a submat, not the whole image:
Mat mat = image.submat(roi);
RotatedRect rotatedRect = Imgproc.minAreaRect(new MatOfPoint2f(contour.toArray()));
Mat rot = Imgproc.getRotationMatrix2D(rotatedRect.center, rotatedRect.angle, 1.0);
// rotate using the center of the roi
double[] rot_0_2 = rot.get(0, 2);
for (int i = 0; i < rot_0_2.length; i++) {
rot_0_2[i] += rotatedRect.size.width / 2 - rotatedRect.center.x;
}
rot.put(0, 2, rot_0_2);
double[] rot_1_2 = rot.get(1, 2);
for (int i = 0; i < rot_1_2.length; i++) {
rot_1_2[i] += rotatedRect.size.height / 2 - rotatedRect.center.y;
}
rot.put(1, 2, rot_1_2);
// final rotated and cropped image:
Mat rotated = new Mat();
Imgproc.warpAffine(mat, rotated, rot, rotatedRect.size);
Rect roi=Imgproc.boundingRect(轮廓);
//我们只使用submat,而不是整个图像:
Mat-Mat=image.submat(roi);
RotatedRect RotatedRect=Imgproc.minareact(新的MatOfPoint2f(contour.toArray());
Mat rot=Imgproc.getRotationMatrix2D(rotatedRect.center,rotatedRect.angle,1.0);
//使用roi的中心进行旋转
double[]rot_0_2=rot.get(0,2);
for(int i=0;i
我在iphone实时视频流中面临裁剪问题。。你能看一下我的帖子吗?虽然答案几乎是正确的,但这会在剪切之前旋转你的整个图像。那里的运营成本很高。