2016-05-12 3 views
0

Das ist erwartetes Verhalten meines Code:Finding Mittelwert von HSV konvertiert Video-Feed

„soll ich ein RGB2HSV Video umgewandelt und von meinem Hauptprogramm Original-Video erhalten und eine Funktion zu entwickeln, die von allen H bedeuten finden , S und V Werte und generieren 1 * 3 Matrix für jeden Rahmen. "

Dies ist eigentlich zu Klassifizierung von Objekten zwischen Feuer und nicht Feuer mit PCA. Ich habe Feature-Extrahierung in MATLAB durchgeführt und PCA-Koeffizienten in C++ - Code in Visual Studio dekaliert. Anscheinend ist der Code fehlerfrei, aber wenn ich debugg, um es auszuführen, gibt es einen Fehler, der in angehängtem Foto gesehen werden kann.

Auch der Rest des Codes wurde ordnungsgemäß ohne Fehler ausgeführt. Wo ist das Problem? Anbringen meinen Code

void pca_decide(Mat &Threshdimg , Mat &Original) 
{ 
//declare master pca matrix 

double pca_data[9] = { -0.5398, -0.4189, 0.7302, -0.0365, 0.8782, 0.4768, 0.8410, -0.2307, 0.4893 }; 
Mat pca = Mat(3, 3, CV_32F, pca_data); 

//declaring mean fire hsv values multiplied with pca in matlab 
double fire_pca_data[3] = { 0.7375, -0.0747,0.6608 }; 
Mat fire_pca = Mat(1, 3, CV_32F, fire_pca_data); 

//declaring mean non-fire hsv values multiplied with pca in matlab 
double nfire_pca_data[3] = { 0.4389,-0.0874, 0.6240 }; 
Mat nfire_pca = Mat(1, 3, CV_32F, nfire_pca_data); 

//generating current image hsv values in euclidean space 

Mat image_pca; 
double rows = Threshdimg.rows; 
double cols = Threshdimg.cols; 

vector<Mat> hsv_planes; 
split(Threshdimg, hsv_planes); 
Mat h = hsv_planes[0]; // H channel h is a 2D matrix 
Mat s = hsv_planes[1]; // S channel 
Mat v = hsv_planes[2]; // V channel 

Scalar h_mean_image = sum(h)/ (rows*cols); // here I need to sum all the rows and columns 
Scalar s_mean_image = sum(s)(rows*cols); 
Scalar v_mean_image = sum(v)(rows*cols); 
Scalar HSV_mean_data[3] = { h_mean_image, s_mean_image, v_mean_image }; 
Mat HSV_mean = Mat(1, 3, CV_32F, HSV_mean_data); 
multiply(pca, HSV_mean, image_pca); 

//finding difference with fire_pca 
float diff_fire; 
diff_fire = norm(image_pca, fire_pca, NORM_L2); 


//finding differene with non_fire_pca 
float diff_non_fire; 
diff_non_fire = norm(image_pca, nfire_pca, NORM_L2); 

if (diff_fire > diff_non_fire) 
    putText(Original, "Fire Detected", Point(0, 50), 2, 1, Scalar(255, 0, 0), 2); 
else 
    putText(Original, "Fire Not Detected", Point(0, 50), 2, 1, Scalar(0, 255, 0), 2); 
} 

the error that i get when I debug

+0

Bitte lesen Sie http://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-orerrors – AdrianHHH

Antwort

0

Das Dialogfeld berichtet, dass eine Ausnahme ausgelöst wird. Im Moment sollte der Fokus darauf liegen zu verstehen, woher die Ausnahme kommt, warum und was das eigentliche Problem mit dem Programm ist. Möglicherweise befindet es sich nicht in dem Codeabschnitt, den Sie gepostet haben.

Sehen Sie sich den Aufruf-Stack an (ein anderes Fenster, das Sie mit Visual Studio öffnen können) und doppelklicken Sie auf den Stapel, um zu sehen, was Ihr Programm macht und warum.

Sie können auch ein Ausnahmefenster (Ctl + Alt + E) öffnen und bestimmte Ausnahmen deaktivieren (falls es einen Handler für die Ausnahme gibt). enter image description here Wenn für die Ausnahme kein Handler vorhanden ist, können Sie sie abfangen und sehen, welche Details die Ausnahme hat.

Nehmen Sie das folgende einfache Programm zum Beispiel: example of exception being thrown

Now (links oben) in den Call-Stack wir, dass wir main()function2() Aufruf haben sehen können,:

#include <iostream> 
#include <exception> 

void function1() 
{ 
    throw std::exception("My exeption\n"); 
} 

void function2() 
{ 
    function1(); 
} 

int 
main() 
{ 
    try { 
     function2(); 
    } 
    catch (const std::exception& e) { 
     std::cout << e.what(); 
    } 
} 

Visual Studio dies zeigen Aufruf function1(), die die Ausnahme wirft.

Schließlich, wenn das Programm fortfährt, wird es den Text My exeption ausgeben, da wir es in main() gefangen haben.

2

SEHR WICHTIG!

Sie können den Mittelwert nicht als lineares Mittel berechnen!

HSV ist ein zylindrisches Koordinatensystem. Die Polarachse wird durch einen Winkel (Farbton) und eine Länge (Sättigung) dargestellt. Die Längsachse ist eine Länge (Wert).

Hue is the angle of a cylindrical coordinate system.

Zum Beispiel, wenn Sie einen 2 Pixel haben. Pixel 1 hat einen Farbton von 0,9. Pixel 2 hat einen Farbton von 0,9. Beide sind "rötliche" Farben. (Auf dem Farbkreis oben könnten wir 20 und 340 Grad sagen)

Der lineare Mittelwert ist 0,5 ist Cyan, die definitiv NICHT rot ist.

Der korrekte Mittelwert ist 0.0, das genau auf dem Farbrad zwischen 0.1 und 0.9 liegt!

Die Sättigung und Wert sind beide Linearachsen, und als solche kann man die mittlere berechnen sehr einfach:

meanSaturation = sum (s)/(rows * cols); 
meanValue = sum (v)/(rows * cols); 

den mittleren Farbton zu berechnen, müssen Sie einige Trigonometrie verwenden:

#include <math.h> 

#define PI 3.14159265 

void YourFunction () 
{ 
    // ... The beginning of the code ... 

    // Calculate the sine and cosine of each hue value. 
    hueSin = sin (h/(2 * PI)); 
    hueCos = cos (h/(2 * PI)); 

    // Calculate the mean sine and mean cosine. 
    hueSinMean = sum (hueSin)/(rows * cols); 
    hueCosMean = sum (hueCos)/(rows * cols); 

    // Retrieve the mean hue by calculating the mean sine and cosine. 
    // This will calculate the mean in radians, on a scale from 0 to 2. 
    // Divide by 2 * PI to recover the original scale 
    hueMean = atan2 (hueCosMean , hueSinMean); 

    // Account for negative hue values 
    if (hueMean < 0) 
    hueMean = hueMean + 2 * PI; 
    end 

    // Convert back to range [ 0 , 1 ]. 
    hueMean = hueMean/(2 * PI); 

    // ... The beginning of the code ... 
} 
+1

Relavant Wikipedia Artikel: [Mean of zirkuläre Mengen] (https://en.wikipedia.org/wiki/Mean_of_circular_quantities). – horchler

+0

Danke @horchler. Definitiv werde ich das als eine Referenz in meiner eigenen Codebasis hinzufügen. – Juderb