*****************************************c++代码

MYDLL int GetCenterPos(uchar* imageData,int step, int widthValue, int heightValue, int BinaryThreshold, int LineBlankThreshold, int* centerX, int* centerY)
{
    
    //Mat src(widthValue, heightValue, CV_8UC3);
    //cvtColor(src, src, CV_RGB2GRAY);
    //memcpy(imageData, src.data, sizeof(uchar)*src.rows*src.cols * 3);
    Mat src = cv::Mat(heightValue, widthValue, CV_8UC4, imageData,step);//很重要的参数:CV_8UC4
    /*return src.cols;*/
    /*return src.rows;*/
    /*imshow("图1", src);*/
    /*return 99;*/
    
    int ImageWidth = src.cols;
    int ImageHeight = src.rows;
    /*Mat src ImageWidth= imread(path);*/
    // 结果图
    Mat dst;
    //灰度图转换
    cvtColor(src, dst, COLOR_RGB2GRAY);
    // 高斯模糊,主要用于降噪

GaussianBlur(dst, dst, Size(3, 3), 0);
    
    // 二值化图,主要将灰色部分转成白色,使内容为黑色
    threshold(dst, dst, BinaryThreshold, 255, THRESH_BINARY_INV);

// 中值滤波,同样用于降噪
    medianBlur(dst, dst, 3);
    //blur(dst, dst, Size(3, 3));//平滑处理
    
    //***********获取中心算法
    /*imshow("图2", dst);*/
    //********************************************横向遍历
    //map<int, int> horizonMap;//提取词典
    vector<int> vecMyHouse(0);
    vector<int> HorizonMyHouse(0);
    int height = dst.rows;
    int width = dst.cols;
    
    for (int i = 0; i < height; i++) {
        if (i % LineBlankThreshold == 0)
        {

int num = 0;
            vecMyHouse.clear();
            
            for (int j = 0; j < width; j++) {
                int index = i * width + j;
                //像素值        
                int data = (int)dst.data[index];
                
                if (data == 0)
                {        
                    /*mp.X = j;
                    mp.Y = i;*/
                    
                    vecMyHouse.push_back(j);
                    
                }

}
            
            //******
            int tempX = 0;
            int tempY = 0;
            int count = vecMyHouse.size();
            if (count > 50)
            {
                int a = 0;
            }
            if (vecMyHouse.size() <3)continue;
            if (vecMyHouse.size() > 20)continue;        
            //sort(vecMyHouse.begin(), vecMyHouse.end());//大小排序
            //最大值:            
            int max = *max_element(vecMyHouse.begin(), vecMyHouse.end());//过滤
            int min = *min_element(vecMyHouse.begin(), vecMyHouse.end());//过滤
            int tempCount = 0;
            //利用keySet方法将map中键放入到Set中,可以使用  增强for
            for (int k = 0; k < vecMyHouse.size(); k++) {
                if (vecMyHouse[k] != max&&vecMyHouse[k] != min)
                {
                    tempX += vecMyHouse[k];
                    tempCount++;
                }

}
            int value = (int)(tempX*1.0 / tempCount);
            
            HorizonMyHouse.push_back(value);
            num++;
        }
    }
    int tempX = 0;
    //最大值:
    int max = *max_element(HorizonMyHouse.begin(), HorizonMyHouse.end());//过滤
    //最小值:
    int min = max;//*min_element(HorizonMyHouse.begin(), HorizonMyHouse.end());//过滤
    sort(HorizonMyHouse.begin(), HorizonMyHouse.end());//大小排序
    int count = HorizonMyHouse.size();
    for (int z = 0; z < HorizonMyHouse.size(); z++)
    {
        if (min>HorizonMyHouse[z] && HorizonMyHouse[z] != 0)
        {
            min = HorizonMyHouse[z];
        }
        tempX += HorizonMyHouse[z];
    }
    tempX = tempX - (max + min);
    if (HorizonMyHouse.size() > 2)
    {

*centerX = (tempX *1.0 / (HorizonMyHouse.size() - 2));
    }
    else
    {
        *centerX = (HorizonMyHouse[0] + HorizonMyHouse[1]) / 2;
    }
    *centerX += 1;

#if 1
    //********************************************纵向遍历
    //map<int, int> horizonMap;//提取词典
    vector<int> vecMyHouse2(0);
    vector<int> verticalMyHouse(0);
    height = dst.rows;
    width = dst.cols;
    for (int i = 0; i < width; i++) {
        if (i % LineBlankThreshold == 0)
        {
            int num = 0;
            vecMyHouse2.clear();

for (int j = 0; j < height; j++) {
                int index = j * width + i;
                //像素值        
                int data = (int)dst.data[index];
                if (data == 0)
                {
                /*    mp.X = i;
                    mp.Y = j;*/

vecMyHouse2.push_back(j);

}

}
            //******
            int tempX = 0;
            int tempY = 0;
            int count = vecMyHouse.size();
            if (vecMyHouse2.size() <3)continue;
            if (vecMyHouse2.size() > 20)continue;
            sort(vecMyHouse2.begin(), vecMyHouse2.end());//大小排序
            //最大值:
            int max = *max_element(vecMyHouse2.begin(), vecMyHouse2.end());//过滤
            int min = *min_element(vecMyHouse2.begin(), vecMyHouse2.end());//过滤
            int tempCount = 0;
            //利用keySet方法将map中键放入到Set中,可以使用  增强for
            for (int k = 0; k < vecMyHouse2.size(); k++) {
                if (vecMyHouse2[k] != max&&vecMyHouse2[k] != min)
                {
                    tempX += vecMyHouse2[k];
                    tempCount++;
                }

}
            int value = (int)(tempX / tempCount);
            verticalMyHouse.push_back(value);
            num++;
            
        }
    }
    
    int tempY = 0;
    //最大值:
    max = *max_element(verticalMyHouse.begin(), verticalMyHouse.end());//过滤
    //最小值:
    min = max; //*min_element(verticalMyHouse.begin(), verticalMyHouse.end());//过滤
    for (int z = 0; z < verticalMyHouse.size(); z++)
    {
        if (min>verticalMyHouse[z] && verticalMyHouse[z] != 0)
        {
            min = verticalMyHouse[z];
        }
        tempY += verticalMyHouse[z];
    }
    
    tempY = tempY - (max + min);
    if (verticalMyHouse.size()>2)
    {
        *centerY = tempY / (verticalMyHouse.size() - 2);
    }
    else
    {
        *centerY = (verticalMyHouse[0] + verticalMyHouse[1]) / 2;
    }

*centerY += 1;
#endif
        return 0;
}

