ZHJA_HJGL/HJGL_ZH/BLL/libOpenCV.cs

148 lines
4.7 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.InteropServices;
namespace BLL
{
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public unsafe delegate void CheckCallBack(
string label,
double rongcha
);
public class libOpenCV
{
[DllImport("LibOpenCV.dll",CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Unicode)]
private extern static void CheckImage(IntPtr path, [MarshalAs(UnmanagedType.FunctionPtr)] CheckCallBack cb);
[DllImport("LibOpenCV.dll",CallingConvention=CallingConvention.StdCall)]
private extern static int TrainImage(IntPtr picpath,IntPtr label);
public delegate int CheckImageDG(IntPtr imagePath, CheckCallBack ccb);
public static void DoCheckImage(string picpath, CheckCallBack ccb)
{
IntPtr ptrPicPath = mallocIntptr(picpath);
CheckImage(ptrPicPath,ccb);;// Marshal.GetFunctionPointerForDelegate(ccb));
Marshal.FreeHGlobal(ptrPicPath);
}
public static int DoTrainImage(string picpath, string label)
{
int ret = 0;
IntPtr ptrPicPath = mallocIntptr(picpath);
IntPtr ptrLabel = mallocIntptr(label);
ret = TrainImage(ptrPicPath, ptrLabel); ;// Marshal.GetFunctionPointerForDelegate(ccb));
Marshal.FreeHGlobal(ptrPicPath);
Marshal.FreeHGlobal(ptrLabel);
return ret;
}
/// <summary>
/// 根据数据的长度申请非托管空间
/// </summary>
/// <param name="strData">要申请非托管空间的数据</param>
/// <returns>指向非拖管空间的指针</returns>
private static IntPtr mallocIntptr(string strData)
{
//先将字符串转化成字节方式
Byte[] btData = System.Text.Encoding.Default.GetBytes(strData);
//申请非拖管空间
IntPtr m_ptr = Marshal.AllocHGlobal(btData.Length);
//给非拖管空间清0
Byte[] btZero = new Byte[btData.Length + 1]; //一定要加1,否则后面是乱码,原因未找到
Marshal.Copy(btZero, 0, m_ptr, btZero.Length);
//给指针指向的空间赋值
Marshal.Copy(btData, 0, m_ptr, btData.Length);
return m_ptr;
}
/// <summary>
/// 根据长度申请非托管空间
/// </summary>
/// <param name="strData">要申请非托管空间的大小</param>
/// <returns>指向非拖管空间的指针</returns>
private static IntPtr mallocIntptr(int length)
{
//申请非拖管空间
IntPtr m_ptr = Marshal.AllocHGlobal(length);
//给非拖管空间清0
Byte[] btZero = new Byte[length + 1]; //一定要加1,否则后面是乱码,原因未找到
Marshal.Copy(btZero, 0, m_ptr, btZero.Length);
//给指针指向的空间赋值
Marshal.Copy(btZero, 0, m_ptr, length);
return m_ptr;
}
/*
* 一、IntPtr 与 string互转
string str = "aa";
IntPtr init = Marshal.StringToHGlobalAnsi(str);
string ss= Marshal.PtrToStringAnsi(init);
//最后释放掉
Marshal.FreeHGlobal(init);
二、char*与string互转
string a = "11";
char* aChar = (char*)System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(a).ToPointer();
string result = Marshal.PtrToStringAnsi((IntPtr)aChar);
三、char* 与 IntPtr互转
可以直接强制类型转换
IntPtr init = (IntPtr)aChar;
char* aChar = (char*)init;
*/
}
public class DllInvoke
{
[DllImport("kernel32.dll", EntryPoint="LoadLibrary", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
private extern static IntPtr LoadLibrary(String path);
[DllImport("kernel32.dll", EntryPoint="GetProcAddress")]
private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);
[DllImport("kernel32.dll")]
private extern static bool FreeLibrary(IntPtr lib);
[DllImport("kernel32.dll")]
private extern static IntPtr GetLastError();
private IntPtr hLib;
public DllInvoke(String DLLPath)
{
hLib = LoadLibrary(DLLPath);
if (hLib == IntPtr.Zero)
{
hLib=GetLastError();
}
}
~DllInvoke()
{
FreeLibrary(hLib);
}
public Delegate Invoke(String APIName, Type t)
{
IntPtr api = GetProcAddress(hLib, APIName);
return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
}
  
}
}