将图像作为参数从C#发送到matlab函数

时间:2016-04-09 13:39:38

标签: c# matlab matlab-deployment com-automation

我试图使用MLApp类,feval函数专门从C#调用MATLAB函数。

由于我是初学者,我通过互联网查看并找到了调用MATLAB函数的帮助。我只是简单地调用一个MATLAB函数,该函数将两个整数作为输入,MATLAB正确地返回求和和差值。但我真正需要这样做的原因是将图像发送到MATLAB函数并执行一些分析。

到目前为止,我还没能通过互联网找到任何有用的东西。如果是这样的话,可以用这个类将图像传递给MATLAB函数吗?如果没有其他方式吗?

MATLAB

function [x,y] = myfunc(a,b) 
  x = a + b; 
  y = a-b;

C#

MLApp.MLApp matlab = new MLApp.MLApp();
matlab.Execute(@"cd 'D:\Program Files\MATLAB\MATLAB Production Server\R2015a\bin'");
object result = null;
matlab.Feval("myfunc", 2, out result, 3, 2);
object[] res = result as object[];
Console.WriteLine(res[0]);
Console.WriteLine(res[1]);
Console.ReadLine();

1 个答案:

答案 0 :(得分:1)

一种简单的方法是将图像从C#应用程序保存到磁盘,然后调用MATLAB(使用COM Automation作为shown)来通过传递它来评估图像处理功能文件名为字符串。 MATLAB函数只需按名称加载图像,处理它,并将结果保存为另一个图像。然后将输出图像的路径从MATLAB函数返回到C#,最终将其自行读取..

所以在C#中你会做类似的事情:

static void Main(string[] args) 
{
    var img = ...;  // image data
    string input_image = @"C:\path\to\image.png";
    save_image(img, input_image);    // save your image to disk

    MLApp.MLApp matlab = new MLApp.MLApp(); 
    object result = null; 
    matlab.Feval("my_processing_func", 1, out result, image); 
    object[] res = result as object[]; 
    string output_image = (string) res[0];

    var img_processed = load_image(output_image);  // load image from disk
} 

在MATLAB方面,该函数执行如下操作:

function out_fname = my_processing_func(in_fname)
    % read input image
    img = imread(in_fname);

    % ... apply some image processing functions
    img = process(img);

    % write resulting image to disk
    out_fname = [tempname() '.png'];
    imwrite(img, out_fname);
end

您还可以使用PutFullMatrixGetFullMatrix函数在C#和MATLAB COM服务器之间传递数据。图像只是一个数值矩阵。请记住,MATLAB按列主要顺序存储数组。

下面是一个示例代码,演示如何从C#中的MATLAB工作区检索变量:https://stackoverflow.com/a/21123727/97160

第三种选择是使用MATLAB Compiler SDK工具箱。这使您可以将MATLAB函数编译/打包到.NET程序集中,该程序集可以在没有MATLAB的机器上使用(需要MCR运行时)。