OpenCV User online?



  • Hi!

    In der Erwartung mal wieder einen blöden Fehler gemacht zu haben den ich vor lauter Betriebsblindheit nicht sehe, hoffe ich hier auf Hilfe zu finden. In dem eingefügten Code habe ich ein Videofile geöffnet und dieses Programm soll Objekte detektieren welche sich bewegen.

    Der Code ist aus motempl.py angelehnt. Dieser macht das noch etwas spezieller am momentan treibt mich die Dunkelheit des outputFrames in den Wahnsinn.

    Kurze Erläuterung:

    VidDev.open ist eine Methode um einen Videofile zu öffnen, read zum einlesen.
    In der while Schleife wird dann eingelesen und und das letzt aufgenommene Bild vom vorherigen abgezogen (absdiff). Dessen Output wird von Farbe auf grau konvertiert und anschließend zu threshImg ge-thresholdet zu werden um nur starke Unterschiede herauszufiltern.

    ThreshImg wird anschließend ins Motion History Mat mhi hineinaktualisiert mittels updateMotionHistory. Die mhi wird dann mittels calcMotionGradient genutzt um die gradienten zu ermitteln und dann zwei Mats zu erzeugen, welche die Ergebnisse beinhalten.

    Arbeitet hier jemand mit opencv?

    Grüße,
    Inge

    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/video/video.hpp>
    #include <time.h>
    using namespace std;
    using namespace cv;
    int main()
    {
    
        VideoCapture vidDev;
        Mat img, mhi, gradient, prevImg, diffImg, grayImg, segImg, threshImg, outputFrame;
        double MHIDuration = 0.5;
        double thresh = 32.0;
        vidDev.open("/home/peter/DA/testMotionDetection/IMG-2014-3-2-13-16-38.avi");
    
        namedWindow("test");
        //namedWindow("gradient motion");
        namedWindow("mhi");
        vidDev.read(img);
    
        prevImg = img.clone();
        mhi = Mat(img.rows, img.cols, CV_32FC1,1);
        threshImg = Mat(img.rows, img.cols, CV_32FC1,1);
        outputFrame = Mat(img.rows, img.cols, CV_32FC1,1);
        gradient = Mat(img.rows, img.cols, CV_32FC1,1);
        double timeStamp = clock()/CLOCKS_PER_SEC;
        waitKey(40);
        vector<Rect> rects;
        while(true)
        {
            if(vidDev.read(img))
            {
                timeStamp = clock()/CLOCKS_PER_SEC;
                absdiff(img, prevImg, diffImg);
                cvtColor(diffImg,grayImg, COLOR_BGR2GRAY);
                threshold(grayImg, threshImg, thresh, 1.0,THRESH_BINARY);
    
                updateMotionHistory(threshImg, mhi, timeStamp, 0.5);
                calcMotionGradient( mhi, outputFrame, gradient, 0.25, 0.05, 5);
    
    imshow("test", outputFrame*255.0); //// !!!!!!!!-------->> here is the problem
    
                rects.clear();
                segmentMotion(mhi, segImg, rects,MHIDuration, 32);
                prevImg = img.clone();
    
                waitKey(40);
                MHIDuration = clock()/CLOCKS_PER_SEC - timeStamp;
                cout << MHIDuration << "/" << timeStamp << endl;
            }
            else
                break;
        }
    
        destroyAllWindows();
        return 0;
    }
    


  • naja, outputframe ist eine Float Matrix soweit ich das sehe. Float hat einen ziemlich großen Wertebereich, da ist nicht bei 255 Schluss, dementsprechend ist 255 != weiß. Besser in den Wertebereich 0-255 umwandeln und dann in eine CV_8UC konvertieren.


Anmelden zum Antworten