C++ Klassen und OpenCV



  • Hallo an alle,
    ich habe eine Frage die eher auf grundlegendem Verständnis beruht. Bin noch absoluter Neuling was C++ angeht und versuche mich etwas einzufummeln.
    Meine Aufgabe ist es mit Hilfe von OpenCV und VisualStudio 2013 ein Programm zu schreiben, welches aus Kantenbildern eine 3D-Kartierung erstellen kann, dazu sollen Abmessungen und Positionen verschiedener Objekte berechnet werden. Soweit so gut. Die Schwierigkeit vor der ich stehe: Das ganze soll objektorientiert programmiert werden, also möglichst in abgeschlossenen Klassen. Hab dazu auch schon viel gelesen und die typischen Katzen-, Rennwagen- und Raumschiffbeispiele verstehe ich.
    Jetzt habe ich zum Einstieg einfach versucht eine Klasse zu erstellen, in der ein Bild, dass ich in der main() lade, anzuzeigen, aber es funktioniert nicht. Von Syntaxfehler Bezeichner "Mat", Syntaxfehler Fehlendes ';' und Fehlender Typspezifierer werden mir Fehler angezeigt.
    Das ist die Klasse.h:

    //#pragma once
    
    class Kanteninformation
    {
    
    public:
    	Kanteninformation();
    	~Kanteninformation();
    
    	void BildAnzeigen(cv::Mat Bild);
    
    private:
    	Mat Bild;
    
    };
    

    Hier die Klasse.cpp

    #include "stdafx.h"
    #include "Kanteninformation.h"
    
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/imgcodecs.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    
    Kanteninformation::Kanteninformation()
    {
    }
    
    Kanteninformation::~Kanteninformation()
    {
    }
    
    void Kanteninformation::BildAnzeigen(Mat Bild)
    {
    	cvNamedWindow("Fenster", CV_WINDOW_AUTOSIZE);
    	imshow("Fenster", Bild);
    	waitKey(0);
    	cvDestroyWindow("Fenster");
    }
    

    und das die main()

    int main()
    {
    
    	Mat Bild = imread("img_1.jpg", CV_LOAD_IMAGE_ANYCOLOR);
    
    	Kanteninformation bild_1;
    	bild_1.BildAnzeigen(Bild);
    
    	return 0;
    }
    

    Weiß jemand, wo mein Fehler liegt ohne gehe ich ganz falsch an die Sache ran?

    Vielen lieben Dank schon einmal für die Hilfe! 😃



  • Am besten qulifizierst du den Typ Mat immer mit vollem Namen - denn der wird zur Zeit nicht (immer) gefunden.

    D. h. 1) using namespace cv; entfernen und dafür überall wo Mat verwendet wird cv::Mat schreiben.

    Ev. kommen danach andere, ähnliche Fehler.

    // Edit

    Es liegt nicht nur an den Namespaces, sondern auch am fehlenden Inklude. Du musst den entsprechenden Header in Klasse.h inkludieren, so dass cv::Mat bekannt gemacht wird.



  • okay, hab ich gemacht, wie vermutet dennoch etliche Fehlermeldungen.

    Fehler 1 error C2653: 'cv': Keine Klasse oder Namespace f:\studenten\damaszek\kanteninfos\kanteninfos\Kanteninformation.h 10 1 Kanteninfos

    Fehler 2 error C2061: Syntaxfehler: Bezeichner 'Mat' f:\studenten\damaszek\kanteninfos\kanteninfos\Kanteninformation.h 10 1 Kanteninfos

    Fehler 3 error C2653: 'cv': Keine Klasse oder Namespace f:\studenten\damaszek\kanteninfos\kanteninfos\Kanteninformation.h 13 1 Kanteninfos

    Fehler 4 error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Bild' f:\studenten\damaszek\kanteninfos\kanteninfos\Kanteninformation.h 13 1 Kanteninfos

    Fehler 5 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. f:\studenten\damaszek\kanteninfos\kanteninfos\Kanteninformation.h 13 1 Kanteninfos

    Fehler 6 error C2511: 'void Kanteninformation::BildAnzeigen(cv::Mat)': Überladene Memberfunktion nicht in 'Kanteninformation' gefunden F:\Studenten\Damaszek\Kanteninfos\Kanteninfos\Kanteninformation.cpp 28 1 Kanteninfos



  • Oh vielen vielen Dank! Das war das Problem! Jetzt klappt das Anzeigen! 👍 😋



  • Was ist denn daran objektorientiert?
    Du benutzt weder den Konstruktor noch den Destruktor geschweige denn das Member Bild für irgendetwas sinnvolles. Die Funktion BildAnzeigen zeigt genau das übergebene Bild an - das war es schon.

    VS2013 ist völlig veraltet. Benutze VS2015 Update 2!



  • Hallo manni66,
    ich bin noch ganz am Anfang und in der Einarbeitung, deswegen freue ich mich über kleine Schritte. Mein Ziel war jetzt erst einmal eine Instanz zu erstellen und die Funktion dafür aufzurufen. Über Verbesserungen, Tipps oder auch nur Denkanstöße freue ich mich.
    Und das Programm wurde mir zugeteilt, das ist es eben was an den Rechnern, an denen ich arbeite, installiert ist, da habe ich keinen Einfluss drauf.


Log in to reply