2017-02-19 142 views
0

我正在研究基於Rpi的自駕車 - 我利用OpenCV從pi攝像頭進行圖像處理,以遵循預先設計的軌道。我目前正試圖讓這個工作(一個基本的視頻流選項),看看如何讓它開始工作,然後我開發到圖像記錄的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 @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