计算 opencv 二进制图像中的 'white' 像素(有效)
Count 'white' pixels in opencv binary image (efficiently)
我正在尝试计算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进行分析之后,我发现这是一段非常慢的代码,并且是程序中的一个大瓶颈。
是否有一种方法可以更快地计算相同的值?
cv::CountNonZero
。通常任务的OpenCV实现是经过大量优化的。
您可以使用并行计算。你把图像分成N部分,在不同的线程中运行你的代码,然后你得到每个线程的结果,之后你可以添加这个结果来获得最终的数量。
一行的最后一个像素之后通常是下一行的第一个像素(C代码):
limit=width*height;
i=0;
while (i<limit)
{
if (binary.at<int>(0,i) != 0) ++whitePixels;
++i;
}
实际上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
}
}
}
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 有效地计算像素到其对应核线的距离
- 如何从C 中的CV :: MAT图像中有效提取某些像素
- 如何有效地计算在整个像素着色器阶段中使用颜色的次数
- 在OpenCV中循环通过16位Mat的像素的有效方法
- 根据内核/掩码在相关的相邻像素之间有效地迭代
- 计算 opencv 二进制图像中的 'white' 像素(有效)