旋转图片中的 ROI

Posted

技术标签:

【中文标题】旋转图片中的 ROI【英文标题】:Rotate ROI in a picture 【发布时间】:2016-07-07 16:19:47 【问题描述】:

鉴于用例,我想在特定图像中旋转 ROI。例如,我在图像中预定义了边界框,现在的任务是代表一个角度旋转这些框内的图像部分。

此外,旋转必须在边界框内,因此 ROI 是在变换裁剪之后。

我尝试使用创建边界框的子图像的方法,而不是旋转它并将其放回源图像中的原始位置。问题是,我有一个巨大的图像数据集(> 100.000),我认为我的方法可能会减慢这个过程。

还有其他方法可以完成这种转换吗?

编辑:为了更好地理解

这是一个快速的模型,它应该如何看待转换。

【问题讨论】:

您可以更精确地描述所需结果。一两个数字? 到目前为止,您甚至没有提供任何有关您如何做到这一点的详细信息。多久时间?什么是慢?你认为什么会很快?哪个角度? @Cheersandhth.-Alf 我添加了两张图片。 @Piglet 我没有测试速度,因为我评估了解决问题的可能性。如果我一开始不需要提取 ROI,也许会更快。 要旋转图像,您必须创建该图像的副本,因为您无法读取和写入同一图像。你会覆盖未处理的像素。如果您提取 ROI(深拷贝)并旋转该子图像,您将创建该子图像的副本,仅用于旋转。由于您的子图像已经是原始图像的副本,您可以保存一个深层副本并将旋转结果直接写入完整图像。总之,这两种方式都应该很快。这是一次性工作吗? 【参考方案1】:
Mat rotateMatImage (Mat& src, double angle ,Mat& cdst) 

//  Rotate the angle which using warpAffine Methods
Mat rot_mat;
Mat rotated;
cv::Point2f src_center(cdst.cols/2.0F, cdst.rows/2.0F);
rot_mat = getRotationMatrix2D(src_center, angle, 1.0);

warpAffine(src, rotated, rot_mat, cdst.size(), cv::INTER_CUBIC);

return rotated;

参考文档http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html?highlight=warpaffine

【讨论】:

【参考方案2】:

如果您使用 cv::Mat,yourMat(yourRect) 将为您提供应旋转的图像的 ROI。最快的方法是计算将 ROI 的四个角旋转到目标点所需的仿射变换,然后将变换应用于 ROI。使用 ROI 选择和仿射变换比自己进行像素操作要快得多,但我不确定是否有比使用仿射变换更快的方法。

【讨论】:

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

html5如何让图片3d旋转

如何旋转容器中的背景图片?

如何用javascript中的canvas让图片自己旋转

如何设置word中图片旋转的键盘快捷键-向右旋转90度???

gif动态图片画面怎么旋转 怎么将下图画面转正?

如何在模板匹配中找到 ROI 内对象的旋转?