C++Builder und opencv

saxonica

Newbie
Registriert
Nov. 2018
Beiträge
2
Hallo, ich hoffe ihr könnt mir helfen.
Ich arbeite mit C++Builder 10.2 und möchte gern OpenCV nutzen.
Ich schaffe es einfach nicht das in einem simplen code zu integrieren.

Könnt ihr mir bitte helfen?

Zu meiner herangehensweise:

1. Neues Projekt (VCL-Formularanwendung) erstellt.
2. die Verzeichnisse opencv und opencv2 ins Projektverzeichnis kopiert.
3. Mein Code:

//---------------------------------------------------------------------------
C++:
#include <opencv/opencv.hpp>
using namespace std;

int ShowStreamFromCam(int deviceid ,char *windowname ,double width ,double height ,double fps)
{

    CvCapture* capture = NULL;
    IplImage* frame = NULL;
    char c=0;

    capture = cvCaptureFromCAM(deviceid);
    if(!capture) {
        printf("Could not initialize capturing...\n");
        return 1;
    }

    // Wait until the camera is initialized
    Sleep(3000);

    // Set video options
    cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_WIDTH , width);
    cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_HEIGHT , height);
    cvSetCaptureProperty(capture ,CV_CAP_PROP_FPS , fps);

    // Set windowname
    cvNamedWindow(windowname, 0);

    for(;;) {

       frame = cvQueryFrame(capture);
        if(frame != NULL) {
            cvShowImage(windowname, frame);
        } else {
            printf("QueryFrame failed !");
        }

       c = cvWaitKey(10);
       if(c == 27)
         break;
    }

    cvReleaseCapture(&capture);
    cvDestroyWindow(windowname);

    return 0;
}
//---------------------------------------------------------------------------

4. Bekomme folgende Fehlermeldung:
[bcc32 Fehler] Unit1.cpp(6): E2209 include-Datei 'opencv\opencv.hpp' kann nicht geöffnet werden


Warum findet er diese Datei nicht?
 
saxonica schrieb:
Ich arbeite mit C++Builder 10.2 und möchte gern OpenCV nutzen. Ich schaffe es einfach nicht das in einem simplen code zu integrieren.
OK

Zu meiner herangehensweise:

1. Neues Projekt (VCL-Formularanwendung) erstellt.
2. die Verzeichnisse opencv und opencv2 ins Projektverzeichnis kopiert.

Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!

(SCHOCKSTARRE! -- Jetzt bin ich vor Schreck beinahe gestorben. Junge Junge ...).

Warum findet er diese Datei nicht?

Generelle Herangehensweise bei OpenCV
  • OpenCV-binaries für Windows herunterladen und entpacken, z.B. so, dass danach alles unter z. B. C:\OpenCV\343\ (falls Du später neue Versionen verwendest, ist es so am einfachsten),
  • Prüfen, ob unterhalb des Verzeichnisses C:\OpenCV\343\ die Unterverzeichnisse build/ und sources/ vorhanden sind,
  • in den Compilerdirektiven des Build-Systems das Include-Verzeichnis hinzufügen. bei GNU ist das dann
    -I D:/OpenCV/343/build/include, bei Qt ist es INCLUDEPATH += "C:/OpenCV/343/build/include" usw.
  • in den Linkerdirektiven des Build-Systems den Bibliothekspfad festlegen, bei GNU wäre das z.B. -L C:/OpenCV/343/build/x64/gcc/lib, bei Visual Studio z. B.
    <Link><SubSystem>Console</SubSystem>
    <AdditionalLibraryDirectories>D:\OpenCV\343\build\x64\vc15\lib;</AdditionalLibraryDirectories> ...
  • Projekt kompilieren und ggf. Pfade nochmal genau ansehen.
  • Damit das Programm auch läuft, mußt Du am Rechner die Umgebungsvariable PATH um den Pfad der OpenCV-Binaries ergänzen, z.B. um: C:\OpenCV\343\build\x64\vc15\bin
PS.: Deine include-Anweisung hat möglicherweise deshalb nicht funktioniert, weil Dein Buildsystem bei #include <xyz> nur in den System-Include-Verzeichnissen sucht, bei #include "xyz" ist das üblicherweise anders.
 
