【问题标题】:Is there a working C interface for opencv 3.x?opencv 3.x 是否有可用的 C 接口?
【发布时间】:2018-06-30 03:56:02
【问题描述】:

我试图在 Wondows 10 PC 上使用 MinGW/Eclipse 的普通 C 程序中使用 opencv 3.4。按照here 的说明,opencv 的编译和安装工作得很好,但是当我在 eclipse 项目设置中只包含库、头文件等时,我得到一个

C:/opencv/MinGW_build/install/include/opencv2/imgproc/imgproc_c.h:1041: undefined reference to cvRound(之前有很多警告)

我的编译命令是 gcc "-IC:\\opencv\\MinGW_build\\install\\include" "-IC:\\opencv\\MinGW_build\\install\\include\\opencv2" "-IC:\\opencv\\MinGW_build\\install\\include\\opencv" -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\opencv_c_testproject.o" "..\\src\\opencv_c_testproject.c"

我使用了来自here的示例代码。

在挖掘了几篇帖子之后,问题可能是在 opencv 3 中放弃了对 C 的支持?还是我只是搞砸了我的配置?

一个简单的 c++ 项目可以很好地使用我的构建。

感谢任何帮助。

【问题讨论】:

  • 在 OpenCV 3.X 中,大规模使用现代 C++(C++11 或更新版本)。旧的 C API 可能会被删除。一些新鲜的模块也没有提供。使用 OpenCV 3.X 时应选择官方支持的 C++ API。或者可能会出现无休止的编译失败消息。
  • 奇怪的是,网站在首页上写着“它有 C++、C、Python 和 Java 接口”...
  • 不同版本有不同的API(大部分是相同的)。

标签: c eclipse opencv


【解决方案1】:

cvRound() 问题是最早出现的问题之一。

还有更多。普通 .C 文件在安装时附带的 3.x core_c.h 包含问题。它使用 cv_def.h 似乎有 #defines 允许它使用“命名空间”关键字,这在你的 C 文件中是错误的。

Why am I getting a namespace identifier error?

https://github.com/opencv/opencv/issues/10963

一些讨论 OpenCV 的 Github 成员建议对这些问题进行修复,但 OpenCV 项目贡献者坚持认为纯 C API 在版本 3.x 之前的某个地方已停止使用!

所以..有三个选项:

  • 回到 3.x 版之前的 OpenCV

  • 使用 OpenCV 3.x,带有较旧的 2.4 头文件。我在 3.0.0 中使用过它。但这是有风险的!

  • 或.. 杀死你的宝贝.. 对于任何其他配置,请使用 C++ 和 .CPP 扩展名。我最近使用 VS2017 在 C++ 64 位中使用 OpenCV 3.4 测试了 C-struct lpIImage。运行良好,见下文。你不必重写东西。只需嵌入您的 C 代码,或将其声明为 C++ 静态函数。 Mat 和 lpIImage 接口都将可用:

,

 //CVMain3.cpp
 #include <stdio.h>
 #include <iostream>
 #include <string>
 #include <opencv2/core.hpp>
 #include <opencv2/imgproc.hpp>
 #include <opencv2/highgui.hpp>

 using namespace cv;
 using namespace std;

 static IplImage *CVGreyImageFromFile(const char *FileName)
 {
    IplImage *img = cvLoadImage(FileName, CV_LOAD_IMAGE_GRAYSCALE);
    return img;
 }

 int mainTest()
 {   
    string filename = "c:/test/mytestimage.jpg";
    IplImage *im1 = CVGreyImageFromFile(filename.c_str());
    if (im1 != NULL)
    {
        cvShowImage("window showing lpIImage", im1);
        Mat AK = cv::cvarrToMat(im1, false, true, 0, 0);
        imshow("window showing Mat", AK);
        cvReleaseImage(&im1);
    }
    else cout << "No CVGreyImageFromFile.";
    cv::waitKey(10000);
    getchar();    
    return 0;
}

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 2014-02-08
    • 2011-07-21
    • 2022-12-14
    • 2012-04-30
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多