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

问题描述

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

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

解决方案

最直接的办法就是把matlab代码转成 C#的,即有了代码,有学到了理论!

解决方案二:

这里上代码
这是matlab的代码:
function [J]=defog(img)

kenlRatio = .01;
minAtomsLight = 240;
%figure,imshow(uint8(img)), title('src');

sz=size(img);

w=sz(2);

h=sz(1);

dc = zeros(h,w);

for y=1:h

for x=1:w

dc(y,x) = min(img(y,x,:));

end

end

winodwsize = floor(max([3, w*kenlRatio, h*kenlRatio]));

dc2 = minfilt2(dc, [winodwsize,winodwsize]);

dc2(h,w)=0;

t = 255 - dc2;

t_d=double(t)/255;

A = min([minAtomsLight, max(max(dc2))]);

J = zeros(h,w,3);

img_d = double(img);

r = winodwsize*4;
eps = 10^-6;

filtered = guidedfilter_color((double(img))/255, t_d, r, eps);

t_d = filtered;

J(:,:,1) = (img_d(:,:,1) - (1-0.95*t_d)*A)./t_d;

J(:,:,2) = (img_d(:,:,2) - (1-0.95*t_d)*A)./t_d;

J(:,:,3) = (img_d(:,:,3) - (1-0.95*t_d)*A)./t_d;

J=enhancement(J);

img_d(1,3,1)

J=uint8(J);

end
这段代码已经测试过没有问题。。把它编译成了一个DLL加到了工程里

解决方案三:

这是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:UsersUserDesktopsample.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调用的部分也是测试过没有问题的实在是没辙了,求大虾拯救

解决方案四:

把代码换成C#程序代码

时间: 2024-11-02 13:56:55

调用-c#和matlab混合编程时遇到了一点问题,求帮助的相关文章

C#调用matlab混合编程时总是出现类型初始值设定项引发异常这种错误

问题描述 C#调用matlab混合编程时总是出现类型初始值设定项引发异常这种错误,请问该如何解决?matlab源码如下:function[y,z]=myadd2(a,b)%dummyfunction,justtodemonstratetheideay=a+b;z=a+2*b;endC#源码如下usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Dra

c++-求助:关于C++和matlab混合编程的问题

问题描述 求助:关于C++和matlab混合编程的问题 我最近在做一个东西就是从一个实物上接收到数据后在pc上显示出来 也就是要做一个可以显示数据的软件 我正在用C++做 可是有个问题就是我这个东西是要做成3d显示效果 而c++做三维图形不是很方便 所以我打算用matlab做三维显示 我感到困惑的就是当实物发送数据到软件的数据库中时可以再传输到matlab吗让matlab的显示跟着数据变化而变化?可以将matlab的图形通过软件显示出来吗? 希望各位大神指导下~谢谢啦 解决方案 你可以将Matl

vc与MATLAB混合编程不能一下输出3个参数结果

问题描述 vc与MATLAB混合编程不能一下输出3个参数结果 MATLAB程序是输出3个参数,但是总是输出第一个参数,然后再vc中调用的时候也是哪个参数在前面那个参数的结果会出来,但是其他两个的结果不会出来,这是为什么呢?还请各位知道的大神帮帮我,谢谢了!这是我的MATLAB程序,直接运行后只是出来第一个参数的值. function[b,e,h]=shiyan4(a) %a=imread('lena.bmp'); %figure;imshow(a); %title('原图像'); a=im2do

mfc-MFC与MATLAB混合编程生成可执行文件的移植性

问题描述 MFC与MATLAB混合编程生成可执行文件的移植性 我在matlab中建立一个函数并编译成dll,然后VS2008中的MFC调用dll,在我的电脑上成功运行,并生成可执行文件,也能成功运行.但是在别的电脑上就出现错误,错误原因是在我的电脑上DLL可以初始化,在别的电脑上初始化失败.求大神给看看!!!! 小弟没有C币,要不然一定悬赏100C币! 解决方案 需要带上Mfc库,Matlab库文件 解决方案二: 需要安装MCRInstaller 解决方案三: 参考下哦http://blog.c

matlab多线程编程时怎么给进程上锁?

问题描述 matlab多线程编程时怎么给进程上锁? 求问各位大神,matlab多线程编程时怎么给进程上锁?为了避免线程同步的问题,跪谢! 解决方案 可以使用互斥量或者信号量,具体查查手册. 解决方案二: 并行工具箱里有函数,也可以用C写一个扩展,用互斥量 解决方案三: 现在matlab对多线程,多进程,多核互斥支持都不够好, 所以你可以利用程序创建多进程来调用matlab,实现多进程,互斥也可以由进程来控制,灵活性更高

matlab-vs 2010 跟MATLAB混合编程老报错

问题描述 vs 2010 跟MATLAB混合编程老报错 执行到MATLAB函数时软件会报错:Precision Design.exe 中的 0x758f812f 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0e79f60c 处的 mwException. 并且在MATLAB函数处中断 我用的方法是dll文件混合编程的,然后我单步执行时会出现这样的情况:无可用源 解决方案 参考:http://blog.csdn.net/wangyaninglm/article/deta

iplimage-vs与MATLAB混合编程实现图像处理

问题描述 vs与MATLAB混合编程实现图像处理 我想要vs与MATLAB混合编程实现图像处理的可视化界面,调用的shiyan1的程序后为什么不会显示图像呢?我不知道到底是哪里出问题了,运行程序不显示哪里有错误就是不会显示图像,望大家帮帮我,谢谢了.下面是我的程序: void CMFCApplication17Dlg::OnClickedButton1() { if( !lvboInitialize()) { printf("Could not initialize !"); retu

C#与matlab混合编程并实现实时交互的困惑

问题描述 C#与matlab混合编程并实现实时交互的困惑 最近在开发一个石油(测井)方面的软件,需要绘制常规的九条曲线,考虑到matlab的强大绘图功能,像3D绘图等,因此想在C#中通过调用matlab来绘图,但由于缺乏这方面的编程经验,所以没法下手(我还在校学习),在网上查了相关的资料,但始终没能调试成功,在这里希望大家能帮助我,如果有相关的资料或者代码,希望大家能够传给我一份,谢谢,还有一个问题就是调用完成绘图完成后最好能够进行实时交互,像matlab中绘图能够360度旋转观看之类的--谢谢

vb.net与matlab混合编程的问题

问题描述 vb.net与matlab混合编程,我用matlab编了一个简单的函数,两个输入一个输出,通过deploytool编译成dll文件,但是不知道使用vb.net怎么调用,我以前没用过动态链接库,网上查了好久,也没解决,希望高手指点一下.谢谢! 解决方案 解决方案二:先添加引用进来dll到项目中,然后在窗体里面调用Importsxxx解决方案三:引用1楼Json2008的回复: 先添加引用进来dll到项目中,然后在窗体里面调用Importsxxx 具体怎么调用啊,以前没用过动态链接库解决方