2016-05-12 97 views
0

这是预期的我的代码的行为:查找平均转换视频输入

“我应该得到一个RGB2HSV转换后的视频和原始视频从我的主要程序,并设计出可以找到一个函数的所有H的指,S和V值,并为每个帧生成1 * 3矩阵。“

这实际上是使用PCA对火与非火之间的对象进行分类。我已经完成了MATLAB中的特征提取,并且在visual studio中使用C++代码对PCA系数进行了decalred。显然,代码是无错误的,但是当我调试运行它时,它会给出附加照片中可以看到的错误。

此外,其余代码已正确执行,没有错误。 问题在哪里。附上我的代码

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-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。像素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