2017-02-19 6 views
0

Я работаю на самообслуживающем автомобиле Rpi, на котором я использую OpenCV для обработки изображений с пи-камеры, чтобы следить за заранее заданной дорожкой. В настоящее время я пытаюсь получить эту работу (основная функция потокового видео), чтобы увидеть, как заставить ее работать до того, как я перейду в NN для получения изображения.OpenCV build G ++ ошибка символа/ошибка DSO

мой код выглядит следующим образом (она отказывается строить из-за ошибки OpenCV):

#include <stdio.h> 
#include <pigpio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <wiringPi.h> 
#include <softPwm.h> 
#include "move.h" 
#include "distance.h" 
#include <linux/videodev2.h> 
#include <libv4l2.h> 
#include <opencv2/core/core.hpp> 
#include <opencv2/opencv.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/videoio.hpp> 
using namespace cv; 

void SysMenu(){ 
    system("clear"); 
int choice; 
    printf("||Please Choose An Option..........||\n"); 
    printf("||1.Test Motors || 2.Test Sensors||\n"); 
    printf("||3.Exit   ||    ||\n"); 
    scanf("%i",&choice); 

    switch(choice) 
{ 
case 1: 
    move(MT_FORWARD, 3000); 
    printf("fwd\n"); 
    move(MT_BACKWARD, 3000); 
    printf("bwd\n"); 
    move(MT_RIGHT, 3000); 
    printf("rght\n"); 
    move(MT_LEFT, 3000); 
    printf("left\n"); 
    move(MT_FORWARD | MT_RIGHT, 3000); 
    printf("fwd, right\n"); 
    move(MT_FORWARD | MT_LEFT, 3000); 
    printf("fwd left\n"); 
    delay(3000); 
    SysMenu(); 
    break; 

case 2 : 
    TestSensors(); 
    delay(3000); 
    SysMenu(); 
    break; 

case 3 : 
    break; 



default : printf("Input, Option Not available, Please retry"); 
    SysMenu(); 
    break; 
} 
} 

int main(int, char**) { 
VideoCapture cap; 
cap.cv::VideoCapture::open(0); 

if (!cap.isOpened()) 
return -1; 
Mat edge;//,gray,c_edge,lpf_gaussian_blurr; 
namedWindow("Original_Video",1); 


for(;;) 
{ 
    Mat video; 
    cap >> video;//capture live feed 

//convert to b&w 
cvtColor(video,edge,CV_BGR2GRAY); 




//Canny(gray,c_edge,0,30,3); 
//GaussianBlur(video,lpf_gaussian_blurr,Size(9,9),1.5,1.5); 

imshow("Original_Video",edge); 

if(waitKey(30)>= 0) break; 
} 


    initialisePins(); 
    SysMenu(); 
    gpioTerminate(); 

    return 0; 
} 

и выход следующим образом:

g++ -Wall -I/usr/local/include -lopencv_core -lwiringPi -lpigpio -lopencv_imgcodecs -lopencv_highgui -lopencv_videoio -lopencv_imgproc -o "SdCar" "SdCar.cpp" (in directory: /home/pi/selfdrivingcar-17) 
/usr/bin/ld: warning: libopencv_imgproc.so.3.1, needed by //usr/local/lib/libopencv_imgcodecs.so, may conflict with libopencv_imgproc.so.2.4 
/usr/bin/ld: warning: libopencv_core.so.3.1, needed by //usr/local/lib/libopencv_imgcodecs.so, may conflict with libopencv_core.so.2.4 
/usr/bin/ld: //usr/local/lib/libopencv_imgcodecs.so: undefined reference to symbol '_ZN2cv6String10deallocateEv' 
//usr/local/lib/libopencv_core.so.3.1: error adding symbols: DSO missing from command line 
Compilation failed. 
collect2: error: ld returned 1 exit status 
+0

Стоит отметить, что игнорировать часть «sysmenu» и читать только основную секцию, в которой была предпринята попытка доступа к камерам opencv. – TobyWhite

+0

Вы пытались использовать 'pkg-config'? – polarysekt

+0

@polarysekt я попробовал, но не смог заставить мой синтаксис работать, попробую еще раз с кодом ниже – TobyWhite

ответ

1

В -l<library> флагах должны следовать источнику или объект (.o) файл, который их использует.

Вот как работает компоновщик: он обрабатывает файлы .cpp/.o из командной строки слева направо и не знает, что им нужно из библиотек, пока не увидит их, на которые они ссылаются в файле .cpp/.o.

Так измените команду компоновщика:

g++ -Wall -I/usr/local/include -lopencv_core -lwiringPi -lpigpio -lopencv_imgcodecs -lopencv_highgui -lopencv_videoio -lopencv_imgproc -o "SdCar" "SdCar.cpp" 

к

g++ -Wall -I/usr/local/include -o "SdCar" "SdCar.cpp" -lopencv_core -lwiringPi -lpigpio -lopencv_imgcodecs -lopencv_highgui -lopencv_videoio -lopencv_imgproc 
+0

Я пробовал это, все тот же вопрос. – TobyWhite

+0

Похоже, у вас установлены две версии opencv. Попробуйте использовать '$ (pkgconfig opencv -libs)' вместо '-lopencv_core ... -lopencv_imgproc'. – szym

0

я столкнулся с той же проблемой, однако я решил его с pkg-config opencv --cflags --libs.

Когда я скомпилирован с предыдущей командой, выход был, как показано ниже:

[email protected]:~/Documents/caffeProject/assign3$ g++ -o "test_mnist" 
"test_mnist.cpp" -lopencv_dnn -lopencv_highgui -lopencv_imgcodecs 
-lopencv_imgproc -lstdc++ -lopencv_core /usr/bin/ld: warning: libopencv_core.so.3.1, needed by //usr/local/lib/libopencv_dnn.so, may 
conflict with libopencv_core.so.2.4 /usr/bin/ld: /tmp/ccovch2b.o: 
    undefined reference to symbol '_ZN2cv6String10deallocateEv' 
    //usr/local/lib/libopencv_core.so.3.1: error adding symbols: DSO 
    missing from command line collect2: error: ld returned 1 exit status 

Хотя проблема решена, я до сих пор удивляюсь, почему. Может кто-нибудь объяснить?

+0

Это потому, что у вас есть два экземпляра OpenCv, как 2.4, так и 3.1 соответственно. Естественно, ваша программа будет хотеть использовать только 1, но не обе, поэтому выход «может конфликтовать с libopencv_core.so.2.4» – TobyWhite

+0

на самом деле, я отметил это предупреждение. Я установил opencv3.1 вручную, но я не знаю, где найти 2.4. Я попробовал 'whereis opencv'. Не могли бы вы рассказать мне, как это сделать? – ShepherdQi

Смежные вопросы