Zuletzt bearbeitet:
Ich geb mal ungefragt meinen Senf zu was Anderem hinzu:
Man sollte versuchen, Befehle wie break, goto oder continue zu vermeiden, wenns auch einfacher und direkter über die klassischen Kontrollanweisungen geht. Das hält deinen Code leserlicher. In diesem Beispiel gehts natürlich noch, aber wenn der Code mal größer wird verschlechtert sich die Les- und Wartbarkeit.
Ich würds so machen:

C:
    do {
       frame = cvQueryFrame(capture);
        if(frame != NULL) {
            cvShowImage(windowname, frame);
        } else {
            printf("QueryFrame failed !");
        }
    } while ( (c = cvWaitKey(10)) != 27);
    // 27 is ESC
 
Vielen Dank. Ich versuche mich erst wenige Wochen am Programmieren. Ich hoffe ihr habt Verständnis für meine teils laienhaften Fragen. Ich lerne täglich durch Antworten wie deine @blöderidiot dazu.

Hab jetzt alle Pfade angepasst. Dateien werden nun gefunden.
Bei Compillieren erhalte ich nun folgende Fehlermeldung:

[bcc32 Fehler] traits.hpp(354): E2514 Die Auflösung überladener Member ist während der Vorlageninstantiierung (noch) nicht möglich
Vollständiger Parser-Kontext
Unit1.cpp(13): #include C:\OpenCV\400\build\include\opencv2\opencv.hpp
opencv.hpp(52): #include opencv2/core.hpp
core.hpp(58): #include opencv2/core/types.hpp
types.hpp(61): namespace cv
types.hpp(532): class DataType<RotatedRect>
types.hpp(540): Instantiieren der Standardargumente von: SafeFmt<T,available>
Unit1.cpp(13): #include C:\OpenCV\400\build\include\opencv2\opencv.hpp
opencv.hpp(52): #include opencv2/core.hpp
core.hpp(56): #include opencv2/core/traits.hpp
traits.hpp(50): namespace cv
traits.hpp(337): namespace traits
traits.hpp(339): namespace internal
traits.hpp(354): Entscheidung zum Instantiieren: CheckMember_fmt<DataType<float> >
--- Zurücksetzen des Parser-Kontexts für die Instantiierung...
traits.hpp(354): Entscheidung zum Instantiieren: CheckMember_fmt<DataType<float> >::value
--- Zurücksetzen des Parser-Kontexts für die Instantiierung...
Unit1.cpp(13): #include C:\OpenCV\400\build\include\opencv2\opencv.hpp
opencv.hpp(52): #include opencv2/core.hpp
core.hpp(56): #include opencv2/core/traits.hpp
traits.hpp(50): namespace cv
traits.hpp(337): namespace traits
traits.hpp(339): namespace internal
traits.hpp(354): class CheckMember_fmt<T>

Für mich ist das (noch) echt schwer zu verstehen. Wo liegt hier die Ursache?
 
saxonica schrieb:
Bei Compillieren erhalte ich nun folgende Fehlermeldung:
E2514 Die Auflösung überladener Member ist während der Vorlageninstantiierung (noch) nicht möglich

traits.hpp(354): Entscheidung zum Instantiieren: CheckMember_fmt<DataType<float> >
--- Zurücksetzen des Parser-Kontexts für die Instantiierung...
traits.hpp(354): Entscheidung zum Instantiieren: CheckMember_fmt<DataType<float> >::value
--- Zurücksetzen des Parser-Kontexts für die Instantiierung...
Sieht so aus, als wäre der verwendete Compiler zu alt, um C++-11 zu verstehen. Welches Compiler-Backend (genaue Version) verwendest Du denn? Und warum arbeitest Du zu Hause mit dem C++-Builder? Das ist für Einsteiger etwa so, wie das Wohnzimmer durchs Schlüsselloch zu tapezieren ;)
 
Mich wunderts auch a bisl, dass Du als Programmieranfänger gleich mit opencv und C++ in die Stierkampfarena gehst. Das leichteste ist das sicher nicht.
Ich nehme an, du tust das, weil du gleich von Anfang an Fenster haben möchtest?
 

Ähnliche Themen

Antworten
10
Aufrufe
942
Antworten
8
Aufrufe
4.900
S
  • Gesperrt
Antworten
7
Aufrufe
2.280
Antworten
8
Aufrufe
1.299
Zurück
Oben