托管C++ – OpenCV 图像处理工程项目

本文介绍了如何使用托管C++创建OpenCV图像处理的COM组件,供WPF工程引用。讨论了托管与非托管C++项目之间的区别,以及在创建、配置、引用和调用过程中的关键步骤和注意事项,包括类型转换、内存管理和依赖项检查。
摘要由CSDN通过智能技术生成

托管C++– OpenCV 图像处理工程项目:

C++ 托管和非托管项目的区别:

         C++ 托管项目,采用C++语言编写COM组件,导出函数或类,供CLR(公共语言运行时)C++托管类封装接口。编写的C++ COM组件不需要,公共语言运行时(/clr)支持。编写C++托管类COM组件,需要,公共语言运行时支持。

         创建VC++项目,可以在属性配置中->常规:

                                   

         修改(配置类型)可以选择.exe进行调试。可以选择.dll 生成组件

         修改(公共语言运行时支持(/clr)),编写供WPF工程引用的COM组件

注意:带有/clr头的组件可以用ildasm.exe 进行反编译,可以在VS 2013 x86 命令提示符,控制台中,输入ildasm x.dll 反编译组件头的部分,需要双击MANIFEST字段,查看组件依赖的.net版本信息,包含Version, publickeytoken。有可能会在注册全局程序集命令:gacutil 中用到。以上提到的命令可以使用 /? 选项查看详细说明。本文档过程中未用到,但相关错误,查看众多博客有用这两个命令解决。

         C++项目导出类声明:class __declspec(dllexport) [class_name]{};

         托管C++项目引用类声明:public ref class [class]{};

         托管C++项目值类声明:public value class [class]{};

         托管C++项目需要申明命名空间名。所有类和函数需要包含到命名空间中。供引用时调用。

 

关于托管C++:https://msdn.microsoft.com/zh-CN/library/68td296t.aspx

 

         非托管C++项目,采用非托管的C++组件,在WPF项目中引用,方法类似于Android中使用到JNI:Java、C++混合编程。使用C++编写COM组件,导出函数。尝试过导出类,但在引用处无法调用。查看过众多博客,没见使用非托管的方式导出类,有博客提到非托管方式导出类,方式较为繁琐。本处留作以后尝试。

         同样创建普通C++ 控制台工程即可。(配置类型)设置为.dll。同样可以设置为.exe进行调试。

         在导出函数前添加导出声明:__declspec(dllexport)

非托管C++项目:

WPF项目中的调用:

using System.Runtime.InteropServices; //使用DllImport需要用到的命名空间

public class cppdll

{

        [DllImport(@"Base.dll", CharSet =CharSet.Ansi)]

        publicstaticexternIntPtr print();

}

可以编写类来封装导出函数。其中IntPtr对应于C++中的char*。

在调试模式下需要将编译好的COM组件放置到bin->Debug目录下。发布程序需要放到Release目录下。

组件申明表达式:

[DllImport(@”dll文件路径”,[EntryPoint = [函数名]], [CharSet = [对应字符集]])]

函数需申明为外部链接静态函数。

托管C++项目:

创建控制台工程(空项目)VideoStreamReader:

VideoReader.h:
#ifndef VIDEO_READER_H
#define VIDEO_READER_H
#inc
OpenCV小项目 这是一个个人在使用OpenCV过程中写的一些小项目,以及一些非常有用的OpenCV代码,有些代码是对某论文中的部分实现。 注意:代码是在Xcode里写的,如果要在win下测试,遇到问题自己修改。 opencv-rootsift-py 用python和OpenCV写的一个rootsift实现,其中RootSIFT部分的代码参照Implementing RootSIFT in Python and OpenCV这篇文章所写,通过这个你可以了解Three things everyone should know to improve object retrieval这篇文章中RootSIFT是怎么实现的。 sift(asift)-match-with-ransac-cpp 用C++OpenCV写的一个图像匹配实现,里面包含了采用1NN匹配可视化、1NN匹配后经RANSAC剔除错配点可视化、1NN/2NN<0.8匹配可视化、1NN/2NN<0.8经 RANSAC剔除错配点可视化四个过程,其中1NN/2NN<0.8匹配过程是Lowe的Raw feature match,具体可以阅读Lowe的Distinctive image features from scale-invariant keypoints这篇文章。这个对图像检索重排非常有用。另外里面还有用OpenCV写的ASIFT,这部分来源于OPENCV ASIFT C++ IMPLEMENTATION,ASIFT还可以到官网页面下载,ASIFT提取的关键点 比SIFT要多得多,速度非常慢,不推荐在对要求实时性的应用中使用。 更多详细的分析可以阅读博文SIFT(ASIFT) Matching with RANSAC。 有用链接 OpenCV3.0文档 // 测试sparse unsigned int centersNum = 10; vector descrNums; descrNums.push_back(8); descrNums.push_back(12); //unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5; 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; unsigned int T[] = {1, 2, 1, 3, 2, 5, 4, 3, 10, 5, 4, 2, 6, 5, 2, 5, 4, 6, 2, 4}; sp_mat Hist(descrNums.size(), centersNum); static long int count = 0; for (int i = 0; i < descrNums.size(); i++){ unsigned int* desrcElementsTmp = new unsigned int[descrNums[i]]; memcpy(desrcElementsTmp, T + count, descrNums[i] * sizeof(T[0])); //cout << desrcElementsTmp[0] << '\t' << desrcElementsTmp[1] << '\t' << desrcElementsTmp[2] << '\t' << desrcElementsTmp[3] << '\t' << desrcElementsTmp[4] << '\t' <<endl; //cout << desrcElementsTmp[5] << '\t' << desrcElementsTmp[6] << '\t' << desrcElementsTmp[7] << '\t' << desrcElementsTmp[8] << '\t' << desrcElementsTmp[9] << '\t' << desrcElementsTmp[10] << '\t' <<endl; //cout << endl; sp_mat X(1, centersNum); X.zeros(); for (int j = 0; j < descrNums[i]; j++){ X(0, desrcElementsTmp[j]-1) += 1; } X.print("X:"); X = X/norm(X, 2); Hist.row(i) = X; count = count + descrNums[i]; delete desrcElementsTmp; } //Hist.print("Hist:");
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值