下載地址:https://files.cnblogs.com/files/jsxyhelu/GOCW20171217.zip
現在將Csharp調用基於Opencv編寫的類庫文件(Dll)的方法定下來,我取名叫做GreenOpenCsharpWarper,簡稱GOCW。
一、CLR編寫的DLL部分
1、按照正常方法引入Opencv;
2、提供接口函數,進行圖像處理(這里只是實現了cvtColor,實際過程中可以用自己編寫的復雜函數)
String
^ Class1
:
:Method(cli
:
:array
<
unsigned
char
>
^ pCBuf1)
{
pin_ptr <System : :Byte > p1 = &pCBuf1[ 0];
unsigned char * pby1 = p1;
cv : :Mat img_data1(pCBuf1 - >Length, 1,CV_8U,pby1);
cv : :Mat img_object = cv : :imdecode(img_data1,IMREAD_UNCHANGED);
//////////////////////////////////處理過程/////////
cvtColor(img_object,img_object, 40);
/////////////////////////////////////////////////////////////////////////////////
if ( !img_object.data)
return nullptr;
//獲得目錄,保存文件
cv : :imwrite( "c:/Method.jpg",img_object);
return "c:/Method.jpg";
}
String ^ Class1 : :Method2(cli : :array < unsigned char > ^ pCBuf1)
{
pin_ptr <System : :Byte > p1 = &pCBuf1[ 0];
unsigned char * pby1 = p1;
cv : :Mat img_data1(pCBuf1 - >Length, 1,CV_8U,pby1);
cv : :Mat img_object = cv : :imdecode(img_data1,IMREAD_UNCHANGED);
//////////////////////////////////處理過程///////////////////////
cvtColor(img_object,img_object, 6);
/////////////////////////////////////////////////////////////////////////////////
if ( !img_object.data)
return nullptr;
//獲得目錄,保存文件
cv : :imwrite( "c:/Method2.jpg",img_object);
return "c:/Method2.jpg";
}
{
pin_ptr <System : :Byte > p1 = &pCBuf1[ 0];
unsigned char * pby1 = p1;
cv : :Mat img_data1(pCBuf1 - >Length, 1,CV_8U,pby1);
cv : :Mat img_object = cv : :imdecode(img_data1,IMREAD_UNCHANGED);
//////////////////////////////////處理過程/////////
cvtColor(img_object,img_object, 40);
/////////////////////////////////////////////////////////////////////////////////
if ( !img_object.data)
return nullptr;
//獲得目錄,保存文件
cv : :imwrite( "c:/Method.jpg",img_object);
return "c:/Method.jpg";
}
String ^ Class1 : :Method2(cli : :array < unsigned char > ^ pCBuf1)
{
pin_ptr <System : :Byte > p1 = &pCBuf1[ 0];
unsigned char * pby1 = p1;
cv : :Mat img_data1(pCBuf1 - >Length, 1,CV_8U,pby1);
cv : :Mat img_object = cv : :imdecode(img_data1,IMREAD_UNCHANGED);
//////////////////////////////////處理過程///////////////////////
cvtColor(img_object,img_object, 6);
/////////////////////////////////////////////////////////////////////////////////
if ( !img_object.data)
return nullptr;
//獲得目錄,保存文件
cv : :imwrite( "c:/Method2.jpg",img_object);
return "c:/Method2.jpg";
}
二、Winform調用接口部分(TIP:不僅可以用Winform調用,asp.net/webservice都是可以調用的)
1、直接引用clr dll

2、編寫helper文件(應該也可以叫做 warpper),通過外部IO的方法獲取clr dll的文件
class GOCsharpHelper
{
Class1 client = new Class1();
string strResult1 = null;
string strResult2 = null;
//輸入參數是string或bitmap
public Bitmap ImageProcess(string ImagePath){
Image ImageTemp = Bitmap.FromFile(ImagePath);
return ImageProcess(ImageTemp);
}
//輸出結果是bitmap
public Bitmap ImageProcess(Image image)
{
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
strResult1 = client.Method(bytes);
Image ImageResult = Bitmap.FromFile(strResult1);
return (Bitmap)ImageResult;
}
public Bitmap ImageProcess2(string ImagePath)
{
Image ImageTemp = Bitmap.FromFile(ImagePath);
return ImageProcess2(ImageTemp);
}
//輸出結果是bitmap
public Bitmap ImageProcess2(Image image)
{
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
strResult2 = client.Method2(bytes);
Image ImageResult = Bitmap.FromFile(strResult2);
return (Bitmap)ImageResult;
}
public void Clear()
{
if (File.Exists(strResult1))
File.Delete(strResult1);
if (File.Exists(strResult2))
File.Delete(strResult2);
}
}
{
Class1 client = new Class1();
string strResult1 = null;
string strResult2 = null;
//輸入參數是string或bitmap
public Bitmap ImageProcess(string ImagePath){
Image ImageTemp = Bitmap.FromFile(ImagePath);
return ImageProcess(ImageTemp);
}
//輸出結果是bitmap
public Bitmap ImageProcess(Image image)
{
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
strResult1 = client.Method(bytes);
Image ImageResult = Bitmap.FromFile(strResult1);
return (Bitmap)ImageResult;
}
public Bitmap ImageProcess2(string ImagePath)
{
Image ImageTemp = Bitmap.FromFile(ImagePath);
return ImageProcess2(ImageTemp);
}
//輸出結果是bitmap
public Bitmap ImageProcess2(Image image)
{
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
strResult2 = client.Method2(bytes);
Image ImageResult = Bitmap.FromFile(strResult2);
return (Bitmap)ImageResult;
}
public void Clear()
{
if (File.Exists(strResult1))
File.Delete(strResult1);
if (File.Exists(strResult2))
File.Delete(strResult2);
}
}
3、使用例子(注意控件的dispose):
private
void button2_Click(object sender, EventArgs e)
{
if (pictureBox1.Image != null)
pictureBox1.Image.Dispose();
if (pictureBox2.Image != null)
pictureBox2.Image.Dispose();
Image image1 = gocsharphelper.ImageProcess( " E:/sandbox/logo.jpg");
pictureBox1.Image = image1;
Image image2 = gocsharphelper.ImageProcess2( "E:/sandbox/lena.jpg");
pictureBox2.Image = image2;
}
{
if (pictureBox1.Image != null)
pictureBox1.Image.Dispose();
if (pictureBox2.Image != null)
pictureBox2.Image.Dispose();
Image image1 = gocsharphelper.ImageProcess( " E:/sandbox/logo.jpg");
pictureBox1.Image = image1;
Image image2 = gocsharphelper.ImageProcess2( "E:/sandbox/lena.jpg");
pictureBox2.Image = image2;
}
三、解釋說明
使用外部I/O不僅僅是權宜之計,實際上Opencv的Decode使用的就是外部I/O。就目前研究的水平來說,這是最穩定的。
目前搭建成功的框架已經能夠完成“csharp調用opencv的”目標,並且在調試、參數傳遞方面都很強。
如果是處理靜態圖片,已經夠用。
四、殺手程序
GOImageResearch:
使用這種方法編寫的圖像處理預分析程序。
