【问题标题】:Finding mean of HSV converted video feed [closed]寻找 HSV 转换视频源的平均值 [关闭]
【发布时间】:2016-09-08 06:26:06
【问题描述】:

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

“我应该从我的主程序中获取一个 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

【问题讨论】:

标签: c++ matlab split mean hsv


【解决方案1】:

非常重要!

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

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

例如,如果您有 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 ...
}

【讨论】:

  • 相关维基百科文章:Mean of circular quantities.
  • 谢谢@horchler。肯定会在我自己的代码库中添加它作为参考。
【解决方案2】:

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

查看调用堆栈(您可以使用 Visual Studio 打开的另一个窗口)并上下双击堆栈以查看您的程序在做什么以及为什么。

您还可以打开异常窗口 (Ctl+Alt+E) 并禁止某些异常中断(如果有异常处理程序)。 如果没有异常处理程序,那么您可以捕获它并查看异常的详细信息。

以下面的简单程序为例:

#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 将显示:

现在在调用堆栈(左上角)中,我们可以看到我们有 main() 调用 function2(),调用 function1() 正在引发异常。

最后,如果程序继续运行,它将输出文本 My exeption,因为我们在 main() 中捕获了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2019-04-29
    • 2013-12-15
    • 2010-11-25
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多