我试图在 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++ 项目使用我的构建很好地工作。
任何帮助表示赞赏。
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)