小编Cha*_*guy的帖子

图像处理:"可口可乐罐"识别的算法改进

在过去的几年里,我参与过的最有趣的项目之一是关于图像处理的项目.我们的目标是建立一个能够识别可口可乐"罐头"的系统(请注意,我正在强调'罐头'这个词,你会在一分钟内看到原因).您可以在下面看到一个示例,其中可以使用缩放和旋转在绿色矩形中识别.

模板匹配

对项目的一些限制:

  • 背景可能非常嘈杂.
  • 可以具有任何规模旋转,甚至方向(在合理的限度内).
  • 图像可能有一定程度的模糊性(轮廓可能不完全笔直).
  • 图像中可能有可口可乐瓶,算法应该只检测罐头!
  • 图像的亮度可能会有很大差异(因此您不能过多依赖颜色检测).
  • 可以部分地隐藏在两侧或中间,可能部分地隐藏了一瓶后面.
  • 有可能是没有像在所有的,在这种情况下,你必须找到什么,写一条消息这样说.

所以你最终可能会遇到这样棘手的事情(在这种情况下,我的算法完全失败):

总失败

我不久前做了这个项目,并且做了很多乐趣,我有一个不错的实现.以下是有关我的实施的一些细节:

语言:使用OpenCV库在C++中完成.

预处理:对于图像预处理,即将图像转换为更原始的形式以给出算法,我使用了两种方法:

  1. 将颜色域从RGB更改为HSV并基于"红色"色调进行过滤,饱和度高于某个阈值以避免橙色样色,并过滤低值以避免暗色调.最终结果是二进制黑白图像,其中所有白色像素将表示与该阈值匹配的像素.显然,图像中仍有很多废话,但这会减少您必须使用的维度数量. 二值化图像
  2. 使用中值滤波进行噪声滤波(取所有邻居的中值像素值并用该值替换像素)以减少噪声.
  3. 使用Canny边缘检测过滤器在2个先前步骤之后获取所有项目的轮廓. 轮廓检测

算法:我为这个任务选择的算法本身取自本关于特征提取的神奇书籍,称为广义霍夫变换(与常规Hough变换有很大不同).它基本上说了几件事:

  • 您可以在不知道其解析方程的情况下描述空间中的对象(这是这种情况).
  • 它可以抵抗图像变形,例如缩放和旋转,因为它基本上会针对比例因子和旋转因子的每个组合测试图像.
  • 它使用算法将"学习"的基本模型(模板).
  • 轮廓图像中剩余的每个像素将根据从模型中学到的内容投票给另一个像素,该像素应该是对象的中心(就重力而言).

最后,你得到了一张投票的热图,例如,这里所有罐子轮廓的像素都会投票给它的引力中心,所以你会在同一个像素对应的投票中得到很多票.中心,并将在热图中看到如下峰值:

GHT

一旦你有了这个,一个简单的基于阈值的启发式可以给你中心像素的位置,你可以从中获得比例和旋转,然后围绕它绘制你的小矩形(最终的比例和旋转因子显然将相对于你原始模板).理论上至少......

结果:现在,虽然这种方法在基本情况下起作用,但在某些方面却严重缺乏:

  • 非常慢!我并没有强调这一点.处理30个测试图像需要将近一整天,显然是因为我有一个非常高的旋转和平移比例因子,因为一些罐子非常小.
  • 当瓶子出现在图像中时,它完全丢失了,并且由于某种原因,几乎总是发现瓶子而不是罐头(可能因为瓶子更大,因此有更多的像素,因此更多的选票)
  • 模糊图像也不好,因为投票在中心周围的随机位置以像素结束,因此以非常嘈杂的热图结束.
  • 实现了平移和旋转的方差,但没有取向,这意味着没有直接面对相机物镜的罐子被识别出来.

你能帮助我改进我的特定算法,只使用OpenCV功能来解决上面提到的四个具体问题吗?

我希望有些人也会从中学到一些东西,毕竟我认为不仅要问问题的人应该学习.:)

c++ algorithm opencv image-processing

1585
推荐指数
20
解决办法
18万
查看次数

如何更改Linux中的打开文件数限制?

运行我的应用程序时,我有时会收到错误too many files open.

运行ulimit -a报告限制为1024.如何将限制增加到1024以上?

