我正在尝试在Qt项目中运行OpenCV VideoCapture类。
当我用 int (我的mac上的摄像机为0)调用它时,它运行正常:
#include "opencv2/opencv.hpp"
#include <opencv2/highgui/highgui.hpp>
...
cv::VideoCapture cap(0);
项目编译,当我运行时,我的相机上的灯亮了。
BUT:当我尝试使用 std :: string 作为参数进行编译时,我收到链接器错误:
#include "opencv2/opencv.hpp"
#include <opencv2/highgui/highgui.hpp>
...
cv::VideoCapture cap("/Users/xxxxx/small.mp4");
结果:
Undefined symbols for architecture x86_64:
"cv::VideoCapture::VideoCapture(std::string const&)", referenced from:
MainWindow::MainWindow(QWidget*) in mainwindow.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
虽然 std :: string 的构造函数应该存在: http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-videocapture
我的规格:
我的.pro文件:
QT += core gui widgets
TARGET = VideoCaptureTest
TEMPLATE = app
SOURCES += main.cpp mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
INCLUDEPATH += /usr/local/include
LIBS += -L/usr/local/lib
LIBS += -lopencv_core
LIBS += -lopencv_imgproc
LIBS += -lopencv_highgui
LIBS += -lopencv_ml
LIBS += -lopencv_video
LIBS += -lopencv_videostab
LIBS += -lopencv_features2d
LIBS += -lopencv_calib3d
LIBS += -lopencv_objdetect
LIBS += -lopencv_contrib
LIBS += -lopencv_legacy
LIBS += -lopencv_flann
我在SO上发现了这个问题,这似乎与我的问题完全相同: Linking error: undefined reference to `cv::VideoCapture::open(std::string const&)`
看起来我的问题可能与OPC版本的OpenCV有关。但我检查了我的include目录和我的lib目录,我似乎只安装了2.4.9。 Qt可能有不同的版本吗?
我尝试使用
直接在我的.pro文件中包含版本2.4.9LIBS += -lopencv_core2.4.9
...
但是我如何确保在源文件中也包含此版本?
我虽然可能与Mac和x86_64有关。我在.pro文件中包含了以下几行,我在网上找到了这些行:
CONFIG += x86 ppc x86_64 ppc64
CONFIG += MAC_CONFIG
MAC_CONFIG {
QMAKE_CXXFLAGS = -std=c++11 -stdlib=libstdc++ -mmacosx-version-min=10.7
QMAKE_LFLAGS = -std=c++11 -stdlib=libstdc++ -mmacosx-version-min=10.7
}
但这也没有效果。
这里(http://answers.opencv.org/question/14772/solved-linking-error-undefined-reference-to-cvvideocaptureopenstdstring-const/)建议尝试 cv :: String 而不是 std :: string 。我也试过这个:
#include "opencv2/opencv.hpp"
...
cv::String s("/Users/xxxxx/small.mp4");
cv::VideoCapture cap(s);
奇怪的是我仍然得到完全相同的错误:
Undefined symbols for architecture x86_64:
"cv::VideoCapture::VideoCapture(std::string const&)", referenced from:
MainWindow::MainWindow(QWidget*) in mainwindow.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
似乎 cv :: String 实际上转换为 std :: string ,我猜是因为编译器在某处找到了构造函数的定义 std :: string ,但链接器没有?
显然OSX 10.9存在类似的问题,而不是cv :: VideoCapture,但通常导致x86_64的链接错误。解决方案是包括
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9
<。>在.pro文件中。我也尝试了10.9和10.10(我实际上正在使用)。还是一样的错误。这可能是我的OSX版本的问题吗?
我没有找到关于如何解决问题的其他建议。有人知道我做错了什么吗?任何帮助表示赞赏!
帕特里克
答案 0 :(得分:4)
答案已在链接的讨论(@wezside)中给出(说明的第1项)。
for OpenCV 3.0(也是2.4.9?)
你需要添加
LIBS += -lopencv_videoio
到.pro,你的遗失了。
答案 1 :(得分:-1)
经过几个小时的研究后,我发现将private void label1_TextChanged(object sender, EventArgs e)
{
//You can use any logic here,
//for example you can check if(label1.Text=="something")
this.checkBox1.Checked = false;
}
添加到.pro文件中,删除以前的.pro.user文件和构建目录可以解决问题。第二步是必需的。
我在El Capitan。