您好,登錄后才能下訂單哦!
OpenCV怎么在C#中使用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
為了解決在Csharp下編寫OpenCV程序的問題,我做過比較深入的研究,并且實現了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通過這種方法,能夠分離界面和算法業務,高效率完成算法調用,而且非常方便進行算法維護。應該說是我在多年項目實踐中不斷總結提煉出來的一點東西。
GOCW的發布地址為:https://gitee.com/jsxyhelu2020/gocw
分離界面和算法業務
圖像數據直接通過內存傳值,高效率完成算法調用
直接編寫C++語法程序,方便維護改進
在C#中可以通過CLR方式引用,提供函數級別接口
開放源代碼
下載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 <system.drawing.dll> using namespace System; using namespace System::Data; using namespace System::IO; using namespace System::Drawing; using namespace System::Drawing::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::testMethod(cli::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::allTestStr(System::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::fetchresult(cli::array<unsigned char>^ pCBuf1, int* errorCode); }; }
這里以“三明治”的方法將各種實現的方法進行了申明,具體的實現在GOCW.cpp中,比如我們舉一個例子。
//1.傳遞圖像 Bitmap^ GOCWClass::testMethod(cli::array<unsigned char>^ pCBuf1) { ////////////////////////////////將輸入cli::array<unsigned char>轉換為cv::Mat///////////////////////// 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, 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);
是具體業務函數,可以根據實際算法要求進行修改。關于參數的傳入傳出,在其他幾個函數中都有說明。
關于OpenCV怎么在C#中使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。