最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在C#中使用OpenCV(GOCW使用教程)

 更新時間:2020年12月29日 08:41:54   作者:jsxyhelu  
這篇文章主要介紹了如何在C#中使用OpenCV(GOCW使用教程),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

1、什么是GOCW

      為了解決在Csharp下編寫OpenCV程序的問題,我做過比較深入的研究,并且實(shí)現(xiàn)了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通過這種方法,能夠分離界面和算法業(yè)務(wù),高效率完成算法調(diào)用,而且非常方便進(jìn)行算法維護(hù)。應(yīng)該說是我在多年項(xiàng)目實(shí)踐中不斷總結(jié)提煉出來的一點(diǎn)東西。
       GOCW的發(fā)布地址為:https://gitee.com/jsxyhelu2020/gocw

2、GOCW有什么特點(diǎn)

分離界面和算法業(yè)務(wù)
圖像數(shù)據(jù)直接通過內(nèi)存?zhèn)髦?,高效率完成算法調(diào)用
直接編寫C++語法程序,方便維護(hù)改進(jìn)
在C#中可以通過CLR方式引用,提供函數(shù)級別接口
開放源代碼

3、GOCW在VS中的環(huán)境配置

下載gocw_master,解壓后獲得兩個目錄文件。

其中,GOCW是類庫文件,而WINFORM_DEMO是引用范例。

使用VS2017或者更高版本打開WINFORM_DEMO.sln(或新建winform程序),在“引用”處添加GOCW的引用。

特別需要注意,正確編譯GOCW需要OpenCV的正確配置,所以需要正確設(shè)置include和lib,并且保證對應(yīng)版本的dll文件能夠被正確訪問。

特別需要注意1:保證dll和csharp程序的.net目標(biāo)框架是一致的

特別需要注意2:保證dll和csharp程序的.net目標(biāo)框架是一致的
配置管理器中,所有項(xiàng)目版本全部使用64位

4、測試代碼

可以直接參考 WINFROM_DEMO

添加GOCW的頭文件

using GOCW;

編寫GOCW調(diào)用代碼,你也可以根據(jù)需要吧Client的定義放在Form中。你實(shí)際使用過程中需要修改lena的地址。

 private void button1_Click(object sender, EventArgs e)
        {
            Bitmap bmp = (Bitmap)Bitmap.FromFile("e:/template/lena.jpg");
            GOCWClass client = new GOCWClass();
            //調(diào)用圖像處理算法
            MemoryStream ms = new MemoryStream();
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] bytes = ms.GetBuffer();
            Bitmap bitmap = client.testMethod(bytes);
            pictureBox1.Image = bitmap;
        }

可以看到,實(shí)現(xiàn)了“灰度”變化。

5、原理簡介

GOCW是通過CLR的方式進(jìn)行調(diào)用,關(guān)于CLR的原理這里不展開。重點(diǎn)將一下你在哪里添加圖像處理算法,打開 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:
        /////例子函數(shù)//////
        //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);
        /////業(yè)務(wù)函數(shù)//////
        /*unsafe
        {
            int* value = stackalloc int[1];//返回代碼
            value[0] = 0;
            bitmap = client.fetchresult(bytes, value);//調(diào)用來自GOClrClasslibrary圖像處理算法
            if (value[0] == 0)//0真1假
            {
                res = true;
            }
            else
            {
                res = false;
            }
        }*/
        Bitmap^  GOCWClass::fetchresult(cli::array<unsigned char>^ pCBuf1, int* errorCode);
    
    };
}

這里以“三明治”的方法將各種實(shí)現(xiàn)的方法進(jìn)行了申明,具體的實(shí)現(xiàn)在GOCW.cpp中,比如我們舉一個例子。

//1.傳遞圖像
Bitmap^  GOCWClass::testMethod(cli::array<unsigned char>^ pCBuf1)
{
    ////////////////////////////////將輸入cli::array<unsigned char>轉(zhuǎn)換為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轉(zhuǎn)換為Bitmap(只能傳輸cv_8u3格式數(shù)據(jù))///////////////////////////////
    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);

是具體業(yè)務(wù)函數(shù),可以根據(jù)實(shí)際算法要求進(jìn)行修改。關(guān)于參數(shù)的傳入傳出,在其他幾個函數(shù)中都有說明。
 

