代码之家  ›  专栏  ›  技术社区  ›  Kehkashan Kanwal

查找HSV转换视频馈送的平均值[已关闭]

  •  0
  • Kehkashan Kanwal  · 技术社区  · 8 年前

    这是我的代码的预期行为:

    “我应该从主程序中获取RGB2HSV转换视频和原始视频,并设计一个函数,该函数可以找到所有H、S和V值的平均值,并为每个帧生成1*3矩阵。”

    这实际上是使用PCA对火灾和非火灾对象进行分类。我在MATLAB中进行了特征提取,并在visual studio中用c++代码标记了PCA系数。显然,代码是无错误的,但当我调试运行它时,它给出的错误可以在所附的照片中看到。

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

    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

    2 回复  |  直到 8 年前
        1
  •  2
  •   Juderb    8 年前

    非常重要!

    您不能将平均色调计算为线性平均值!

    HSV是圆柱坐标系。极轴由角度(色调)和长度(饱和度)表示。纵轴是长度(值)。

    Hue is the angle of a cylindrical coordinate system.

    例如,如果您有2个像素。像素1的色调为0.9。像素2的色调为1.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 ...
    }
    
        2
  •  0
  •   wally    8 年前

    对话框报告正在引发异常。目前的重点应该是了解异常的来源、原因以及程序的真正问题是什么。它可能不在您发布的代码部分中。

    查看调用堆栈(另一个可以用VisualStudio打开的窗口),并在堆栈上下双击,以查看程序正在执行的操作及其原因。

    此外,您还可以打开异常窗口(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() .