jsyz07935 2015-06-04 16:22 采纳率: 25%
浏览 1838

c#和matlab混合编程时遇到了一点问题,求帮助

是这样的,正在做一个数字图像处理的项目,在matlab里实现了一个去雾算法,然后想用c#调用它,把这个算法编译成了一个dll加到工程里,现在发现程序一打开,就没有什么反应,一开始以为是调用matlab的DLL会慢一些,没想到等了半天还是没动静,因为是第一次接触matlab和.net的混合编程,所以也不知道问题出在什么地方,求大虾解救。

  • 写回答

4条回答 默认 最新

  • jsyz07935 2015-06-04 16:23
    关注

    这是c#的代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Drawing.Imaging;
    using MathWorks.MATLAB.NET.Arrays;
    using defog;

    namespace WindowsFormsApplication1
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    Bitmap bm = new Bitmap(@"C:\Users\User\Desktop\sample.bmp");
    byte[, ,] myImage = ImageToBytes(bm);

    defog.Class1 output = new defog.Class1();
    MWNumericArray img = new MWNumericArray(myImage);
    MWNumericArray result = (MWNumericArray)output.defog(img);
    MessageBox.Show("succeed");
    DisposeImage(myImage, bm);
    pictureBox1.Image = bm;

    }

    private byte[,,] ImageToBytes(Bitmap img)
    {
    Rectangle lockRect = new Rectangle(0, 0, img.Width, img.Height);
    BitmapData imgData = img.LockBits(lockRect, ImageLockMode.ReadOnly, img.PixelFormat);

    byte[,] rband = new byte[img.Height, img.Width]; // 彩色图片的R、G、B三层分别构造一个二维数组
    byte[,] gband = new byte[img.Height, img.Width];
    byte[,] bband = new byte[img.Height, img.Width];
    int rowOffset = imgData.Stride - img.Width * 3;

    unsafe
    {
    byte* imgPtr = (byte*)imgData.Scan0.ToPointer();

    for (int i = 0; i < img.Height; ++i)
    {
    for (int j = 0; j < img.Width; ++j)
    {
    rband[i, j] = imgPtr[2]; // 每个像素的指针是按BGR的顺序存储的
    gband[i, j] = imgPtr[1];
    bband[i, j] = imgPtr[0];

    imgPtr += 3; // 偏移一个像素
    }
    imgPtr += rowOffset; // 偏移到下一行
    }
    }

    img.UnlockBits(imgData);
    byte[, ,] myImage = new byte[img.Height, img.Width, 3];

    for(int i=0;i<img.Height;i++)
    {
    for(int j=0;j<img.Width;j++)
    {
    myImage[i, j, 0] = rband[i, j];
    myImage[i, j, 1] = gband[i, j];
    myImage[i, j, 2] = bband[i, j];
    }
    }

    return myImage;
    }

    private void DisposeImage(byte [,,] myImage,Bitmap img)
    {
    Rectangle lockRect = new Rectangle(0, 0, img.Width, img.Height);
    BitmapData imgData = img.LockBits(lockRect, ImageLockMode.ReadOnly, img.PixelFormat);

    int rowOffset = imgData.Stride - img.Width * 3;

    unsafe
    {
    byte* imgPtr = (byte*)imgData.Scan0.ToPointer();

    for (int i = 0; i < img.Height; ++i)
    {
    for (int j = 0; j < img.Width; ++j)
    {
    imgPtr[2] = myImage[i, j, 0];
    imgPtr[1] = myImage[i, j, 1];
    imgPtr[0] = myImage[i, j, 2];

    imgPtr += 3; // 偏移一个像素
    }
    imgPtr += rowOffset; // 偏移到下一行
    }
    }
    img.UnlockBits(imgData);

    }
    }
    }
    这段代码注释掉那部分dll调用的部分也是测试过没有问题的实在是没辙了,求大虾拯救

    评论

报告相同问题?

悬赏问题

  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
  • ¥30 乘子法解约束最优化问题的matlab代码文件,最好有matlab代码文件
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用