0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV课程分享 怎么在C#中使用OpenCV

新机器视觉 来源:jsxyhelu 新机器视觉 作者:jsxyhelu 新机器视觉 2021-01-12 16:32 次阅读

转自:jsxyhelu 在此特别鸣谢!

cnblogs.com/jsxyhelu/p/GOCW2020.html

一、什么是GOCW

为了解决在C#下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通过这种方法,能够分离界面和算法业务,高效率完成算法调用,而且非常方便进行算法维护。应该说是我在多年项目实践中不断总结提炼出来的一点东西。

GOCW的发布地址为:https://gitee.com/jsxyhelu2020/gocw

二、GOCW有什么特点

  • 分离界面和算法业务

  • 图像数据直接通过内存传值,高效率完成算法调用

  • 直接编写C++语法程序,方便维护改进

  • 在C#中可以通过CLR方式引用,提供函数级别接口

  • 开放源代码

三、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

    文章

    4437

    浏览量

    90550
  • C语言
    +关注

    关注

    180

    文章

    7512

    浏览量

    124051
  • 函数
    +关注

    关注

    3

    文章

    3845

    浏览量

    61214
  • 代码
    +关注

    关注

    30

    文章

    4536

    浏览量

    66487
  • OpenCV
    +关注

    关注

    29

    文章

    609

    浏览量

    40710

原文标题:C# 中使用 OpenCV

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在OpenCV中使用基于深度学习的边缘检测?

    在这篇文章中,我们将学习如何在OpenCV中使用基于深度学习的边缘检测,它比目前流行的canny边缘检测器更精确。
    的头像 发表于 05-19 09:52 1622次阅读
    如何在<b class='flag-5'>OpenCV</b><b class='flag-5'>中使</b>用基于深度学习的边缘检测?

    Qt使用openCV

    ,现在最新的是2.2,不过我用的是2.1。注意下载的时候选择VC专用版的。安装OpenCV2.1,我安装在C:/OpenCV2.1新建Qt的Project.pro文件中包含
    发表于 11-22 16:12

    【DragonBoard 410c试用体验】使用cmake编译opencv工程

    这边帖子将介绍如何自己建立一个opencv工程opencv的文件目录下新建一个文件,存放工程代码sudo mkdir test我创建了一个test文件当做测试。进入opencv文件目
    发表于 10-02 23:12

    OpenCV C++程序编译与演示

    1、JetsonNano上编译OpenCV源码与OpenCV C++ YOLOv5程序演示  编译OpenCV最新4.5.x版本  Jet
    发表于 11-10 16:42

    opencv_videoio_ffmpeg_64.dll缺失,无法OpenVINO trade中配置OpenCV怎么处理?

    ] global C:\\jenkins\\workspace\\OpenCV\\OpenVINO\\2021.4\\build\\windows\\opencv\\modules\\videoio
    发表于 08-15 08:24

    无法OpenVINO trade Docker中运行OpenCV怎么解决?

    install python3-opencv 验证 OpenCV* 安装:python3 -c \"import cv2; print(cv2.__version__)\"
    发表于 08-15 08:29

    OpenCV中的BGR格式,libyuv中对应的那个格式?OpenCV中的RGB格式呢?

    OpenCV中的BGR格式,libyuv中对应的那个格式?OpenCV中的RGB格式呢?
    发表于 09-19 06:00

    opencv备忘单

    opencv备忘单,opencv_cheatsheet,opencv_tutorials,opencv_user,opencv2refman
    发表于 08-25 15:52 0次下载

    在Vivado中如何实现OpenCV设计

    观看视频,了解OpenCV库和其在一些典型应用中的使用,以及Zynq-7000 SoC的优点和如何实现OpenCV设计。同时您还能学习到如何在设计流程中使用HLS和视频库文件。本教程将 通过一个设计实例向您讲解以上内容。
    的头像 发表于 11-20 06:46 3608次阅读

    在MFC中使OpenCV的教程下载

    在MFC中使OpenCV的教程下载
    发表于 06-26 14:35 2次下载

    opencv读入图片注意事项详解1

    深度学习数据预处理中常用opencv读入图片,一般在`__getitem__`函数中调用。本文主要介绍opencv读取图片的一些细节以及注意事项。本文中使用的图片见第6节“opencv
    的头像 发表于 02-07 16:06 432次阅读

    OpenCV常用的 7 个示例(Python版)2

    OpenCV是计算机视觉领域最流行的库之一。它最初是用 C 和 C++ 编写的。现在也可以在 Python 中使用。它最初是由英特尔开发的。该库是一个跨平台的开源库。免费使用。OpenCV 库是一个高度优化的库,其主要重点是实时
    的头像 发表于 02-07 16:23 819次阅读

    OpenCV常用的 7 个示例(Python版)3

    OpenCV是计算机视觉领域最流行的库之一。它最初是用 C 和 C++ 编写的。现在也可以在 Python 中使用。它最初是由英特尔开发的。该库是一个跨平台的开源库。免费使用。OpenCV 库是一个高度优化的库,其主要重点是实时
    的头像 发表于 02-07 16:23 768次阅读

    C#中使OpenCV

    为了解决在C#下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCsharpWrapper(GOCW)。通过这种方法,能够分离界面和算法业务,高效率完成算法调用,而且非常方便进行算法维护。应该说是我在多年项目实践中不断总结提炼出
    的头像 发表于 04-03 09:45 702次阅读

    OpenCV基础知识入门

    OpenCV是计算机视觉中最受欢迎的库,最初由intel使用C和C ++进行开发的,现在也可以在python中使用。该库是一个跨平台的开源库,是免费使用的。OpenCV库是一个高度优化的库,主要关注实时应用程序。
    的头像 发表于 10-29 11:29 348次阅读
    <b class='flag-5'>OpenCV</b>基础知识入门