Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.11.2011, 15:32

OpenCV 2.3.1. Installation

Hallo,

wie bei so ziemlich jeder größeren Lib, hab ich den halben Tag jetzt wieder erfolglos damit verschwendet, sie irgendwie integriert zu bekommen, bin unzähligen Tutorials und Guides mehrfach Schritt für Schritt gefolgt und habe selber experimentiert aber bekomme immer noch total unverständliche Linker-Errors.

Ich habe mir also das Windows-Superpack für Visual Studio 10 auf 64b Win7 heruntergeladen und entpackt. Anschließend ein einfaches Projekt der Form

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "highgui\highgui.hpp"

int main(int argc, char** pp_argv)
{
    cv::Mat img;

    if(argc == 1)
    {
        printf("Usage: main (<image_filename> | <image_list>.txt)\n");
        return 0;
    }
    img = cv::imread(pp_argv[1]);
}


angelegt und die Projekteigenschaften eingestellt. Dazu habe ich opencv\build\include, opencv\build\include\opencv sowie opencv\build\include\opencv2 als zusätzliche include-directories definiert und die Verzeichnisse werden im Projekt auch gefunden.
Als zusätzliches Link-Verzeichnis habe ich opencv\build\x64\vc10\lib angegeben und für obiges Projekt noch die Abhängigkeiten zu opencv_core231d.lib und opencv_highgui231d.lib eingetragen. Als letztes habe ich dann noch die Path-Variable um opencv\build\x64\vc10\bin erweitert, damit die DLLs gefunden werden.

Kompilieren tut das ganze auch, aber ich kriege ums Verrecken nicht diese Linker-Errors los:

Quellcode

1
2
3
4
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""class cv::Mat __cdecl cv::imread(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (?imread@cv@@YA?AVMat@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)" in Funktion "_main".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPAX@Z)" in Funktion ""public: __thiscall cv::Mat::~Mat(void)" (??1Mat@cv@@QAE@XZ)".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@QAEXABV12@@Z)" in Funktion ""public: class cv::Mat & __thiscall cv::Mat::operator=(class cv::Mat const &)" (??4Mat@cv@@QAEAAV01@ABV01@@Z)".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QAEXXZ)" in Funktion ""public: void __thiscall cv::Mat::release(void)" (?release@Mat@cv@@QAEXXZ)".


Dabei sind imread und Mat in highgui.hpp und core.hpp definiert, sie sollten also korrekt eingebunden sein. Was mache ich da falsch?

2

04.11.2011, 17:12

Kann man das SDK nochmal kompilieren? Bei der SFML ist das ja auch so, die muss man ja auch erst nochmal kompilieren lassen. :D

MfG
Check

3

04.11.2011, 18:11

ja, die kann man schon mit CMake nochmal kompilieren, aber durch die Verzeichnisstruktur die dann entsteht, blicke ich noch weniger durch. Ich hab es allerdings auch erfolglos mit mehreren Guides für diese Methode versucht (gleichen Linker-Fehler), aber eigentlich sollte es auch schon mit der prebuild-Version schon funktionieren, die im Superpack bereits drin ist.

4

04.11.2011, 18:35

Du kompilierst nicht mit CMake, du bereitest nur die Kompilierung vor.

MfG
Check

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

04.11.2011, 19:39

Ich habe neulich in meiner FH wieder eine Einführung in OpenCV gemacht.

Den Studenten habe ich auch ein "sofort lauffähiges Paket" mit OpenCV 2.3.1 + Beispielprogramm gegeben.
Du findest es hier:

http://www.cv-lab.inf.h-brs.de/fileadmin…2.3-Package.exe

Und die Folien zu meiner Präsentation:

http://www.cv-lab.inf.h-brs.de/fileadmin…CV__Part_1_.pdf
http://www.cv-lab.inf.h-brs.de/fileadmin…CV__Part_2_.pdf

6

04.11.2011, 20:11

Wow, cool, vielen Dank schonmal, ich probiers gleich aus, wenn ich wieder am richtigen Rechner bin.

Trotzdem tiltet mich das etwas, dass es nicht auch so geht :)
Gibt es nicht irgendwie die Möglichkeit, solche Linker-Errors zu "debuggen", eben irgendwie zurückverfolgen zu können, wo der Fehler liegt, z.B. indem man in die libs reinschaut und den fehlenden Verweis findet oder eben auch nicht?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

04.11.2011, 21:19

Wenn der Linker die Symbole nicht findet, kann er dir wohl auch schlecht sagen, in welcher LIB-Datei sie zu finden wären - denn sonst könnte er sie ja einfach linken!

8

04.11.2011, 21:50

Ja das meine ich ja. Ich suche nach einer Methode um sicherzustellen, dass er a) die Dateien auch wirklich findet/öffnet, die ich ihm übergebe und b) die Symbole in den libs stehen.
Wenn ich sie z.B. einfach mal mit einem Texteditor öffne und nach den Symbolen suche, dann finde ich sie schon mehrfach, nur eben durch das Format in so einem Kauderwelsch, dass ich damit nix anfangen kann.

9

06.11.2011, 14:32

Jetzt weiß ich, was das Problem war! Mir ist aufgefallen dass es von deiner lib keine x64-Version gab, aber die Einstellungen deiner Beispielprojekte ansonsten identisch zu meinen waren. Also hab ich kurzerhand OpenCV nochmal selbst mit CMake gebuildet und die Verzeichnisse wieder wie gehabt eingebunden. Naja und irgendwann dämmerte mir dann so langsam, dass ich die ganze Zeit versuche, ein Win32-Projekt mit x64-Bibliotheken zu bauen. Also in den Projekteigenschaften geändert und ne x64-Konfiguration angelegt, klappt!
Dümmer gehts im Nachhinein natürlich mal wieder nicht, aber wenigstens was gelernt -.-

Werbeanzeige