web-dev-qa-db-fra.com

Erreur de référence non définie d'OpenCV 3.0?

Je viens de suivre les instructions pour installer opencv 3 sur mon ordinateur ubuntu (j'ai déjà installé et exécuté des programmes utilisant opencv 3 sur un autre appareil Linux), cependant, lorsque j'ai essayé d'exécuter l'un de mes programmes de test à partir de mon ancien ordinateur J'obtiens les erreurs suivantes:

CMakeFiles/VideoTest.dir/VideoTest.cpp.o: In function `main':
VideoTest.cpp:(.text+0x6f): undefined reference to `cv::VideoWriter::fourcc(char,char,char, char)'
VideoTest.cpp:(.text+0xc3): undefined reference to `cv::VideoWriter::open(cv::String const&, int, double, cv::Size_<int>, bool)'
VideoTest.cpp:(.text+0x103): undefined reference to `cv::namedWindow(cv::String const&, int)'
VideoTest.cpp:(.text+0x146): undefined reference to `cv::VideoCapture::read(cv::_OutputArray const&)'
VideoTest.cpp:(.text+0x1b1): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
CMakeFiles/VideoTest.dir/VideoTest.cpp.o: In function `cv::String::String(char const*)':
VideoTest.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x3b): undefined reference to `cv::String::allocate(unsigned int)'
CMakeFiles/VideoTest.dir/VideoTest.cpp.o: In function `cv::String::~String()':
VideoTest.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0xd): undefined reference to `cv::String::deallocate()'
collect2: ld returned 1 exit status
make[2]: *** [VideoTest] Error 1
make[1]: *** [CMakeFiles/VideoTest.dir/all] Error 2
make: *** [all] Error 2

Une idée de ce qui se passe? Je suis relativement nouveau à l'opencv. Voici mon code de test pour référence:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[]){
    VideoCapture vCap(0);
    VideoWriter vWrite;
    vWrite.open("test.avi", vWrite.fourcc('M','J','P','G'), 20, Size(640, 480), true);
    while (1) {
        namedWindow("VideoFeed", WINDOW_AUTOSIZE);
        Mat frame;
        vCap.read(frame);
        vWrite.write(frame);
        imshow("VideoFeed", frame);
        char c = waitKey(50);
        if (c == 27) {
            break;
        }
    }
    return 0;
}

Merci d'avance.

Edit: My CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(VideoTest)
find_package(OpenCV REQUIRED)
add_executable(VideoTest VideoTest.cpp)
target_link_libraries(VideoTest ${OpenCV_LIBS})
14
potatoprogrammer

VideoCapture et VideoWriter ont été déplacés vers le module videoio en 3.0, vous devez donc en plus

#include "opencv2/videoio.hpp"

de plus, vous ne semblez pas link à l'une des bibliothèques opencv requises, ce sont:

opencv_core, opencv_videoio, opencv_highgui
26
berak

D'accord, j'ai enfin compris ce qui se passe. Quelque chose en interne dans le dossier CMakeFiles est devenu vicieux lorsque j'ai déplacé le répertoire vers mon nouveau système. Suppression de tous les fichiers/répertoires en plus du fichier .cpp du projet et du fichier CMakeLists.txt, et exécution de "cmake". et "faire" semble à nouveau résoudre le problème.

5
potatoprogrammer

Le fichier ci-dessous fonctionne pour moi.

cmake_minimum_required(VERSION 3.5)
project(ImageProcessing)

set(CMAKE_CXX_STANDARD 14)
find_package(OpenCV REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS} )
set(SOURCE_FILES main.cpp)
add_executable(ImageProcessing ${SOURCE_FILES})
target_link_libraries( ImageProcessing ${OpenCV_LIBS} )
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
2
user3378430