0

我编写了一个应用程序,它将视频帧捕获为 RGBA 格式,将其转换为 HSV(以便于阈值处理),然后对图像进行阈值处理。(基本上,在相机“看到”指定颜色的地方,它会将这些元素变成白色,如果没有,它会将这些元素变成黑色。)

我想做的是确定图像的百分比落在指定的颜色范围内。我最初的想法是扫描阈值垫的每个单独元素,并计算白色元素的数量以查看检测到颜色的位置。我有两个问题——首先,这是解决这个问题的有效方法吗?还是我错过了一些明显的东西?其次,我将如何访问 Mat 的元素(如果这是最有效的解决方案)?我已经查看了几个问题以及 Mat 文档,但这有点超出我的想象。

这是我现在用来确定图像中白色元素数量的伪代码。

// Loop through height
   // Loop through width 
       // If Mat element (height, width) is white, add 1 to the total 

// Compare total to the total number of elements in the image (height * width)

编辑:我找到了如何访问 Mat 的各个元素(我想多了,并且在我找到的教程中查看一些不相关的信息时让自己感到困惑。我在下面包括了如何做到这一点,但是我会欢迎任何关于更有效的方法的想法,或者我已经尽可能有效地这样做的知识,如果我是的话!谢谢!

for(int h=0; h<mHSVThreshed.height(); h++){
    for(int w=0; w<mHSVThreshed.width(); w++) {
        double element = mHSVThreshed.get(h, w)[0]; 
        }
}

要访问具有多个通道的 Mat,您可以使用mHSV.get(h, w)[1] mHSV.get(h, w)[2]etc.

4

1 回答 1

1

为了速度,我会这样做。

unsigned int accumulator=0;
for(int i=0;i<yourMat.rows;i++){
    unsigned char *row=yourMat.ptr(i);
    for(int j=0;j<yourMat.cols;j++)
        accumulator+=row[j];
}
accumulator/=(yourMat.cols*yourMat.rows);

这假设您已将阈值设置为 1 而不是 255 或其他值。它应该比Mat::get()函数快得多,因为它只担心每行一次的宽度步长。

于 2012-04-04T19:33:19.910 回答