2016-05-12 2 views
0

Это ожидаемое поведение моего кода:Finding среднего HSV конвертирован видеопоток

«Я должен получить RGB2HSV конвертировать видео и оригинальное видео с моей основной программы и разработать функцию, которая может найти среднее из все Н , S и V и генерировать матрицу 1 * 3 для каждого кадра. "

Это фактически классификация объектов между огнем и не огнем с использованием PCA. Я сделал выделение функций в MATLAB и получил коэффициенты PCA, деколированные в коде C++ в visual studio. По-видимому, код без ошибок, но когда я отлаживаю его запуск, он дает ошибку, которая видна на прикрепленной фотографии.

Кроме того, остальная часть кода выполнена надлежащим образом без ошибок. Где проблема. прикрепление мой код

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

Пожалуйста, прочитайте http://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-or-errors – AdrianHHH

ответ

0

диалоговое окно сообщает, что исключение бросают. На данный момент основное внимание должно быть уделено пониманию того, откуда исходит исключение, почему и какова реальная проблема с программой. Возможно, это не относится к разделу кода, который вы опубликовали.

Посмотрите на стек вызовов (другое окно, которое вы можете открыть с помощью Visual Studio), и дважды щелкните вверх и вниз по стеку, чтобы узнать, что делает ваша программа и почему.

Также вы можете открыть окно с исключениями (Ctl + Alt + E) и отключить определенные исключения от взлома (в случае, если есть обработчик для исключения). enter image description here Если обработчик исключений не существует, вы можете поймать его и посмотреть, что такое детали исключения.

Возьмем следующую простую программу, например:

#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 покажет это: example of exception being thrown

Теперь в стеке вызовов (вверху слева) мы можем видеть, что мы имеем main() вызова function2(), вызывающий function1(), который бросает исключение.

Наконец, если программа продолжит, она выведет текст My exeption, так как мы поймали его в main().

2

ОЧЕНЬ ВАЖНО!

Вы НЕ МОЖЕТЕ рассчитать средний оттенок как линейное среднее значение!

HSV - это цилиндрическая система координат. Полярная ось представлена ​​углом (Hue) и длиной (насыщенностью). Продольная ось представляет собой длину (значение).

Hue is the angle of a cylindrical coordinate system.

Например, если у вас есть 2 пикселя. Пиксель 1 имеет оттенок 0,9. Pixel 2 имеет оттенок 0,9. Оба они являются «красноватыми» цветами. (На колесе цвета выше, мы могли бы сказать, что 20 и 340 градусов)

Линейное среднее 0.5, является голубым, что определенно НЕ красным.

Правильное значение - 0.0, который находится на полпути между 0,1 и 0,9 на цветном колесе!

Насыщенности и Значение являются линейными осями, и, таким образом, вы можете вычислить их средние очень просто:

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

Для вычисления среднего оттенка, вы должны использовать некоторые тригонометрический:

#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

Ревантская статья Википедии: [Среднее количество кругов] (https://en.wikipedia.org/вики/Mean_of_circular_quantities). – horchler

+0

Спасибо @horchler. Определенно собираюсь добавить это как ссылку в мою собственную базу кода. – Juderb

 Смежные вопросы

  • Нет связанных вопросов^_^