opencv 3.x 是否有可用的 C 接口?

OBu*_*OBu 4 c eclipse opencv

我试图在 Wondows 10 PC 上使用 MinGW/Eclipse 的普通 C 程序中使用 opencv 3.4。按照此处的说明编译和安装 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"

我使用了这里的示例代码。

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

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

任何帮助表示赞赏。

Goo*_*ies 5

cvRound() 问题是这方面的首要问题之一。

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

为什么我会收到命名空间标识符错误?

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

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

所以..有三个选择:

  • 在 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;
}
Run Code Online (Sandbox Code Playgroud)