[gelöst][Anfängerfrage] opencv funktioniert nicht!
-
Hallo c-community,
ich benötige für mein Studium eine Möglichkeit auf Kameras zurück zu greifen. Ich habe mir einige Beiträge im Netz angeschaut und mich für OpenCV (kenne auch die Möglichkeiten VFW und DirectShow/ DirectX) entschieden. Folgendes habe ich schon gemacht:
1. OpenCV 2.0 und 2.2 installiert nach folgender Seite http://www.samontab.com/web/2010/03/installing-opencv-2-0-in-ubuntu/. Das scheint auch ohne Fehler erfolgt zu sein.
2. Ein einfaches Beispiel raus gesucht, mit der ich die Funktion von opencv über USB angeschlossene Webcam (Test-Kamera) ausprobieren wollte. Beispiel:#include "/home/usr/Programmierung/OpenCV-2.0.0/include/opencv/cv.h" #include "/home/usr/Programmierung/OpenCV-2.0.0/include/opencv/highgui.h" #include <stdio.h> // A Simple Camera Capture Framework int main() { CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY ); if ( !capture ) { fprintf( stderr, "ERROR: capture is NULL \n" ); getchar(); return -1; } // Create a window in which the captured images will be presented cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE ); // Show the image captured from the camera in the window and repeat while ( 1 ) { // Get one frame IplImage* frame = cvQueryFrame( capture ); if ( !frame ) { fprintf( stderr, "ERROR: frame is null...\n" ); getchar(); break; } cvShowImage( "mywindow", frame ); // Do not release the frame! //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version), //remove higher bits using AND operator if ( (cvWaitKey(10) & 255) == 27 ) break; } // Release the capture device housekeeping cvReleaseCapture( &capture ); cvDestroyWindow( "mywindow" ); return 0; }
Ok soweit so gut. Leider geben beide installierten Varianten Fehler aus, die ich als Anfänger leider nicht wirklich deuten kann. Die Version 2.2 scheint dabei die schlechtere Version zu sein, da der Fehler beim Compilieren (gcc -o ocvtest ocvtest.c) folgenden Fehler ausgibt:
// Dies ist nur ein Auszug, da der vollständige Fehlerbericht sehr lang ist! gcc -o ocvtest ocvtest.c In file included from ocvtest.c:1: /home/theghostod/Programmierung/OpenCV-2.2.0/include/opencv/cv.h:63: fatal error: opencv2/core/core_c.h: No such file or directory compilation terminated.
Die Dateien, die gefordert sind, liegen leider nicht im Installationspfad vor, was ziemlich komisch ist. Das Fehlen der Dateien kann ich mir nicht erklären. Ich habe sie definitiv gelöscht.
Die Version 2.0 von OpenCV meldet keine Fehler wegen nicht vorhandenen Headern, sondern dass Variablen nicht definiert wurden.
// Dies ist nur ein Auszug, da der vollständige Fehlerbericht sehr lang ist! gcc -o ocvtest ocvtest.c /tmp/ccTp7LFs.o: In function `cvRound': ocvtest.c:(.text+0x19): undefined reference to `lrint' /tmp/ccTp7LFs.o: In function `cvDecRefData': ocvtest.c:(.text+0xa48): undefined reference to `cvFree_' ocvtest.c:(.text+0xab9): undefined reference to `cvFree_' /tmp/ccTp7LFs.o: In function `cvGetRow': ocvtest.c:(.text+0xbaf): undefined reference to `cvGetRows' /tmp/ccTp7LFs.o: In function `cvGetCol': ocvtest.c:(.text+0xbda): undefined reference to `cvGetCols' /tmp/ccTp7LFs.o: In function `cvReleaseMatND': ocvtest.c:(.text+0xbed): undefined reference to `cvReleaseMat' /tmp/ccTp7LFs.o: In function `cvSubS': ocvtest.c:(.text+0xd0d): undefined reference to `cvAddS' /tmp/ccTp7LFs.o: In function `cvCloneSeq': ocvtest.c:(.text+0xd5b): undefined reference to `cvSeqSlice' /tmp/ccTp7LFs.o: In function `cvSetNew': ocvtest.c:(.text+0xdba): undefined reference to `cvSetAdd'
Der kopierte Quelltext ist aber vollständig! Ich weiß es ist nicht wirklich "professionell" einfach was zu kopiern und dann zu verlangen, dass es ohne weiteres funktioniert. Dies ist auch nicht der Sinn der Sache, sondern ich wollte anhand des einfachen Beispiels die Funktionen erlernen, um dann meine Aufgabe mit einem verstandenen Quellcode zu erweitern.
Ich hoffe jemand kann mir helfen und sagen, was ich falsch mache oder warum die eine Version von OpenCV nicht funktioniert.
MfG
mirrowwinger
-
"undefined reference" heißt einfach, dass du die Bibliothek nicht linkst. Header zu includen reicht nicht!
Das geht normalerweise so:
gcc -lfoo ...
wobei das foo für libFOO.so steht (ohne das lib oder die Endung!). Siehe auch GCC-Handbuch.
-
Ah gut, das bringt mich schonmal weiter. Habe meinen Compilierungsbefehl abgeändert:
gcc -o ocvtest ocvtest.c -lcv -lhighgui
Jetzt besteht folgendes Problem, dass ich die libś nicht finde (auf dem gesamten Computer habe ich die Suche nach: "lib*.so" und "*.so" durchgeführt). Muss ich die mir extra irgendwo downloaden?
mirowwinger
-
mirrowwinger schrieb:
Muss ich die mir extra irgendwo downloaden?
Ja. Welche Distro verwendest du?
Unter Ubuntu heiszt das entsprechende Paket "libcv-dev" (und du moechtest wohl noch ein paar andere dazu), dh. du klopfst
sudo apt-get install libcv-dev libcvaux-dev libhighgui-dev
in den Terminal-Emulator deiner Wahl und alles sollte laufen.Siehe auch https://help.ubuntu.com/community/OpenCV
-
ok deine sudo apt-get ... war nicht 100% richtig. Habe mir im Packetmanager aber die Packete, die gefehlt haben zusammen suchen können und alles läuft.
Vielen Dank
mirrowwinger