我正在尝试计算OpenCV二进制图像中的所有白色像素。我目前的代码如下:
whitePixels = 0;
for (int i = 0; i < height; ++i)
for (int j = 0; j < width; ++j)
if (binary.at<int>(i, j) != 0)
++whitePixels;
然而,在使用gprof进行分析之后,我发现这是一段非常慢的代码,并且在程序中存在很大的瓶颈。
是否有一种可以更快地计算相同值的方法?
答案 0 :(得分:22)
cvCountNonZero
。通常,任务的OpenCV实现都经过了大量优化。
答案 1 :(得分:0)
您可以使用并行计算。您将图像划分为N个部分并在不同的线程中运行您的代码,然后您获得每个线程的结果,然后您可以添加此结果以获取最终数量。
答案 2 :(得分:-2)
一行中的最后一个像素通常后跟下一行中的第一个像素(C代码):
limit=width*height;
i=0;
while (i<limit)
{
if (binary.at<int>(0,i) != 0) ++whitePixels;
++i;
}
答案 3 :(得分:-2)
实际上binary.at<int>(i, j)
访问速度很慢!
以下是比您更快访问的简单代码。
for (int i = 0; i < height; ++i)
{
uchar * pixel = image.ptr<uchar>(i);
for (int j = 0; j < width; ++j)
{
if(pixel[j]!=0)
{
//do your job
}
}
}