#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?
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
Oh! Es tut mir leid ... Ich habe das getan, aber immer noch bekomme ich die Ausgabe als '-1. # QNAN' ..... –
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