【问题标题】:Blob detection on embedded platform, memory restricted嵌入式平台上的 Blob 检测,内存受限
【发布时间】:2019-10-09 23:08:27
【问题描述】:

我有一个带有 1MB RAM 和 1MB ROM 的 STM32H7 MCU。我需要对最大尺寸为 1280x1024 的二进制图像数组进行斑点检测算法。

我搜索了一下blob检测算法,发现主要分为2类,LINK

  • 基于标签传播的算法(一次一个组件): 他们首先搜索一个未标记的对象像素,用新标签标记该像素;然后,在后面的处理中,它们将相同的标签传播到与该像素相连的所有对象像素。演示代码如下所示:

void setLabels(){
  int m=2; 
  for(int y=0; y<height; y++){
     for(int x=0; x<width; x++){
        if(getPixel(x,y) == 1) compLabel(x,y,m++);
     }
  }
}

void compLabel(int i, int j,int m){
  if(getPixel(i,j)==1){
    setPixel(i,j,m); //assign label

    compLabel(i-1,j-1,m); 
    compLabel(i-1,j,m);
    compLabel(i-1,j+1,m); 
    compLabel(i,j-1,m);
    compLabel(i,j+1,m); 
    compLabel(i+1,j-1,m);
    compLabel(i+1,j,m); 
    compLabel(i+1,j+1,m);
  }
}
  • 基于标签等效解析(两遍)的算法:它们包括两个步骤:在第一步中,它们为每个对象像素分配一个临时标签。第二步,他们将分配给每个对象的所有临时标签(称为等效标签)整合到一个唯一标签(称为代表标签)中,并将每个对象像素的临时标签替换为其代表标签。

第一种算法的缺点是它对原始像素周围的所有像素使用递归调用。由于栈有限,恐怕会在STM32上造成硬故障错误。 第二种算法的缺点是它需要大量内存来标记图像。例如,对于最大值。分辨率为 1280x1024,最大。标签数量 255(0 表示无标签),图像标签大小为 1.25MB。远远超过我们可用的。

我正在寻找一些关于如何进行的建议。如何在不使用太多内存的情况下获取图像中所有斑点的中心坐标和区域信息?任何帮助表示赞赏。我认为第二种算法不适用,因为没有可用的内存。

【问题讨论】:

  • 你是如何把这张照片融入你的记忆中的? binary image array of max size 1280x1024 这是否意味着它每个像素只使用一位?因为如果是这样,您已经有 blob。
  • 是的,你是对的,每像素单个位 - 0 或 1。但我需要获取每个 blob 的坐标和面积以进行进一步处理。

标签: image embedded processing vision


【解决方案1】:

您首先必须使用缩放内核检查您的图像,以将您的图像缩放回能够处理的东西。 4:1 或 9:1 是很好的可能性。或者你将不得不获得更多的 RAM。因为这种情况在其他情况下似乎行不通。位访问不是很快,并且会降低您的效率,我什至认为您不需要那么大的图像。 (至少这是我在视觉系统方面的经验)

然后您可以将像素存储在直接的unsigned char 数组中,该数组可以使用您命名的第一个方法进行标记。它不一定是一个递归过程。您还可以确定一个 blob 是否被重新标记为另一个 blob 并设置一个标志以再次执行此操作。 这样就可以让一个外部可见的函数有一个 while 循环,它会不断调用你的标签函数而不会创建一个大堆栈。

然后通过遍历图像并计算每个标记的斑点的像素实例来确定区域。

通过计算一个blob的moments,然后计算center of mass,可以找到某个blob的中心。这是一些相当庞大的数学运算,所以不要气馁,虽然它是一个很难解决的问题,但它是一个很好的解决方案。

(小提示:您可以从 OpenCV 获取 C++ 代码并查看 their code 以了解它是如何完成的)

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 2010-12-07
    • 2014-01-22
    • 2011-07-25
    • 1970-01-01
    • 2013-05-25
    • 2011-03-26
    • 2010-11-06
    • 2020-05-06
    相关资源
    最近更新 更多