裁剪和旋转图片OpenCV

裁剪和旋转图片OpenCV,opencv,rotation,crop,Opencv,Rotation,Crop,我是OpenCV的新手,所以请宽容一点。 我正在做一个Android应用程序来识别正方形/矩形并裁剪它们。查找正方形/矩形的函数将找到的对象放置到向量>正方形。我只是想知道如何根据矢量>正方形中存储的点数据裁剪图片,以及如何计算图片旋转的角度。谢谢你的帮助周围有很多有用的帖子,我相信你可以做得更好 作物: 轮换: 计算角度: 这篇文章引用的是 有一篇关于旋转和倾斜图像的很棒的文章。这还显示了如何提取RotatedRect中的数据: 基本上,您只需要获得仿射变换的旋转矩阵,

我是OpenCV的新手,所以请宽容一点。
我正在做一个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实时视频流中面临裁剪问题。。你能看一下我的帖子吗?虽然答案几乎是正确的,但这会在剪切之前旋转你的整个图像。那里的运营成本很高。