[blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数
 
       ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找到了比较好的资料。一个是thinimage,一个是basework,里面都实现了这里的“csharp通过dll调用opencv函数,并且采用图片作为参数”。这里小结如下。
       关于如何“csharp通过dll调用opencv函数”,请参考前面博文,这里主要说如何“采用图片为参数”。
       在编写图像识别/增强/机器视觉等项目的时候,一般会将算法打包成dll文件给客户,如果界面是用mfc写的话,是很好实现这个功能的。但是也有一些时候,由于特殊的需求,或者为了更快地实现更为丰富的界面效果,选择csharp作为界面。这个时候就需要“图片作为参数”。
      本项目是一个实验项目,功能就是csharp下读入一个24位彩色图片,调用opencv进行ycbcr变换后,然后再csharp上面显示出来。
      因为在调用的过程中,传递的只是指针, 所以这个转换需要做两方面的工作。一个方面是 csharp这边的,具体来说就是需要创建bitmap的结构,并且在调用的过程中锁定内存;一个方面是在opencv和dll编写这边的,要能够读入内存区域,并且翻译成mat结构。然后在这个基础上面编写相关的处理程序。
       继续开源项目ThinyImage,这个过程的以实现。
       ThinyImage本身就是csharp调用c++编写的dll实现的图像处理软件,也实现了一些功能:
那么在现有的程序上面添加GO算法接口
csharp这边,进行内存锁定和函数调用操作
private void ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            StartImageProcess();
            try
            {
                BitmapData bitmapData = m_bitmap.LockBits(new Rectangle(0, 0, m_bitmap.Width, m_bitmap.Height),
                                                            ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
                NativeMethods.DirectCopy(bitmapData.Scan0, bitmapData.Width, bitmapData.Height, bitmapData.Stride, m_bpp);
                m_bitmap.UnlockBits(bitmapData);
            }
            catch (System.Exception)
            {
            }
            EndImageProcess();
        }
相应添加程序接口,
//联合opencv的模板函数
void  DirectCopy(TiBitmapData& bitmap){
     //获得基本参数
     int width    = bitmap.GetWidth();
     int height    = bitmap.GetHeight();
     int stride    = bitmap.GetStride();
     int bpp        = bitmap.GetBpp();
     u8* bmpData    = bitmap.GetBmpData();
     int offset    = stride - width * bpp;
     Mat src = Mat::zeros(width,height,CV_8UC3);
     //将bitmap的内容拷贝到src中
     for(int i=0;i<src.rows;i++){       
         for(int j=0;j<src.cols;j++){    
             src.at<Vec3b>(i,j)[0]=(int)bmpData[TiBlue];
             src.at<Vec3b>(i,j)[1]=(int)bmpData[TiGreen];
             src.at<Vec3b>(i,j)[2]=(int)bmpData[TiRed];
             bmpData += bpp;
        }
          bmpData += offset;
     }
    /OPENCV具体操作过程
    Mat dst;
    cvtColor(src,dst,COLOR_BGR2YCrCb);;
    /OPENCV过程结束
    bmpData    = bitmap.GetBmpData();
    for(int i=0;i<src.rows;i++){       
        for(int j=0;j<src.cols;j++){    
            bmpData[TiBlue]= dst.at<Vec3b>(i,j)[0];
            bmpData[TiGreen]= dst.at<Vec3b>(i,j)[1];
            bmpData[TiRed]= dst.at<Vec3b>(i,j)[2];
            bmpData += bpp;
        }
        bmpData += offset;
    }
}
}
完成相应的功能
 
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/jsxyhelu/p/4695613.html

csharp通过dll调用opencv函数,图片作为参数相关推荐

  1. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何"csharp通过dll调用opencv函数,图片作为参数 ...

  2. Java调用opencv实现图片去水印

    opencv实现图片去水印案例 Java调用opencv实现图片去水印 环境安装配置 IDEA下开发配置 测试案例 Java调用opencv实现图片去水印 最近项目中遇到个需求,图片去水印下载,由于上 ...

  3. 基于Ubuntu系统,调用opencv在图片上显示数字和汉字

    文章目录 一.汉字编码的介绍 1.汉字编码的发展过程 (1)汉字编码产生的原因 (2)常用的汉字编码 2.区位码 (1)产生原因 (2)概念简述 (3)区域分布情况 3.机内码 (1)基本概念 (2) ...

  4. python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...

    在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...

  5. c语言中ntdll.dll,在Win32环境中从ntdll.dll调用Nt函数,C

    我想从ntdll.dll调用一些Nt函数,我就是这样做的. 对于调用:NtTestAlert(),您需要典型的ntcall内核例程,可通过int 2Eh访问. (从这里我得到Nt功能http://un ...

  6. Ubuntu 下调用 opencv 在图片显示汉字和数字

    目录 实验要求: 1 环境准备 1.1创建文件 实验要求: 学习理解汉字的机内码.区位码编码规则和字形数据存储格式.在Ubuntu下用C/C++(或python) 调用opencv库编程显示一张图片, ...

  7. Qt中调用OpenCV函数库时Crashed问题的解决。

    这几天想在虚拟机上搭建Ubuntu的开发环境,包括了Matlab和QT(C++)的开发工具安装等,同时由于做图像处理,所以还必须要安装FFMPEG和OpenCV库.下面就讲讲我们安装时出现qt中调用O ...

  8. c++调用opencv实现图片叠加以及添加水印效果

    前言 本篇文章参考了以下文章: https://blog.csdn.net/mars_xiaolei/article/details/78791133 https://answers.opencv.o ...

  9. python调用opencv放大图片

    代码如下,简单易懂: import cv2# 横纵轴放大比例 fx = 2 fy = 2 img = cv2.imread('frame_000001.jpg') enlarge = cv2.resi ...

最新文章

  1. php 5/0,PHP 5.5.0 released.该怎么解决
  2. 一个函数打天下,einsum
  3. 在easyui中在同一列中合并相同连续值的jquery插件
  4. 通过OWA修改密码,提示输入的密码不符合最低安全要求
  5. 从Gradle自动将工件提升到Maven Central
  6. dax 筛选 包含某个字_筛选状态(ALL与REMOVEFILTERS)
  7. 微信企业号-根据code获取成员信息(过期code)
  8. 相对路径和绝对路径_linux系统中的绝对路径和相对路径
  9. Function:函数对象
  10. Redhat as 4 中创建 LVM 逻辑卷
  11. postman中从url中获取各参数值
  12. win10自带功能 进行磁盘分区
  13. 比较不错的MaciOS软件论坛
  14. 【SpringBoot+Mybatis】bootstrap/sematic UI与pagehelper实现分页
  15. 【STM32H750】玩转ART-Pi(二)——制作MDK的外部QSPI-FLASH烧录算法
  16. 再添荣誉!青软集团获评「山东省科技小巨人企业」称号
  17. 一键式统计6.0通透
  18. Serenity Screenplay模式
  19. [经验教程]手机上微信新消息不提示也不显示微信消息通知怎么办?
  20. IDEA 批量修改变量名、批量替换代码快捷键

热门文章

  1. 【JVM调优】JVM的运行参数
  2. Github上最受关注的前端大牛,快来膜拜吧!
  3. 华为+京东数科(原京东金融)面经--Java后台开发
  4. 责任链模式——HeadFirst设计模式学习笔记
  5. 自己写的一个复杂查询
  6. Android Toolbar Padding
  7. Apache+Openssl
  8. struts2 学习记录 之 国际化
  9. 做人应该知道的十个道理
  10. JAVA单向/双向链表的实现