我的应用程序:我正在尝试旋转图像(使用OpenCV和Python)

目前我开发了以下代码,用于旋转输入图像,用黑色边框填充它,给我A.我想要的是B - 旋转图像中最大可能区域裁剪窗口.我称之为轴对齐的边界框.
这与旋转和裁剪基本相同,但是我无法得到关于该问题的答案.此外,该答案显然仅对方形图像有效.我的图像是矩形的.
代码给A:
import cv2
import numpy as np
def getTranslationMatrix2d(dx, dy):
"""
Returns a numpy affine transformation matrix for a 2D translation of
(dx, dy)
"""
return np.matrix([[1, 0, dx], [0, 1, dy], [0, 0, 1]])
def rotateImage(image, angle):
"""
Rotates the given image about it's centre
"""
image_size = (image.shape[1], image.shape[0])
image_center = tuple(np.array(image_size) / 2)
rot_mat = np.vstack([cv2.getRotationMatrix2D(image_center, angle, 1.0), [0, 0, 1]])
trans_mat = np.identity(3)
w2 = image_size[0] * 0.5
h2 …Run Code Online (Sandbox Code Playgroud) 什么是最有效的算法找到适合空白区域的最大面积的矩形?
假设屏幕看起来像这样('#'代表填充区域):
....................
..............######
##..................
.................###
.................###
#####...............
#####...............
#####...............
Run Code Online (Sandbox Code Playgroud)
一个可能的解决方案是:
....................
..............######
##...++++++++++++...
.....++++++++++++###
.....++++++++++++###
#####++++++++++++...
#####++++++++++++...
#####++++++++++++...
Run Code Online (Sandbox Code Playgroud)
通常我会喜欢找出解决方案.虽然这次我想避免浪费时间自己摸索,因为这对我正在研究的项目有实际用途.有一个众所周知的解决方案吗?
Shog9写道:
您的输入是一个数组(如其他响应所暗示的那样),还是一个以任意大小的定位矩形形式的遮挡列表(在处理窗口位置时窗口系统中可能就是这种情况)?
是的,我有一个跟踪屏幕上放置的一组窗口的结构.我还有一个网格,可以跟踪每条边之间的所有区域,无论它们是空的还是填充的,以及它们左边或顶边的像素位置.我认为有一些修改后的形式可以利用这个属性.你知道吗?
参考我目前正在构建的这个编程游戏.
alt text http://img12.imageshack.us/img12/2089/shapetransformationf.jpg
要在WPF中翻译Canvas,我使用两个表单:( TranslateTransform移动它)和RotateTransform(旋转它)[ 相同的子节点 TransformationGroup ]
我可以很容易地获得画布的左上角x,y坐标,当它没有旋转(或旋转90度,因为它将是相同的),但我面临的问题是左上角(和其他3点)坐标.
这是因为当RotateTransform应用a 时,TranslateTransform's X和Y属性不会改变(因此仍然表明正方形的左上角就像点状正方形(来自图像)
Canvas正在从它的中心旋转,因此它就是它的起源.
那么如何在旋转后获得4个点的"新"x和y坐标?
[UPDATE]
alt text http://img25.imageshack.us/img25/8676/shaperotationaltransfor.jpg
我找到了找到左上角的方法通过将旋转中的OffsetX和OffsetY添加到起始X和Y坐标,在旋转后坐标的方法(从新图像中可以看到).
但我现在无法找出其余的坐标(另外3个).
通过这种旋转的形状,我如何计算其余3个角的x和y坐标?
[编辑]
第二张图片中的点不准确和精确点.我在脑海中估计了这一点.
[更新]解决方案:
首先,我要感谢Jason S.这篇冗长且非常翔实的文章,其中他描述了整个过程背后的数学; 通过阅读你的帖子和尝试价值观,我当然学到了很多东西.
但我现在已经找到了一个代码片段(感谢EugeneZ的提及TransformBounds),它完全符合我的要求:
public Rect GetBounds(FrameworkElement of, FrameworkElement from)
{
// Might throw an exception if of and from are not in the same visual tree
GeneralTransform transform = …Run Code Online (Sandbox Code Playgroud) ImageMagick的转换工具中的旋转选项可旋转图像,但会添加背景颜色以填补空白.
我正在寻找一种旋转的方法,然后裁剪包含图像内容的最大矩形.转换是否可能?
Mark Setchell编辑...
所以,如果你的原始矩形是一个像这样创建的棋盘:
convert -size 512x512 pattern:checkerboard a.png
Run Code Online (Sandbox Code Playgroud)

然后像这样将它旋转20度
convert -background fuchsia -rotate 20 a.png b.png
Run Code Online (Sandbox Code Playgroud)

你想要最大的矩形适合棋盘并且不包含粉红色?
我正在使用PHP旋转和裁剪图像,但我显示黑色边框,我知道你可以改变背景颜色,但我想旋转并裁剪图像以填充整个图像.基本上类似于background-size: cover;(左)CSS和background-size: contain;(右).
看下图,右边是我现在得到的,左边是我想要达到的.旋转的度数是动态的,要生成的图像和源图像都是方形(200x200).

编辑:这是我的快速和脏代码:
$rotate = imagecreatefromjpeg($image);
// part of code created by www.thewebhelp.com, modified
$square_size = 200;
$original_width = imagesx($rotate);
$original_height = imagesy($rotate);
if($original_width > $original_height){
$new_height = $square_size;
$new_width = $new_height*($original_width/$original_height);
}
if($original_height > $original_width){
$new_width = $square_size;
$new_height = $new_width*($original_height/$original_width);
}
if($original_height == $original_width){
$new_width = $square_size;
$new_height = $square_size;
}
$new_width = round($new_width);
$new_height = round($new_height);
$smaller_image = imagecreatetruecolor($new_width, $new_height);
$square_image = imagecreatetruecolor($square_size, $square_size);
imagecopyresampled($smaller_image, $rotate, 0, 0, 0, 0, …Run Code Online (Sandbox Code Playgroud) 在画布上旋转后矩形的 Y 坐标。如图所示,矩形将在其中心点轴上旋转。旋转和画布恢复后,我想找到新的 X、Y 坐标,如第二张图像中所示,旋转点之前为 50,50,旋转后它们可能为 62,40。
我发现了类似的问题,所以我从那里拍摄了图像,但该问题适用于某些 WPF,而我的要求是 JS。旋转后如何找到矩形所有角的坐标?