**********************************C#代码

public class ImageDll
    {
       [DllImport(@"G:\whh\2020\projectTest\c++\ImageAnalysis\ImageAnalysisTest2020.1.3\ImageAnalysisTest\x64\Debug\CrossDiscern.dll", EntryPoint = "GetCenterPos", CallingConvention = CallingConvention.Cdecl)]
       public static extern int GetCenterPos(IntPtr imageData,int step, int widthValue, int heightValue, int BinaryThreshold, int LineBlankThreshold, ref int centerX, ref int centerY);

[DllImport(@"CrossDiscern.dll", EntryPoint = "Sum", CallingConvention = CallingConvention.Cdecl)]
       public static extern int Sum(int a, int b);

//**********图片数据转换
       public static int GetPositionResult_XY(Bitmap bitmap,int BinaryThreshold, int LineBlankThreshold, ref int centerX, ref int centerY)
       {
#if false
           BitmapData bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
           IntPtr pSt = bmpdata.Scan0;
           int bytes = bitmap.Width * bitmap.Height * 3;
           byte[] rgbValues = new byte[bytes];
           Marshal.Copy(pSt, rgbValues, 0, bytes);
          
           int res = GetCenterPos(rgbValues, bmpdata.Stride, bitmap.Width, bitmap.Height, BinaryThreshold, LineBlankThreshold, ref centerX, ref  centerY);
           bitmap.UnlockBits(bmpdata);
           return res;
#endif
#if true
           BitmapData bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
           IntPtr pSt = bmpdata.Scan0;
           int bytes = bitmap.Width * bitmap.Height * 3;
           byte[] rgbValues = new byte[bytes];
           Marshal.Copy(pSt, rgbValues, 0, bytes);

int res = GetCenterPos(pSt, bmpdata.Stride, bitmap.Width, bitmap.Height, BinaryThreshold, LineBlankThreshold, ref centerX, ref  centerY);
           bitmap.UnlockBits(bmpdata);
           return res;
#endif
       }

}

c#调用

