使用MATLAB功能块进行几何变换

时间:2014-02-08 21:34:52

标签: matlab computer-vision simulink matlab-cvst

我尝试使用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')。

编辑:我解决了这个问题:我使用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. 

确实在翻译之后,“新”图像框架原点是(X,Y)点,Rotate块围绕(X,Y)旋转。

3 个答案:

答案 0 :(得分:3)

当图像变形/旋转时,其中的行数和/或列数将发生变化。

您需要修改代码,以便outputImage的大小可变。 为此,请在编辑器中打开代码(用于MATLAB功能块)并打开“编辑数据”对话框。 在左侧列中选择outputImage,然后选择

  1. 选中“可变大小”复选框
  2. 输入类似[400 400 3]的大小
  3. 您必须对您期望的最大行数和列数进行最佳猜测。

    另请注意,Matlab功能块必须具有离散的采样时间才能使用可变大小的信号。 要设置此项,请右键单击该块并选择“块参数”,然后设置采样时间。

答案 1 :(得分:3)

计算机视觉系统工具箱包含一个名为Apply Geometric Transformation的块,它可以满足您的需求并省去使用MATLAB功能块的麻烦。

修改 自R2015b版本起,不推荐使用Apply Geometric Transformation块。请改用Warp块。

答案 2 :(得分:0)

我试图了解会发生什么。变形图像的尺寸与Output=coder.nullcopy(X)不同,因此我计算了新变形图像的尺寸,使用Output=coder.nullcopy(ones(new_row,new_colomn,3))创建了一个空白图像并且可以正常工作