c#调用c++(Opencv)dll的实例
*****************************************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的实例相关推荐
- 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)需 ...
- C#调用C++的DLL 所有数据类型转换方式
本以为这篇搜集整理的代码会是很不错的文章,花了一天时间,搜索到最后居然出来一篇叫做"C# 与 C++ 数据类型对照表"的文章.几乎囊括掉和大部分的数据了,太打击我了. 本文中有部分 ...
- python 调用 c 生成数组_python调用c++传递数组的实例
如下所示: input = c_int * 4 # 实例化一个长度为2的整型数组 input = input() # 为数组赋值(input这个数组是不支持迭代的) input[0] = 11 inp ...
- 在C#调用C++的DLL简析(二)—— 生成托管dll
写操作之前,还是扼要的说一下托管与非托管C++的区别好了,其实我也并没有深入了解过托管C++的特点所在,其最大的特征就是可以由系统来调试回收相关的代码资源,跟C#的特性一样,只是编程风格跟C++类似而 ...
- 调用Interop.zkemkeeper.dll无法使用解决方案
调用Interop.zkemkeeper.dll无法使用 已经注册dll成功但是还是报错 检索 COM 类工厂中 CLSID 为 {00853A19-BD51-419B-9269-2DABE57EB6 ...
- nginx 调用dll_使用DLL中的资源
我很早的时候写过一篇MFC中CDialog与其对话框资源的绑定,但这几天在MFC DLL上做了一些工作后发现当时的理解实在肤浅.说不定过了几年再回头看看目前这篇文章,又觉得本文也是鬼话连篇了吧,哈哈. ...
- python传递参数 调用c++ 传递vector_python调用c++传递数组的实例
如下所示: INPUT = c_int * 4 # 实例化一个长度为2的整型数组 input = INPUT() # 为数组赋值(input这个数组是不支持迭代的) input[0] = 11 inp ...
- 使用C#调用非托管DLL函数
由于工作需要,学习了GDI+编程的一些知识.其中看到了一个比较好的Demo,深入的了解后,却发现自己对如何用C#调用非托管DLL函数也有了更好的理解,于是整理了一下,跟大家一起分享. 引用: 用C#来 ...
- C#调用非托管Dll
最近在项目中碰到需要调用非托管C++生成的dll,下面将自己遇到的问题,以及解决的办法总结如下: 1. 问题: 我们通常去映射dll的方法是使用 public c ...
最新文章
- 超20亿!2018年国家自然科学基金(重点项目)出炉!
- 计算机辅助设计课程描述,计算机辅助设计课程教学的现状与方法
- java pdf水印排布问题_Java实现pdf文件添加水印,铺满全页。
- HTML系列(七):多媒体
- 直击面试现场:神级程序员仅100秒,60行代码写出俄罗斯方块,成为全公司焦点!...
- 【渝粤题库】国家开放大学2021春1335幼儿园课程与活动设计题目
- 计算机网络中的数据链路层
- 再次理解javascript中的事件
- Oracle 数据文件 实际使用量 计算说明
- 清空所有textbox
- winrar 百度网盘_不冲百度网盘会员,如何在手机上打开网盘里的压缩包?
- 一种基于蓝牙的电视锁实现方案
- 计算机专业就业率2018,2018年就业质量报告发布,这个专业就业率竟高达100%!
- 小学计算机课第二课堂活动总结,小学课外活动总结范文_2020小学第二课堂工作总结精选...
- C语言初步-顺序结构-已知三边求三角形面积-海伦公式
- IDEA安装及配置jdk
- 关于三大主流移动操作系统的看法
- db.properties 之 root 之空格
- [JLOI2014]松鼠的新家 洛谷P3258
- js控制div内部滚动内容横向滑动位置
热门文章
- js 封装经纬度成json_全国经纬度json文件
- matlab xlsread参数_利用MATLAB批量完成科研数据处理
- JAVA复习5(总结+循环链表)
- python写cadance skill_《Cadence 16.6电路设计与仿真从入门到精通》——2.4 Design Entry CIS原理图图形界面...
- 收集bug开源框架_划重点 | 小程序框架全面测评
- 广东省计算机行业发展程度,广东省统计局-2020年1-4月广东规模以上工业生产运行简况...
- mysql spj_解决Electron启动出现短暂的白屏 - SegmentFault 思否
- 移动app部分机型无法唤起h5支付宝支付_用这段代码对App说:喂,醒醒!App,到你出场了!...
- python内建函数是什么意思_Python 自省相关的内建函数和属性
- C语言中,全局变量滥用的后果竟如此严重?