色婷婷AV无码久久精品,久久天天躁狠狠躁夜夜97,羞羞麻豆国产精品1区2区3区,啪影院免费线观看视频,思思久久er99精品亚洲

常州機器視覺培訓

常州上位機軟件開發(fā)

常州工業(yè)機器人編程設計培訓

常州PLC培訓

常州PLC

常州PLC編程培訓

常州電工培訓

常州和訊plc培訓中心歡迎您!
當前位置:網站首頁 > 新聞中心 新聞中心
C# 中使用 OpenCV-常州上位機培訓,常州機器視覺培訓
日期:2024-2-20 16:26:04人氣:  標簽:常州上位機培訓 常州機器視覺培訓

一、什么是GOCW

為了解決在C#下編寫OpenCV程序的問題,我做過比較深入的研究,并且實現(xiàn)了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通過這種方法,能夠分離界面和算法業(yè)務,高效率完成算法調用,而且非常方便進行算法維護。應該說是我在多年項目實踐中不斷總結提煉出來的一點東西。


二、GOCW有什么特點

分離界面和算法業(yè)務

圖像數(shù)據(jù)直接通過內存?zhèn)髦,高效率完成算法調用

直接編寫C++語法程序,方便維護改進

在C#中可以通過CLR方式引用,提供函數(shù)級別接口

開放源代碼


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

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

22.png

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

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

14.png

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

15.png

16.png

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

17.png

18.png

特別需要注意2:

保證dll和csharp程序的.net目標框架是一致的

配置管理器中,所有項目版本全部使用64位

19.png

四、測試代碼

可以直接參考 WINFROM_DEMO

20.png

添加GOCW的頭文件

using GOCW;

編寫GOCW調用代碼,你也可以根據(jù)需要吧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;

}



可以看到,實現(xiàn)了"灰度"變化。

21.jpg

五、原理簡介

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:

      /////例子函數(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 int14.png;

          value22.png = 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è)務函數(shù)//////

        /*unsafe

        {

            int* value = stackalloc int14.png;//返回代碼

            value22.png = 0;

            bitmap = client.fetchresult(bytes, value);//調用來自GOClrClasslibrary圖像處理算法

            if (value22.png == 0)//0真1假

            {

                res = true;

            }

            else

            {

                res = false;

            }

        }*/

        Bitmap^  GOCWClass::fetchresult(cli::array<unsigned char>^ pCBuf1, int* errorCode);

    };

}



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


//1.傳遞圖像

Bitmap^  GOCWClass::testMethod(cli::array<unsigned char>^ pCBuf1)

{

    ////////////////////////////////將輸入cli::array<unsigned char>轉換為cv::Mat/////////////////////////

    pin_ptr<System::Byte> p1 = &pCBuf122.png;

    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格式數(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è)務函數(shù),可以根據(jù)實際算法要求進行修改。關于參數(shù)的傳入傳出,在其他幾個函數(shù)中都有說明。



六、初步小結

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

感謝閱讀至此,希望有所幫助!


本文網址:
下一篇:沒有資料

相關信息:
版權所有 CopyRight 2006-2017 江蘇和訊自動化設備有限公司 常州自動化培訓中心 電話:0519-85602926 地址:常州市新北區(qū)府琛商務廣場2號樓1409室
蘇ICP備14016686號-2 技術支持:常州山水網絡
本站關鍵詞:常州PLC培訓 常州PLC編程培訓 常州PLC編程 常州PLC培訓班 網站地圖 網站標簽
在線與我們取得聯(lián)系
色婷婷AV无码久久精品,久久天天躁狠狠躁夜夜97,羞羞麻豆国产精品1区2区3区,啪影院免费线观看视频,思思久久er99精品亚洲