轉自:jsxyhelu 在此特別鳴謝!
cnblogs.com/jsxyhelu/p/GOCW2020.html
一、什么是GOCW
為了解決在C#下編寫OpenCV程序的問題,我做過比較深入的研究,并且實現了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通過這種方法,能夠分離界面和算法業務,高效率完成算法調用,而且非常方便進行算法維護。應該說是我在多年項目實踐中不斷總結提煉出來的一點東西。
GOCW的發布地址為:https://gitee.com/jsxyhelu2020/gocw
二、GOCW有什么特點
三、GOCW在VS中的環境配置
下載gocw_master,解壓后獲得兩個目錄文件。
其中,GOCW是類庫文件,而WINFORM_DEMO是引用范例。
使用VS2017或者更高版本打開WINFORM_DEMO.sln(或新建winform程序),在“引用”處添加GOCW的引用。
特別需要注意,正確編譯GOCW需要OpenCV的正確配置,所以需要正確設置include和lib,并且保證對應版本的dll文件能夠被正確訪問。
特別需要注意1:保證dll和csharp程序的.net目標框架是一致的
特別需要注意2:
-
保證dll和csharp程序的.net目標框架是一致的
-
配置管理器中,所有項目版本全部使用64位
四、測試代碼
可以直接參考 WINFROM_DEMO
添加GOCW的頭文件
using GOCW;
編寫GOCW調用代碼,你也可以根據需要吧Client的定義放在Form中。你實際使用過程中需要修改lena的地址。
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = (Bitmap)Bitmap.FromFile("e:/template/lena.jpg");
GOCWClass client = new GOCWClass();
//調用圖像處理算法
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
Bitmap bitmap = client.testMethod(bytes);
pictureBox1.Image = bitmap;
}
可以看到,實現了"灰度"變化。
五、原理簡介
GOCW是通過CLR的方式進行調用,關于CLR的原理這里不展開。重點將一下你在哪里添加圖像處理算法,打開 GOCW.h文件
#pragma once
#include "opencv.hpp"
#using
using namespace System;
using namespace System::Data;
using namespace System::IO;
using namespace System::Drawing;
using namespace System::Imaging;
using namespace std;
namespace GOCW {
public ref class GOCWClass
{
public:
/////例子函數//////
//1.傳遞圖像
/* MemoryStream ms = new MemoryStream();
b.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
Bitmap bitmap = client.testMethod(bytes);*/
Bitmap^ GOCWClass::array<unsigned char>^ pCBuf1);
//2.引用傳遞int
/*unsafe
{
int* value = stackalloc int[1];
value[0] = 0;
int iret = client.allTest(2, 3, value);
}*/
int GOCWClass::allTest(int a, int b, int* c);
//3.引用傳遞字符串
System::String^ GOCWClass::String^ inputStr);
/////業務函數//////
/*unsafe
{
int* value = stackalloc int[1];//返回代碼
value[0] = 0;
bitmap = client.fetchresult(bytes, value);//調用來自GOClrClasslibrary圖像處理算法
if (value[0] == 0)//0真1假
{
res = true;
}
else
{
res = false;
}
}*/
Bitmap^ GOCWClass::array<unsigned char>^ pCBuf1, int* errorCode);
};
}
這里以"三明治"的方法將各種實現的方法進行了申明,具體的實現在GOCW.cpp中,比如我們舉一個例子。
//1.傳遞圖像
Bitmap^ GOCWClass::array^ pCBuf1)
{
////////////////////////////////將輸入cli::array轉換為cv::Mat/////////////////////////
pin_ptr 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, cv::IMREAD_UNCHANGED);
if (!img_object.data)
return nullptr;
////////////////////////////////////////////OpenCV的算法處理過程////////////////////////////////////
Mat draw = img_object.clone();
cvtColor(draw, draw, COLOR_BGR2GRAY);
cvtColor(draw, draw, COLOR_GRAY2BGR);
/////////////////////////將cv::Mat轉換為Bitmap(只能傳輸cv_8u3格式數據)///////////////////////////////
if (!draw.data)
return nullptr;
Bitmap^ bitmap = MatToBitmap(draw);
return bitmap;
}
在這段代碼中
Mat draw = img_object.clone();
cvtColor(draw, draw, COLOR_BGR2GRAY);
cvtColor(draw, draw, COLOR_GRAY2BGR);
是具體業務函數,可以根據實際算法要求進行修改。關于參數的傳入傳出,在其他幾個函數中都有說明。
六、初步小結
雖然GOCW相比較OpenCVSharp復雜一點,但是它能夠和現有系統更緊密結合,優勢也非常明顯。如果你首先是圖像處理開發者,需要為算法尋找一個可以運行的平臺,那么GOCW基于CLR的封裝形式,肯定更適合你!
感謝閱讀至此,希望有所幫助!
原文標題:C# 中使用 OpenCV
轉自:jsxyhelu
cnblogs.com/jsxyhelu/p/GOCW2020.html
-
算法
+關注
關注
23文章
4646瀏覽量
93717 -
C語言
+關注
關注
180文章
7618瀏覽量
138660 -
函數
+關注
關注
3文章
4353瀏覽量
63295 -
代碼
+關注
關注
30文章
4857瀏覽量
69527 -
OpenCV
+關注
關注
31文章
636瀏覽量
41786
原文標題:C# 中使用 OpenCV
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
OpenCV C++程序編譯與演示
opencv備忘單
opencv基礎的學習手冊
在Vivado中如何實現OpenCV設計
在JetsonNano上編譯OpenCV源碼與OpenCV C++ YOLOv5程序演示
OpenCV常用的 7 個示例(Python版)1
OpenCV常用的 7 個示例(Python版)2
OpenCV常用的 7 個示例(Python版)3
C#中使用OpenCV
學習OpenCV4的系統化路線圖

評論