在opencv中裁剪旋转图像

Posted

技术标签:

【中文标题】在opencv中裁剪旋转图像【英文标题】:Cropping a rotated image in opencv 【发布时间】:2014-03-25 18:47:33 【问题描述】:

好的,所以我在 opencv 中裁剪旋转图像时遇到问题。首先,点在数组中输入 minAreaRect 的顺序是否重要?如果不是,那么我不知道我的代码有什么问题,但是一旦我裁剪旋转的图像,裁剪的图像就只是一个黑色方块。我假设是因为我的盒子在某种程度上是错误的。无论如何,这是我的代码。编辑:我的方法很好问题是我的投资回报率是错误的。

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

【问题讨论】:

为什么不参加投资回报率? 矩形的坐标是多少?你能运行 Point2f pts[4]; rect.points(pts);并打印 pts 以确保它们在您的 Mat 范围内(如果您的原始点云太靠近边界,它们可能是负数)。 nkint - roi 不是旋转的矩形。它的边与坐标轴对齐,这并不总是你想要的。 【参考方案1】:

老实说,我从未使用过 getRectSubPix,所以我不知道到底出了什么问题,但是.. 为什么不采取 roi?带有cv::Mat 类的 C++ API 对此非常方便..

这是一个documentation,你可以用cv::Mat的重载函数调用运算符来获取一个ROI(如果你还不知道,那就是一个感兴趣的区域)

无论如何,这里有一个用于获取 ROI 的 sn-p

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,0:img.cols,0:img.cols,img.rows:0,img .rows) 作为输入 minAreaRect 的点,我猜这是错误的,尽管我不知道应该使用什么点。 对不起,如果这完全是另一个问题,我认为最好打开一个新问题.. (这篇文章能回答你的第一个问题吗?)

以上是关于在opencv中裁剪旋转图像的主要内容,如果未能解决你的问题,请参考以下文章

Python深度学习:OpenCV图像处理实战 HSV处理,图像旋转平移(读书笔记)

OpenCV Python实现旋转矩形的裁剪

在opencv中创建透明图像

裁剪和旋转图片 OpenCV

旋转图像并裁剪黑色边框

OpenCV新手入门,如何用它平移缩放和旋转图片