是这样的,正在做一个数字图像处理的项目,在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调用的部分也是测试过没有问题的实在是没辙了,求大虾拯救解决 无用评论 打赏 举报
悬赏问题
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 ubuntu子系统密码忘记
- ¥15 保护模式-系统加载-段寄存器