在opencv中裁剪旋转图像

Cropping a rotated image in opencv

本文关键字:旋转 图像 裁剪 opencv      更新时间:2023-10-16

好的,所以我有问题裁剪我的旋转图像在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);

老实说,我从来没有使用过getRectSubPix,所以我不知道到底是什么错了,但是…为什么不接受投资回报率呢?带有cv::Mat类的c++ API非常方便。

这里是一个文档,您可以使用cv::Mat的重载函数调用操作符进行ROI(如果您还不知道的话,这是一个感兴趣的区域)

无论如何,这是一个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属性