2012-12-17 5 views
5
#include <cv.h> 
#include <highgui.h> 
#include <iostream> 
#include <cmath> 
#include <cstdlib> 
#include <fstream> 

using namespace std; 

typedef struct histBundle { 
double rCh[256]; 
double gCh[256]; 
double bCh[256]; 
}bundleForHist; 

bundleForHist getHistFromImage (IplImage* img, int numBins) { 
float range[] = { 
    0, 
    numBins 
}; 
float *ranges[] = { 
    range 
}; 

bundleForHist bfh; 

CvHistogram *hist = cvCreateHist (1, &numBins, CV_HIST_ARRAY, ranges, 1); 
cvClearHist (hist); 
IplImage* imgRed = cvCreateImage(cvGetSize(img), 8, 1); 
IplImage* imgGreen = cvCreateImage(cvGetSize(img), 8, 1); 
IplImage* imgBlue = cvCreateImage(cvGetSize(img), 8, 1); 
cvSplit(img, imgBlue, imgGreen, imgRed, NULL); 
cvCalcHist(&imgRed, hist, 0, 0); 
for (int i = 0; i < numBins; ++i) { 
    bfh.rCh[i] = cvQueryHistValue_1D(hist, i); 
} 
cvClearHist(hist); 
cvCalcHist(&imgGreen, hist, 0, 0); 
for (int i = 0; i < numBins; ++i) { 
    bfh.gCh[i] = cvQueryHistValue_1D(hist, i); 
} 
cvClearHist(hist); 
cvCalcHist(&imgBlue, hist, 0, 0); 
for (int i = 0; i < numBins; ++i) { 
    bfh.bCh[i] = cvQueryHistValue_1D(hist, i); 
} 
cvClearHist(hist); 
return bfh; 
} 

int main (int argc, char** argv) { 
int c; 
IplImage* img = NULL; 
int frame_number = 0; 
CvCapture* capture = cvCaptureFromAVI ("Cricketc1.avi"); 
assert(capture); 
int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
cvNamedWindow ("Video", 0); 

while (1) { 
    //IplImage * img = cvLoadImage("C:\\Users\\ANIMES~1\\Desktop\\bw.jpg"); 
    img = cvQueryFrame(capture); 
    frame_number++; 
    if (img) { 
     cvShowImage("Video", img); 
     int numBins = 256; 
     bundleForHist bfh; 
     bfh = getHistFromImage (img, numBins); 
     double totalForR = 0; 
     double totalForG = 0; 
     double totalForB = 0; 
     double probR[256]; 
     double probG[256]; 
     double probB[256]; 
     for (int i = 0; i < numBins-1; ++i) { 
      totalForR += bfh.rCh[i]; 
      totalForG += bfh.gCh[i]; 
      totalForB += bfh.bCh[i]; 
     } 
     double lengthHistogram = totalForR + totalForG + totalForB; 
     for (int i = 0; i < 256; ++i) { 
      probR[i] = bfh.rCh[i]/(double)lengthHistogram; 
      probG[i] = bfh.gCh[i]/(double)lengthHistogram; 
      probB[i] = bfh.bCh[i]/(double)lengthHistogram; 
      //file << bfh.rCh[i] << "\t" << bfh.gCh[i] << "\t" << bfh.bCh[i] << "\t" << probR[i] << "\t" << probG[i] << "\t" << probB[i] << "\n"; 
     } 

     double entropyR = 0.0; 
     double entropyG = 0.0; 
     double entropyB = 0.0; 
     for (int i = 0; i < numBins; ++i) { 
      entropyR += probR[i]*log(probR[i]); 
      entropyG += probG[i]*log(probG[i]); 
      entropyB += probB[i]*log(probB[i]); 
     } 
     cout << frame_number << "\t" << (-1.0)*(entropyR + entropyG + entropyB) << endl; 
    } 
    c = cvWaitKey(1000/fps); 
    if (c == 27) 
     break; 
} 
//cvReleaseImage(&img); 
cvReleaseCapture(&capture); 
cvDestroyWindow("Video"); 
return 0; 
} 

OUTPUT:Weird-Ausgang, während die Entropie von Frames eines Videos in opencv finden

. 
. 
254  -1.#IND 
255  -1.#IND 
256  -1.#IND 
257  -1.#IND 
258  5.5686 
. 
. 

fand ich das Bild zuerst Entropie, die korrekt sein herauskam. , aber fast 80% der Frame-Entropien für das Video werden als -1.#IND ausgegeben.

Dies ist das Video .... download

Was schief gehen könnte?

+0

2 Sekunden Blick in den Code zeigt, dass Sie tun, Entropie = Blah. Das ist nicht wie Entropie berechnet wird, Sie müssen eine Summe machen, also wollen Sie Entropie + = Blah. – mmgp

+0

Oh! Es tut mir leid ... Ich habe das getan, aber immer noch bekomme ich die Ausgabe als '-1. # QNAN' ..... –

+0

Mehr 2 Sekunden hineinschauen und ich sehe, dass Sie eine lokale Variable bei' calcHistProb' und zurückgeben Behandeln Sie es als Zeiger später in Ihrem Programm. Ich bezweifle wirklich, dass Sie das kompilieren, ohne Warnungen zu erhalten, und Sie ignorieren die Warnungen. Beheben Sie alle diese sprachlichen Probleme, ohne Warnungen zu ignorieren, und bearbeiten Sie Ihren Code. – mmgp

Antwort

3

Es könnte sein, dass prob[i] = 0 für einige i, daher berechnen Sie log(0), die undefiniert ist. Um dies zu beheben, dass man einfach so „Wahrscheinlichkeiten“ verwerfen:

for (int i = 0; i < numBins; ++i) { 
    if (prob[i]) 
     entropy += prob[i]*log(prob[i]); 
} 

Für die anderen Fehler gefunden Sie in Bezug auf den Wert 0 in dem Behälter 255, ist, dass aufgrund des Bereichs, den Sie festgelegt. OpenCV berücksichtigt den Bereich für die relevante Funktion als [Start, Ende], sodass die Angabe eines Bereichs von [0, 255] den Endwert von 255 ignoriert. Sie möchten also sowohl 0 als auch 255 behalten:

+0

Dieses Bildproblem wurde gelöst .... aber ich habe Schwierigkeiten in einem Video ..... –

+0

Mach es schneller dann. – mmgp

+0

Ich habe das 0-Wert-Problem für ein Bild gelöst, ich frage dann, wie kann ein Fehler für ein Video da sein .... ???? –