private void button_GetCenterPos_Click(object sender, EventArgs e)
        {
            Bitmap map = new Bitmap(sourceImage);
            int x=0;
            int y=0;
           if( ImageDll.GetPositionResult_XY(map, 80, 20, ref x, ref y)==0)
           {
             
               //MessageBox.Show("识别成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
               string content = "";//"图像大小:" + "\r\n";
               content += "起点:X=0 Y=0"+"\r\n";
               content +=( "终点:X=" + map.Width.ToString()+" Y="+map.Height.ToString()+"\r\n");
               content += "中线点:X=" + x.ToString() + " Y=" + y.ToString() + "\r\n";
               label4.Text = content;
               //*********绘制中心点
               Graphics graphics = panel3.CreateGraphics();
               Font font = new Font("宋体",16,FontStyle.Bold/*|FontStyle.Italic|FontStyle.Underline*/,GraphicsUnit.Point);//其中宋体是字体,24是字号,FontStyle的几个是字的样式,最后的GraphicsUnit是字的度量单位(可以看一下上边的表)
               graphics.DrawString("识别成功!\r\n" + content, font, Brushes.Blue, new Point(panel3.Width / 2 - 72, 25));//绘制字体,font是上边定义的字体,Brushes.Brown是颜色,Point是字从哪个位置开始绘制
          
               Brush b = new SolidBrush(Color.Red);//声明的画刷

int margin = 20;
               int tempx = Convert.ToInt32(x * 1.0 / map.Width * (panel3.Width - 2 * margin) + margin);
               int tempy = Convert.ToInt32(y * 1.0 / map.Height * (panel3.Height - 2 * margin) + margin);
               graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//平滑绘制
               graphics.FillEllipse(b, new Rectangle(tempx-5,tempy-5, 10,10));             
               graphics.Dispose();
           }
           else
           {
               MessageBox.Show("识别失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
           }
        }

c#调用c++(Opencv)dll的实例相关推荐

  1. Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

    Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需 ...

  2. C#调用C++的DLL 所有数据类型转换方式

    本以为这篇搜集整理的代码会是很不错的文章,花了一天时间,搜索到最后居然出来一篇叫做"C# 与 C++ 数据类型对照表"的文章.几乎囊括掉和大部分的数据了,太打击我了. 本文中有部分 ...

  3. python 调用 c 生成数组_python调用c++传递数组的实例

    如下所示: input = c_int * 4 # 实例化一个长度为2的整型数组 input = input() # 为数组赋值(input这个数组是不支持迭代的) input[0] = 11 inp ...

  4. 在C#调用C++的DLL简析(二)—— 生成托管dll

    写操作之前,还是扼要的说一下托管与非托管C++的区别好了,其实我也并没有深入了解过托管C++的特点所在,其最大的特征就是可以由系统来调试回收相关的代码资源,跟C#的特性一样,只是编程风格跟C++类似而 ...

  5. 调用Interop.zkemkeeper.dll无法使用解决方案

    调用Interop.zkemkeeper.dll无法使用 已经注册dll成功但是还是报错 检索 COM 类工厂中 CLSID 为 {00853A19-BD51-419B-9269-2DABE57EB6 ...

  6. nginx 调用dll_使用DLL中的资源

    我很早的时候写过一篇MFC中CDialog与其对话框资源的绑定,但这几天在MFC DLL上做了一些工作后发现当时的理解实在肤浅.说不定过了几年再回头看看目前这篇文章,又觉得本文也是鬼话连篇了吧,哈哈. ...

  7. python传递参数 调用c++ 传递vector_python调用c++传递数组的实例

    如下所示: INPUT = c_int * 4 # 实例化一个长度为2的整型数组 input = INPUT() # 为数组赋值(input这个数组是不支持迭代的) input[0] = 11 inp ...

  8. 使用C#调用非托管DLL函数

    由于工作需要,学习了GDI+编程的一些知识.其中看到了一个比较好的Demo,深入的了解后,却发现自己对如何用C#调用非托管DLL函数也有了更好的理解,于是整理了一下,跟大家一起分享. 引用: 用C#来 ...

  9. C#调用非托管Dll

    最近在项目中碰到需要调用非托管C++生成的dll,下面将自己遇到的问题,以及解决的办法总结如下:   1.      问题:     我们通常去映射dll的方法是使用         public c ...

最新文章

  1. 超20亿!2018年国家自然科学基金(重点项目)出炉!
  2. 计算机辅助设计课程描述,计算机辅助设计课程教学的现状与方法
  3. java pdf水印排布问题_Java实现pdf文件添加水印,铺满全页。
  4. HTML系列(七):多媒体
  5. 直击面试现场:神级程序员仅100秒,60行代码写出俄罗斯方块,成为全公司焦点!...
  6. 【渝粤题库】国家开放大学2021春1335幼儿园课程与活动设计题目
  7. 计算机网络中的数据链路层
  8. 再次理解javascript中的事件
  9. Oracle 数据文件 实际使用量 计算说明
  10. 清空所有textbox
  11. winrar 百度网盘_不冲百度网盘会员,如何在手机上打开网盘里的压缩包?
  12. 一种基于蓝牙的电视锁实现方案
  13. 计算机专业就业率2018,2018年就业质量报告发布,这个专业就业率竟高达100%!
  14. 小学计算机课第二课堂活动总结,小学课外活动总结范文_2020小学第二课堂工作总结精选...
  15. C语言初步-顺序结构-已知三边求三角形面积-海伦公式
  16. IDEA安装及配置jdk
  17. 关于三大主流移动操作系统的看法
  18. db.properties 之 root 之空格
  19. [JLOI2014]松鼠的新家 洛谷P3258
  20. js控制div内部滚动内容横向滑动位置

热门文章

  1. js 封装经纬度成json_全国经纬度json文件
  2. matlab xlsread参数_利用MATLAB批量完成科研数据处理
  3. JAVA复习5(总结+循环链表)
  4. python写cadance skill_《Cadence 16.6电路设计与仿真从入门到精通》——2.4 Design Entry CIS原理图图形界面...
  5. 收集bug开源框架_划重点 | 小程序框架全面测评
  6. 广东省计算机行业发展程度,广东省统计局-2020年1-4月广东规模以上工业生产运行简况...
  7. mysql spj_解决Electron启动出现短暂的白屏 - SegmentFault 思否
  8. 移动app部分机型无法唤起h5支付宝支付_用这段代码对App说:喂,醒醒!App,到你出场了!...
  9. python内建函数是什么意思_Python 自省相关的内建函数和属性
  10. C语言中,全局变量滥用的后果竟如此严重?