【问题标题】:Sending image as argument from C# to matlab function将图像作为参数从 C# 发送到 matlab 函数
【发布时间】:2016-07-30 18:37:47
【问题描述】:

我正在尝试使用 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();

【问题讨论】:

  • 您要发送什么“图像”?如果它是文件系统上的图像,您可以使用 Matlab 打开它。或者你想发送一个代表图像的 C# 对象?这也没有任何意义,因为您无法在 Matlab 中对其进行任何操作。
  • 我正在尝试设计一个应用程序的前端,它从用户获取图像并使用 matlab 函数计算一些图像特征,我想将输入图像发送到已经定义的 matlab 函数并获取评估的特征的返回值。
  • *Visual Studio C# 的前端
  • 您的 GUI 会显示图像,并且您有一些按钮,例如“在其上添加一些效果”。当用户按下按钮时,您想将图像发送到 matlab 以应用效果,然后将其发送回 C# 以再次显示?问题是 Matlab 有一个图像的内部表示,例如image = imread('path_to_the_image_file') 并且 C# 也有一个。你不能简单地从一个转换到另一个。您可以在每个步骤之间将文件保存到临时文件中,然后仅发送路径,或者您可以检查将图像映射到 byterestream 并发送该 bytestrem 的可能性。
  • 我确实找到了这个链接,该链接解释了我需要使用 MCR domoreinlesstime.wordpress.com/2013/01/26/access-matlab-from-c 做什么,但存在一些混淆,并且 MWNumericArray 不断抛出异常。

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


【解决方案1】:

一种简单的方法是将图像从 C# 应用程序保存到磁盘,然后调用 MATLAB(使用 COM Automation,就像您使用 shown 一样)通过将文件名作为字符串传递给图像处理函数来评估它. MATLAB 函数会简单地按名称加载图像,对其进行处理,然后将结果另存为另一个图像。然后将输出图像的路径从您的 MATLAB 函数返回到 C#,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 运行时)。

【讨论】:

  • 我真的不知道为什么我没想到你是个天才。这实际上听起来很有希望,让我试试这种读写图像的方式,我会尽快回复你。还有你提到的 MCR 方法,我也一直在尝试这样做,但是 MWNumericarray 出于某种原因无法正常工作,我认为我正在使用 matlab 2015a 64 位和 MS 存在一些 32 位 64 位冲突Visual Studio 2015 32 位,所以 MWNumericarray 不断抛出异常,我什至尝试使用 32 位 MWArray.dll 引用,但它仍然不起作用。
  • 就像我解释的那样,这与您发布的代码完全不同(一个使用 COM 自动化,另一个使用 .NET Builder 工具箱)。无论如何,您应该查阅编译器 SDK 的文档,它非常彻底:mathworks.com/help/compiler_sdk/…mathworks.com/help/compiler_sdk/dotnet/…mathworks.com/help/dotnetbuilder/MWArrayAPI
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多