使用opencv的C++dll处理C#的图片

实验室要求使用C#做界面,但是图像处理是用C++的opencv处理的,所以将C++的处理片段打包成dll给c#调用。
C++动态库.h

#ifndef __IMAGE_H__
#define __IMAGE_H__
#ifdef IMAGE_EXPORTS
#define IMAGE_API __declspec(dllexport)
#else 
#define IMAGE_API __declspec(dllimport)
#endif
extern "C" IMAGE_API void _stdcall Blur(unsigned char * src, int width, int height, int step);
#endif

C++动态库.cpp

IMAGE_API void _stdcall Blur(unsigned char * src, int width, int height, int step)
{
 	//生成opencv图像类
	Mat img(height, width, CV_8UC3, src, step);
	blur(img, img, Size(10, 10));//处理代码段
	memcpy(src, img.data, sizeof(unsigned char)*img.rows*img.cols*img.channels());
 	//指针数据复制
	img.release(); //释放内存(其实不用)
 }

C#代码段

[DllImport("picture.dll", EntryPoint = "Blur")]
public static extern void Blur(IntPtr img, int width, int height, int step);
private void ImageRead(string path)
{
	Bitmap image = null;
	using (FileStream fs = File.OpenRead(path))
	{ 	//OpenRead
		int filelength = 0;
		filelength = (int)fs.Length; //获得文件长度 
		Byte[] image1 = new Byte[filelength]; //建立一个字节数组 
		fs.Read(image1, 0, filelength); //按字节流读取
		image = (Bitmap)System.Drawing.Image.FromStream(fs);
		fs.Close();
	}
	try	
	{
            	//锁定内存变成指针形式
            	BitmapData bitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            	//调库
            	Blur(bitmapData.Scan0, bitmapData.Width, bitmapData.Height, bitmapData.Stride);
            	//解除锁定内存
            	image.UnlockBits(bitmapData);
	}
	catch(Exception e){}
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在C#中调用C++编写的OpenCV dll,可以使用Platform Invoke(P/Invoke)技术。下面是一个简单的示例,演示如何在C#中调用C++编写的OpenCV dll: 1. 创建一个新的C#控制台应用程序。 2. 在项目文件夹中创建一个名为“opencv”的子文件夹。 3. 将OpenCV dll文件复制到该子文件夹中。 4. 在Visual Studio中打开项目,并添加以下代码: ```C# using System; using System.Runtime.InteropServices; class Program { [DllImport("opencv\\opencv_core320.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr cvCreateImage( [MarshalAs(UnmanagedType.Struct)] CvSize size, int depth, int channels); static void Main(string[] args) { // 创建一个256x256的8位单通道图像 var size = new CvSize(256, 256); var image = cvCreateImage(size, 8, 1); // 在控制台中输出图像信息 Console.WriteLine("Image created: {0}x{1}, depth={2}, channels={3}", size.Width, size.Height, 8, 1); Console.ReadKey(); } } [StructLayout(LayoutKind.Sequential)] public struct CvSize { public int Width; public int Height; public CvSize(int width, int height) { Width = width; Height = height; } } ``` 上面的代码创建了一个256x256的8位单通道图像,并在控制台中输出了图像信息。 在上面的代码中,我们使用DllImport属性来指定要导入的OpenCV dll的名称和调用约定。在本例中,我们使用Cdecl调用约定。 我们还定义了一个结构体CvSize,用于传递图像大小参数。在C++中,CvSize结构体定义在opencv_core.hpp头文件中。我们在C#中重新定义了这个结构体,以便我们可以在C#使用它来传递参数。 需要注意的是,由于C++C#使用不同的内存管理机制,因此您需要确保在C#中正确处理C++返回的指针。在本例中,我们使用IntPtr类型来表示从C++返回的指针,并使用Marshal类中的相关方法来管理它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值