在opencv中裁剪旋转的图像

时间:2014-03-25 18:47:34

标签: c++ image opencv

好的,所以我在opencv中裁剪旋转的图像时遇到问题。首先,将数据输入minAreaRect的数组的顺序排序是否重要?如果没有,那么我不知道我的代码有什么问题,但是一旦我裁剪旋转的图像,裁剪的图像就只是一个黑色方块。我假设因为我的盒子不知何故错了。无论如何,这是我的代码。编辑:我的方法很好问题是我对于roi的观点是错误的。

                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);

1 个答案:

答案 0 :(得分:1)

老实说,我从来没有使用过getRectSubPix,所以我不知道到底出了什么问题,但是......为什么不采用roi?具有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属性。