我尝试使用Simulink中的MATLAB功能块对视频应用几何变换 . 我将“从多媒体文件”块连接到MATLAB功能块,并将其输出连接到“到视频显示”块 . 内部MATLAB功能块此代码:
function outputImage = fcn(inputImage,theta)
coder.extrinsic('affine2d')
coder.extrinsic('imwarp')
outputImage = coder.nullcopy(inputImage);
tform = affine2d([cosd(theta) -sind(theta) 0; sind(theta) cosd(theta) 0; 0 0 1]);
outputImage = imwarp(inputImage,tform);
其中角度theta是10的常量块 . 上面的代码是来自'affine2d'函数示例的示例 . 它返回以下错误:
Size mismatch for MATLAB expression 'imwarp'. Expected = 120x160x3 Actual = 146x179x3 Block MATLAB Function (#108) While executing: State During Action
但我不明白错误在哪里(为什么实际= 146x179x3) . 输入视频是来自CV工具箱演示的RGB视频文件('vipmen.avi') .
EDIT: 我解决了它:我使用 Apply Geometric Transformation
块进行翻译,使用 Rotate
块进行旋转:
H = [1 0; 0 1; Ox-X Oy-Y] %where Ox,Oy are image framework origin coordinates and X,Y are offset coordinates.
实际上,在翻译之后,"new"图像框架原点是(X,Y)点, Rotate
块围绕(X,Y)旋转它 .
3 回答
计算机视觉系统工具箱包含一个名为Apply Geometric Transformation的块,它可以满足您的需求并省去了使用MATLAB功能块的麻烦 .
Edit: 自R2015b版本起,不推荐使用Apply Geometric Transformation块 . 请改用Warp块 .
当图像被扭曲/旋转时,其中的行和/或列的数量将改变 .
您需要修改代码,以便outputImage的大小可变 . 为此,请在编辑器中打开代码(用于MATLAB功能块)并打开“编辑数据”对话框 . 然后在左侧列中选择outputImage
选中"variable size"复选框
输入类似[400 400 3]的大小
您必须对您期望的最大行和列大小做出最佳猜测 .
另请注意,Matlab功能块必须具有离散的采样时间才能使用可变大小的信号 . 要设置此项,请右键单击该块并选择“块参数”,然后设置采样时间 .
我试图了解发生了什么 . 变形图像的尺寸与
Output=coder.nullcopy(X)
不同,因此我计算了新变形图像的尺寸,使用Output=coder.nullcopy(ones(new_row,new_colomn,3))
创建了一个空白图像