• 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;
        }
    }
    }
    完成相应的功能
     





  • 相关阅读:
    Java集合(4):Iterator(迭代器)
    Java集合(3):Vector && Stack
    Java集合(2):LinkedList
    面试题29:顺时针打印矩阵
    面试题28:对称的二叉树
    面试题27:二叉树的镜像
    面试题26:树的子结构
    面试题24:反转链表
    面试题25:合并两个排序的链表
    面试题23:链表中环的入口结点
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/4695613.html
Copyright © 2020-2023  润新知