2014-03-25 107 views
2

好吧,我有问题在opencv中裁剪我的旋转图像。首先,数组中的点在馈入minAreaRect中的顺序是否重要?如果没有,那么我不知道我的代码有什么问题,但只要我裁剪旋转的图像,裁剪后的图像只是一个黑色方块。我假设,因为我的盒子是错误的。无论如何,这里是我的代码。编辑:我的方法是好的问题是我的观点是错误的。在opencv中裁剪一个旋转的图像

   int len = max(ImageAd.cols, ImageAd.rows); 
      cv::Point2f pt(len/2., len/2.); 
      cv:: Mat r = cv::getRotationMatrix2D(pt, -angled, 1.0); 
      cv::warpAffine(ImageAd, ImageAd, r, ImageAd.size(), INTER_CUBIC); 
      vector<cv::Point> points; 
      points.push_back(Pt3); 
      points.push_back(Pt4); 
      points.push_back(Pt1); 
      points.push_back(Pt2); 

      cv::RotatedRect box = cv::minAreaRect(cv::Mat(points)); 
      cv::Size box_size = box.size; 

      cv::getRectSubPix(ImageAd, box_size, box.center, ImageAd); 
      cv::imshow("cropped", ImageAd); 
+0

为什么不采取roi? – nkint

+0

矩形的坐标是什么?你可以运行Point2f pts [4]; rect.points(PTS);并打印点以确保它们位于垫子范围内(如果您的原始点云太靠近边界,则它们可能为负值)。 – Vlad

+0

nkint - roi不是旋转矩形。它的边与坐标轴对齐,这并不总是你想要的。 – Vlad

回答

1

老实说,我从来没有使用过getRectSubPix,所以我不知道到底什么是错的,但..为什么不只是没有采取投资回报率?与cv::Mat类C++ API是非常方便的对这个..

这里是一个documentation,你可以采取的投资回报率(即利息的区域,如果你不知道它)与重载函数调用操作符cv::Mat

反正这里是取ROI

cv::Mat img = …; 
cv::Mat subImg = img(cv::Rect(0, 0, 100, 100)); 
cv::Mat subImg = img(cv::Range(0, 0), cv::Range(100, 100)); 

片段你有一个cv::RotatedRect这样你就可以直接使用RotatedRect::boundingRect属性。

+0

好的,谢谢,看起来确实是一个更好的方法。 – OneTwo

+0

但我还有一个问题。我认为这个问题实际上是我所拥有的点是错误的。我使用了原始非旋转图像的四个角(0,0:img.cols,0:img.cols,img.rows:0,img .rows)作为馈入minAreaRect的点,我猜测是错误的,尽管我不知道我应该使用什么点。 – OneTwo

+0

抱歉,但我认为如果这完全是另一个问题,最好打开一个新问题。 – nkint