csharp通过dll调用opencv函数,图片作为参数

简介: [blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数          ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找到了比较好的资料。
[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( 00, 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;
    }
}
}
完成相应的功能
 





目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
47 0
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
33 0
|
3月前
|
存储 编解码 监控
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
47 0
|
3月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
48 0
|
13天前
|
前端开发 API 计算机视觉
opencv绘制基本图形,在图片上添加文字
opencv绘制基本图形,在图片上添加文字
|
24天前
|
机器学习/深度学习 算法 自动驾驶
opencv python 图片叠加
【4月更文挑战第17天】
|
3月前
|
C++ 计算机视觉 Python
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)
40 0
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)
|
3月前
|
监控 算法 Serverless
OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析
OpenCV这么简单为啥不学——1.12、使用ssim函数对两张照片进行相似度分析
50 0
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.10、addWeighted设置图片透明度
OpenCV这么简单为啥不学——1.10、addWeighted设置图片透明度
28 0
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
38 0