编辑 ulimit -n 2048权限错误中的结果.

linux

188
推荐指数
4
解决办法
49万
查看次数

如何修复NoSuchMethodError?

NoSuchMethodError在运行Java程序时遇到错误.怎么了,怎么解决?

java nosuchmethoderror

162
推荐指数
11
解决办法
30万
查看次数

我应该在urllib.urlopen()之后调用close()吗?

我是Python新手并阅读其他人的代码:

应该urllib.urlopen()跟着urllib.close()?否则,一个人会泄漏连接,对吗?

python urllib

70
推荐指数
3
解决办法
4万
查看次数

头文件中的多个类与每个类的单个头文件相对应

无论出于何种原因,我们公司都有一个编码指南,规定:

Each class shall have it's own header and implementation file.

因此,如果我们编写一个名为的类,MyString我们需要一个关联的MyStringh.hMyString.cxx.

还有其他人这样做吗?有没有人看到任何编译性能影响?10000个文件中的5000个类的编译速度是否与2500个文件中的5000个类一样快?如果没有,差异是否明显?

[我们编写C++并使用GCC 3.4.4作为我们的日常编译器]

c++ performance file-organization

68
推荐指数
6
解决办法
7万
查看次数

在Capistrano中部署Git子目录

我的主分支布局是这样的:

/ < - 顶级

/ client < - 桌面客户端源文件

/ server < - Rails app

我想做的只是拉下我的/ server目录deploy.rb,但我似乎找不到任何办法./ client目录很大,因此设置一个钩子来复制/服务器到/将无法正常工作,它只需要拉下Rails应用程序.

git deployment capistrano ruby-on-rails

65
推荐指数
3
解决办法
1万
查看次数

你如何处理数据库中的多态?

我有Person,SpecialPersonUser.Person并且SpecialPerson只是人 - 他们在站点上没有用户名或密码,但是它们存储在数据库中以便保存记录.用户拥有所有相同的数据,Person并且可能SpecialPerson与在站点中注册的用户名和密码一起使用.


你会如何解决这个问题?您是否有一个Person表存储一个人共有的所有数据并使用密钥查找他们的数据SpecialPerson(如果他们是特殊的人)和用户(如果他们是用户),反之亦然?

oop database-design

49
推荐指数
7
解决办法
2万
查看次数

为什么矩阵乘法比numpy更快而不是Python中的ctypes?

我试图找出最快的矩阵乘法方法,尝试了3种不同的方法:

  • 纯python实现:这里没有惊喜.
  • Numpy实现使用 numpy.dot(a, b)
  • 使用ctypesPython中的模块与C连接.

这是转换为共享库的C代码:

#include <stdio.h>
#include <stdlib.h>

void matmult(float* a, float* b, float* c, int n) {
    int i = 0;
    int j = 0;
    int k = 0;

    /*float* c = malloc(nay * sizeof(float));*/

    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            int sub = 0;
            for (k = 0; k < n; k++) {
                sub = sub + a[i * n + …
Run Code Online (Sandbox Code Playgroud)

c python benchmarking matrix-multiplication

49
推荐指数
5
解决办法
2万
查看次数

您是否在生产软件中使用AOP(面向方面​​编程)?

在我看来,AOP是一个有趣的编程范例.但是,目前还没有关于stackoverflow的讨论(至少我找不到它们).你对此有何看法?你在项目中使用AOP吗?或者你认为它是一种利基技术,不会长时间存在或者不会成为主流(就像OOP一样,至少在理论上会这样做))?

如果您确实使用AOP,请告诉我们您使用的工具.谢谢!

paradigms aop

37
推荐指数
3
解决办法
7691
查看次数

用于使用参数运行的Python映射列表项

有没有办法将列表项与参数一起映射到函数.我有一个清单:

pages = [p1, p2, p3, p4, p5...]
Run Code Online (Sandbox Code Playgroud)

我必须调用myFunc与每个列表元素相对应的函数以及其他参数,以便可以计算以下内容

myFunc(p1, additionalArgument)
myFunc(p2, additionalArgument)
Run Code Online (Sandbox Code Playgroud)

等等...

这样做有什么优雅的方法吗?我是新手所以请不要介意.

python

35
推荐指数
3
解决办法
4万
查看次数