- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 GPUImageHoughTransformLineDetector 尝试检测图像中突出显示的文本:
我正在使用以下代码尝试检测边界蓝色框线:
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:rawImage];
GPUImageHoughTransformLineDetector *lineFilter = [[GPUImageHoughTransformLineDetector alloc] init];
[stillImageSource addTarget:lineFilter];
GPUImageLineGenerator *lineDrawFilter = [[GPUImageLineGenerator alloc] init];
[lineDrawFilter forceProcessingAtSize:rawImage.size];
__weak typeof(self) weakSelf = self;
[lineFilter setLinesDetectedBlock:^(GLfloat *flt, NSUInteger count, CMTime time) {
NSLog(@"Number of lines: %ld", (unsigned long)count);
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:rawImage.size];
[stillImageSource addTarget:blendFilter];
[lineDrawFilter addTarget:blendFilter];
[blendFilter useNextFrameForImageCapture];
[lineDrawFilter renderLinesFromArray:flt count:count frameTime:time];
weakSelf.doneProcessingImage([blendFilter imageFromCurrentFramebuffer]);
}];
[stillImageSource processImage];
无论 edgeThreshold 还是 1023 行,每次我运行它时,结果输出如下:
我不清楚为什么更改阈值没有任何作用,但我确信我误会了什么。有人对如何最好地做到这一点有任何想法吗?
最佳答案
我刚刚对框架中的霍夫变换线检测器进行了一些改进,这将有助于解决这个问题,但您需要对图像进行一些额外的预处理才能只挑选出那个蓝色框。
让我解释一下这个操作是如何工作的。首先,它检测图像中的边缘。对于确定为边缘的每个像素(现在,我为此使用 Canny 边缘检测器),提取该像素的坐标。然后使用这些坐标中的每一个在平行坐标空间中绘制一对线(基于 Dubská, et al. 在 "Real-Time Detection of Lines using Parallel Coordinates and OpenGL" 中描述的过程)。
平行坐标空间中线条相交的像素将增加强度。平行坐标空间中强度最大的点表示现实世界场景中存在一条线。
但是,只有强度局部最大值的像素表示真实的线条。挑战在于确定局部最大值以抑制来自繁忙场景的噪声。这就是我在这个操作中没有完全解决的问题。在上面的图像中,大量的线是由于平行坐标空间中的检测阈值以上的点乱七八糟,但由于不是局部最大值而没有被正确删除。
不过,我确实做了一些改进,所以我现在从操作中获得了更清晰的输出(我只是通过屏幕的实时视频输入快速完成了此操作):
我修复了局部非最大抑制滤波器中的一个错误,并将它的工作区域从 3x3 扩展到 5x5。它仍然留下一堆非最大值点,这些点会产生噪音,但它要好得多。
您会注意到这仍然不能完全满足您的要求。它在文本中拾取行,而不是你的框。这是因为白底黑字在边缘检测阶段会产生非常强烈、非常锐利的边缘,而白底浅蓝色选择框需要极低的阈值才能在任何边缘检测过程中被拾取。
如果您总是要选择蓝色选择框,我建议您运行预处理操作以唯一标识场景中的蓝色对象。一种简单的方法是定义一个自定义过滤器,该过滤器从每个像素的蓝色分量中减去红色分量,对负值进行底限并将该计算结果作为红色、绿色和蓝色 channel 的输出。您甚至可能想将结果乘以 2.0-3.0 以加强这种差异。
结果应该是图像中的蓝色区域显示为白色,其他地方显示为黑色。这将大大提高选择框周围的对比度,并使其更容易从文本中挑选出来。您需要使用正确的参数进行试验,以使其在您的情况下尽可能可靠。
关于ios - 使用 GPUImage 和 GPUImageHoughTransformLineDetector 检测突出显示的文本边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27514512/
有没有一种方法可以“标记”对象的属性,使它们在反射中“突出”? 例如: class A { int aa, b; string s1, s2; public int AA
我是一名优秀的程序员,十分优秀!