C程序能否调用OpenCV函数?如何用纯C实现OpenCV SVD相似变换
基于SVD实现相似变换的纯C代码方案说明
报错原因说明
你遇到的#error core.hpp header must be compiled as C++报错,是因为引用了OpenCV的C专属头文件,C编译器不支持头文件中的C语法特性,所以触发了编译拦截。
是否可以用纯C实现需求
可以完全通过纯C代码完成基于SVD的相似变换实现,有两种主流实现路径:
路径1:使用OpenCV的官方C语言接口
- 仅适用于OpenCV 1.x、2.x以及更高版本的兼容模式,不需要引入任何C++头文件,仅引用
opencv2/core/core_c.h这个C版本核心头文件即可。 - 调用C接口的
cvSVD函数完成矩阵分解,后续相似变换参数的计算逻辑和C++版本逻辑一致:- 对两组匹配点分别做中心化处理,计算各自的质心
- 计算两组中心化后点集的协方差矩阵
- 对协方差矩阵做SVD分解,得到U、S、V三个矩阵
- 旋转矩阵R = U * V^T,缩放系数s由奇异值S的均值比值计算得到,平移向量t由两组点的质心、R、s共同计算得到
- 编译时直接链接C版本的OpenCV库即可,不会触发C++编译要求。
路径2:独立实现SVD逻辑,不依赖OpenCV
- 你可以直接引入纯C实现的轻量SVD计算代码,不需要依赖任何OpenCV库,完全避免C++相关的编译问题。
- 相似变换的计算逻辑和上述逻辑完全一致,只需要把SVD分解的替换为自行实现的C版本函数即可。
补充:C/C++混编的正确实现方式
如果你需要使用高版本OpenCV的C++ SVD接口,可以把调用OpenCV C++ API的逻辑单独封装在独立的.cpp文件中,对外暴露的接口用
extern "C"修饰,C代码仅调用你封装好的纯C接口即可。编译时先用C++编译器编译.cpp文件生成目标文件,再和C代码的编译结果做链接,即可避免core.hpp的编译报错。
内容的提问来源于stack exchange,提问作者young
相关产品推荐
相关产品推荐

