[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)

时间: 2024-11-06 17:10:53

[blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数的相关文章

[blog 项目实战派]csharp通过dll调用opencv函数

[blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数 前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”.而在实际的代码编写过程中,很多时候想把已经写好的matlab函数融合进去,但是依然是将图片作为参数传递比较成为问题.这里我经过一段时间的研究解决了这个问题(目前只解决了灰度图片下的图片传递问题).这个问题包含几个难点,一个是mxmatrix的使用,一个是matlab和opencv对于图片的格式处理是不一样的. 本次这个项目,是opencv通

[blog 项目实战派]钢管识别项目2

钢管识别项目2 零.相关说明: 首先进行一下相关说明.在"jsxyhelu.cnblogs.com/项目实战派"栏目里面出现的需求.图片和其他资源,都是我在浏览威客网站.论坛等网站的时候通过正规渠道获得的真实需求.个人觉得比较感兴趣,但是由于时间或者工作的冲突自己没有去接这些项目.但是由于这些需求都很有实现价值,所以过了一段时间,仍然拿出来练一练手,并且实现了核心模块.希望能够给浏览者一些启发.如果你认为这些图片和资源放在这里不合适,请及时联系我([email protected]),

[blog 项目实战派]压板识别项目分析

压板识别项目 零.相关说明: 首先进行一下相关说明.在"jsxyhelu.cnblogs.com/项目实战派"栏目里面出现的需求.图片和其他资源,都是我在浏览威客网站.论坛等网站的时候通过正规渠道获得的真实需求.个人觉得比较感兴趣,但是由于时间或者工作的冲突自己没有去接这些项目.但是由于这些需求都很有实现价值,所以过了一段时间,仍然拿出来练一练手,并且实现了核心模块.希望能够给浏览者一些启发.如果你认为这些图片和资源放在这里不合适,请及时联系我([email protected]),我

[blog 项目实战派]钢管识别项目1

钢管识别项目1 零.相关说明: 首先进行一下相关说明.在"jsxyhelu.cnblogs.com/项目实战派"栏目里面出现的需求.图片和其他资源,都是我在浏览威客网站.论坛等网站的时候通过正规渠道获得的真实需求.个人觉得比较感兴趣,但是由于时间或者工作的冲突自己没有去接这些项目.但是由于这些需求都很有实现价值,所以过了一段时间,仍然拿出来练一练手,并且实现了核心模块.希望能够给浏览者一些启发.如果你认为这些图片和资源放在这里不合适,请及时联系我([email protected]),

【项目实战派】图像处理项目硬件选型

[项目实战派]图像处理项目的硬件平台选型 一直以来我都对嵌入式系统比较感兴趣,因为感到图像处理最终还是要走向便携式.移动化的.这里讲自己对图像处理项目的硬件平台选型这块的想法进行交流,欢迎交流.批评. 一.典型图像处理系统构建 ①相机与镜头--这部分属于成像器件,通常的视觉系统都是由一套或者多套这样的成像系统组成,如果有多路相机,可能由图像卡切换来获取图像数据,也可能由同步控制同时获取多相机通道的数据.根据应用的需要相机可能是输出标准的单色视频(RS-170/CCIR).复合信号(Y/C).RG

【项目实战派】触摸屏程序设计要点

[项目实战派]触摸屏程序设计要点            触摸屏作为一种更为直接的人机交互方式,现在广泛运用于智能手机.工业控制.场景展示等许多场合.作为程序员,如何理解触摸屏程序设计?如何做好的触摸屏程序设计?现在已经有的资源包括那些?借着项目牵引,我对这个问题进行一定探索,经验有限,欢迎批评交流. 一.如何理解触摸屏程序设计 操作系统层面已经实现了基础功能,基于触摸屏的界面,从本质上来说和普通的GuI界面是没有区别的.程序的界面设计需要服务于程序的功能,为客户提供直观.易用.体验效果较好的界面

[转] matlab调用opencv函数的配置

原文地址百度账户 aleasa123 1.  首先保证vs2010能正确调用opencv函数, 2.  Matlab中选择编译器,操作如下: 打开matlab2012,输入mex –setup,出现如下提示: Welcome to mex -setup. This utility will help you set up a default compiler. For a list of supported compilers, see http://www.mathworks.com/supp

matlab调用opencv函数的配置

环境: VS2010 活动解决方案平台x64 WIN 8.1 Opencv 2.4.3 Matlab 2012a 1.  首先保证vs2010能正确调用opencv函数, 2.  Matlab中选择编译器,操作如下: 打开matlab2012,输入mex –setup,出现如下提示: Welcome to mex -setup.  This utility will help you set up a default compiler.  For a list of supported comp

如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)

写在前面:学习CUDA过程中看到了可以用OpenCV写一个类,然后直接调用的方法,感觉很有意思(基础太差,可能这是个很基础的问题).于是就想在 C# 中调用OpenCV的方法,发现有点麻烦,需要生成 .dll(动态链接库)文件,生成过程中出了些小问题,所以把这个过程记录下来,以备以后查看. 首先,你的电脑上需要安装OpenCV,具体安装过程百度即可,并不难(具体可以参见我转载的另一篇OpenCV配置的文章).下面开始进入正题,以VS2017为例. 1.  新建 空项目=>确定(注意,项目名称与下