6、初步小結(jié) 

      雖然GOCW相比較OpenCVSharp復(fù)雜一點(diǎn),但是它能夠和現(xiàn)有系統(tǒng)更緊密結(jié)合,優(yōu)勢也非常明顯。如果你首先是圖像處理開發(fā)者,需要為算法尋找一個可以運(yùn)行的平臺,那么GOCW基于CLR的封裝形式,肯定更適合你!
       感謝閱讀至此,希望有所幫助!

以上就是如何在C#中使用OpenCV(GOCW使用教程)的詳細(xì)內(nèi)容,更多關(guān)于在C#中使用OpenCV(使用GOCW)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用C#自定義一個時間類型YearMonth

    利用C#自定義一個時間類型YearMonth

    .Net6中加入了兩個新的時間類型:DateOnly和TimeOnly,但DateOnly和TimeOnly都有相應(yīng)的應(yīng)用場景,所以本文就來自定義一個時間類型YearMonth,用于解決實(shí)際項(xiàng)目開發(fā)中的需求,希望對大家有所幫助
    2023-07-07
  • 詳解C#如何使用WASM跨語言調(diào)用

    詳解C#如何使用WASM跨語言調(diào)用

    WebAssembly(簡稱Wasm)是一種用于基于堆棧的虛擬機(jī)的二進(jìn)制指令格式,這篇文章主要介紹了C#如何使用WASM跨語言調(diào)用,需要的小伙伴可以了解一下
    2023-08-08
  • C#向Word文檔中添加內(nèi)容控件的方法示例

    C#向Word文檔中添加內(nèi)容控件的方法示例

    這篇文章主要給大家介紹了C#向Word文檔中添加內(nèi)容控件的方法,文中對各種不同控件的添加方法分別進(jìn)行了介紹,如組合框、文本、圖片、日期選取器及下拉列表等內(nèi)容控件,都給出了詳細(xì)的示例代碼,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • C#使用LitJson解析JSON的示例代碼

    C#使用LitJson解析JSON的示例代碼

    本篇文章主要介紹了C#使用LitJson解析JSON的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Unity編輯器資源導(dǎo)入處理函數(shù)OnPostprocessAudio使用案例

    Unity編輯器資源導(dǎo)入處理函數(shù)OnPostprocessAudio使用案例

    這篇文章主要為大家介紹了Unity編輯器資源導(dǎo)入處理函數(shù)OnPostprocessAudio使用案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • C#讀寫Excel的流程步驟

    C#讀寫Excel的流程步驟

    這篇文章主要介紹了詳解C#讀寫Excel的流程步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起來學(xué)習(xí)吧
    2023-12-12
  • C#實(shí)現(xiàn)延時并自動關(guān)閉MessageBox的方法

    C#實(shí)現(xiàn)延時并自動關(guān)閉MessageBox的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)延時并自動關(guān)閉MessageBox的方法,非常實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • C# Lambda表達(dá)式select()和where()的區(qū)別及用法

    C# Lambda表達(dá)式select()和where()的區(qū)別及用法

    這篇文章主要介紹了C# Lambda表達(dá)式select()和where()的區(qū)別及用法,select在linq中一般會用來提取最后篩選的元素集合,在lambda表達(dá)式中通常用where得到元素集合,需要的朋友可以參考下
    2023-07-07
  • Unity3D實(shí)現(xiàn)NavMesh導(dǎo)航網(wǎng)格尋路

    Unity3D實(shí)現(xiàn)NavMesh導(dǎo)航網(wǎng)格尋路

    這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)NavMesh導(dǎo)航網(wǎng)格尋路,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C#常用正則驗(yàn)證函數(shù)示例

    C#常用正則驗(yàn)證函數(shù)示例

    這篇文章主要介紹了C#常用正則驗(yàn)證函數(shù),舉例分析了C#針對IP驗(yàn)證、價(jià)格驗(yàn)證及正整數(shù)驗(yàn)證的相關(guān)操作技巧,需要的朋友可以參考下
    2017-01-01

最新評論

长沙县| 睢宁县| 潜江市| 保德县| 江口县| 左权县| 岐山县| 昌图县| 松溪县| 黑水县| 南开区| 稷山县| 汾阳市| 界首市| 汝阳县| 新沂市| 喀喇沁旗| 虞城县| 华容县| 固始县| 晋江市| 昌邑市| 濮阳县| 鄂伦春自治旗| 周口市| 启东市| 阿鲁科尔沁旗| 汝阳县| 铁岭市| 牙克石市| 连山| 邛崃市| 水城县| 阳谷县| 河津市| 揭西县| 太仓市| 楚雄市| 五大连池市| 丰县| 安龙县|