我认为这个问题不是专门针对 OpenCV ,似乎更像是一个包含问题,所以即使您不了解该库,也请阅读它。
有一个旧版本的库 (OpenCV) 安装在 /usr/local
中。在我工作的远程机器上,我没有 sudo
使用权。
我在本地环境中安装了更新版本 /home/spm1428/local
我正在使用 -I/home/spm1428/local/include/opencv
编译它和 -I/home/spm1428/local/include/opencv2
.
但是,在 #include "opencv/opencv.hpp"
的文件中我收到此错误:
In file included from /usr/local/include/opencv2/opencv.hpp:77:0,
from /home/spm1428/CloudCache/Utilities/Utility.hpp:11,
from ../Descriptors/Descriptor.cpp:17:
/usr/local/include/opencv2/highgui/highgui.hpp:165:25: error: redeclaration of ‘IMREAD_UNCHANGED’
这是由
/usr/local
中安装的旧版本库给出的错误,但我告诉他使用 -I
使用本地版本!所以似乎编译器忽略了我的
-I
指令,而是将优先级赋予 /usr/local/include
为什么会发生这种情况?
如果你想知道整个编译命令是:
g++ -DCC_DISABLE_CUDA -I/home/spm1428/CloudCache -I/home/spm1428/local/include/opencv -I/home/spm1428/local/include/opencv2 -I/usr/include/boost -I/home/spm1428/vlfeat -O3 -g -Wall -c -fopenmp -std=c++11 -c -o Descriptor.o ../Descriptors/Descriptor.cpp
使用
#include <opencv2/core.hpp>
都会发生此错误和 include "opencv2/core.hpp"
.新错误更新:
更改:
#incldue <opencv2/opencv.hpp>
至 #include "opencv2/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
由于某种原因解决了这个问题。但是,现在当我编译时:g++ -DCC_DISABLE_CUDA -I/home/spm1428/local/include -I/home/spm1428/CloudCache -I/home/spm1428/local/include/opencv -I/home/spm1428/local/include/opencv2 -I/usr/include/boost -I/home/spm1428/vlfeat -O3 -g -Wall -c -fopenmp -std=c++11 -c -o SIFTOpenCV.o ../Descriptors/SIFTOpenCV.cpp
我收到此错误:
../Descriptors/SIFTOpenCV.cpp:31:9: error: ‘class cv::Feature2D’ has no member named ‘detectAndCompute’
sift->detectAndCompute(img, cv::Mat(), pts, descriptors);
SIFTOpenCV.cpp
包括 SIFTOpenCV.hpp
,其中包括 #include "opencv2/xfeatures2d.hpp"
.我认为这个错误与前一个错误有关。最奇怪的是,这在我的本地机器上正确编译(我有
sudo
访问权限,我安装了它 /usr/local
)这是类(class)
SIFTOpenCV.hpp
:#include "Descriptors/Descriptor.hpp"
#include <opencv2/xfeatures2d.hpp>
namespace cc{
class SIFTOpenCV : public Descriptor{
public:
SIFTOpenCV(int nFeatures=0, int nOctaveLayers=3, double contrastThreshold=0.04, double edgeThreshold=10, double sigma=1.6);
void mapParams(std::vector<std::pair<std::string,std::string>> ¶ms);
void ComputeDescriptors(cv::Mat &img, cv::Mat1f &descriptors);
private:
cv::Ptr<cv::xfeatures2d::SIFT> sift;
int nFeatures, nOctaveLayers;
double contrastThreshold, edgeThreshold, sigma;
};
}
虽然
Descriptor.hpp
:#include "opencv2/core.hpp"
#include <string>
#include <map>
namespace cc{
class Descriptor{
public:
virtual void mapParams(std::vector<std::pair<std::string,std::string>> ¶ms) = 0;
virtual void ComputeDescriptors(cv::Mat &img, cv::Mat1f &descriptors) = 0;
virtual void ComputeDescriptors(const std::string &fileName, const std::string &imgExt, cv::Mat1f &descriptor);
virtual void ComputeDescriptors(const std::string &dirPath, const std::string &imgExt, std::vector<cv::Mat1f> &descriptors);
void setResizeDim(const size_t resizeDim);
void setSamples (const size_t samples);
void setOMP(const bool omp);
virtual ~Descriptor();
private:
void ComputeDescriptorsRange(const std::vector<std::string> &files, std::vector<cv::Mat1f> &descriptors, const int start, const int finish, size_t errors);
size_t resizeDim = 0; //comput full-size image
int samples = 0;
bool omp = true;
};
}
最佳答案
我自己找到了解决方案:执行 cpp -v
回我:
/usr/local/include
/usr/include
/home/spm1428/local/include
...
这意味着使用
-I/home/spm1428/local/include
被忽略,因为已经包含,但优先考虑在 /usr/local/include
中的旧版本.在新的本地目录中安装 OpenCV 并将其包含在
-I
中优先考虑新版本并解决了问题。
关于c++ - 编译器忽略我的包含 -I 新库版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42856185/