标签: opencv

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

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

模板匹配

对项目的一些限制:

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

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

总失败

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

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

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

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

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

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

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

GHT

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

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

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

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

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

c++ algorithm opencv image-processing

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

如何检测圣诞树?

哪些图像处理技术可用于实现检测以下图像中显示的圣诞树的应用程序?

我正在寻找适用于所有这些图像的解决方案.因此,需要训练haar级联分类器模板匹配的方法不是很有趣.

我正在寻找可以用任何编程语言编写的东西,只要它只使用开源技术.必须使用此问题上共享的图像测试解决方案.有6个输入图像,答案应显示处理每个图像的结果.最后,对于每个输出图像,必须有红线绘制以包围检测到的树.

您将如何以编程方式检测这些图像中的树?

c++ python opencv image-processing computer-vision

376
推荐指数
10
解决办法
2万
查看次数

OpenCV-Python中的简单数字识别OCR

我正在尝试在OpenCV-Python(cv2)中实现"数字识别OCR".它仅用于学习目的.我想在OpenCV中学习KNearest和SVM功能.

我有每个数字的100个样本(即图像).我想和他们一起训练.

letter_recog.pyOpenCV示例附带了一个示例.但我仍然无法弄清楚如何使用它.我不明白什么是样本,响应等.另外,它首先加载一个txt文件,我首先不明白.

稍后搜索一下,我可以在cpp示例中找到一个letter_recognition.data.我使用它并在letter_recog.py模型中为cv2.KNearest创建了一个代码(仅用于测试):

import numpy as np
import cv2

fn = 'letter-recognition.data'
a = np.loadtxt(fn, np.float32, delimiter=',', converters={ 0 : lambda ch : ord(ch)-ord('A') })
samples, responses = a[:,1:], a[:,0]

model = cv2.KNearest()
retval = model.train(samples,responses)
retval, results, neigh_resp, dists = model.find_nearest(samples, k = 10)
print results.ravel()
Run Code Online (Sandbox Code Playgroud)

它给了我一个20000的数组,我不明白它是什么.

问题:

1)letter_recognition.data文件是什么?如何从我自己的数据集构建该文件?

2)什么results.reval()表示?

3)我们如何使用letter_recognition.data文件(KNearest或SVM)编写简单的数字识别工具?

python ocr opencv numpy computer-vision

370
推荐指数
3
解决办法
21万
查看次数

OpenCV - 找不到模块cv2

我在Raspberry Pi上的Occidentalis操作系统(Raspbian的一个变种)上安装了OpenCV,使用了jayrambhia的脚本:https://github.com/jayrambhia/Install-OpenCV/blob/master/Ubuntu/opencv_latest.sh.它安装了2.4.5版本.

当我尝试在python程序中导入模块cv2时,我收到以下消息:

pi@raspberrypi~$ python cam.py
Traceback (most recent call last)
File "cam.py", line 1, in <module>
    import cv2
ImportError: No module named cv2
Run Code Online (Sandbox Code Playgroud)

cv2.so存储在

pi@raspberrypi~$ python cam.py
Traceback (most recent call last)
File "cam.py", line 1, in <module>
    import cv2
ImportError: No module named cv2
Run Code Online (Sandbox Code Playgroud)

在/ usr/local/lib中还有一些名为python3.2和python2.6的文件夹,这可能是个问题,但我不确定.

这可能是路径错误吗?任何帮助(Linux新手).

谢谢.

python opencv raspberry-pi

213
推荐指数
17
解决办法
73万
查看次数

如何通过Conda安装Python OpenCV?

我正在尝试通过Anaconda安装OpenCV for Python ,但我似乎无法解决这个问题.

我试过了

conda install opencv
conda install cv2
Run Code Online (Sandbox Code Playgroud)

我也尝试过搜索

conda search cv
Run Code Online (Sandbox Code Playgroud)

没有雪茄.我跑过这个列出opencv了一个包含的包:

http://docs.continuum.io/anaconda/pkgs.html

运行后conda info我注意到我的版本是3.4.1,但我似乎无法在线找到有关此版本的任何信息.我对此非常困惑.

我错过了一些非常明显的东西吗?如果opencv可用于以前版本的Anaconda,那么为什么它不适用于较新版本?为什么这个链接只显示版本1.9.2的文档?

python opencv anaconda conda

202
推荐指数
22
解决办法
53万
查看次数

有没有办法检测图像是否模糊?

我想知道是否有办法通过分析图像数据来确定图像是否模糊.

opencv image-processing

193
推荐指数
9
解决办法
13万
查看次数

简单快速的方法来比较图像的相似性

我需要一种简单快速的方法来比较两个图像的相似性.即如果它们包含完全相同的东西但是可能有一些稍微不同的背景并且可能被移动/调整大小几个像素,我想获得高值.

(更具体的是,如果重要的话:一张图片是一个图标,另一张图片是截图的子区域,我想知道该子区域是否恰好是图标.)

我手边有OpenCV,但我仍然不习惯它.

到目前为止我想到的一种可能性:将两张图片分成10x10个单元格,对于这100个单元格中的每一个,比较颜色直方图.然后我可以设置一些补偿阈值,如果我得到的值高于该阈值,我认为它们是相似的.

我还没有尝试过它的效果如何,但我想它会足够好.图像已经非常相似(在我的用例中),所以我可以使用相当高的阈值.

我想有很多其他可能的解决方案可以或多或少地工作(因为任务本身非常简单,因为我只想检测相似性,如果它们非常相似).你会建议什么?


关于从图像中获取签名/指纹/哈希,有一些非常相关/类似的问题:

另外,我偶然发现了这些具有获取指纹功能的实现:

关于感知图像哈希的一些讨论:这里


有点offtopic:有很多方法来创建音频指纹.MusicBrainz是一种为歌曲提供基于指纹的查找的网络服务,在他们的维基中很好的概述.他们现在正在使用AcoustID.这是为了找到精确(或大部分精确)的匹配.要查找类似的匹配(或者如果您只有一些片段或高噪音),请查看Echoprint.一个相关的SO问题在这里.所以这似乎解决了音频问题.所有这些解决方案都非常有效.

对一般的模糊搜索一个稍微更通用的问题是在这里.例如,存在局部敏感的散列最近邻搜索.

opencv image-processing computer-vision

186
推荐指数
5
解决办法
12万
查看次数

如何使用Python在OpenCV中裁剪图像

我如何使用OpenCV裁剪图像,就像我之前在PIL中所做的那样.

关于PIL的工作示例

im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')
Run Code Online (Sandbox Code Playgroud)

但是我怎么能在OpenCV上做到这一点?

这是我试过的:

im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))
cv.imshow('Img', im)
cv.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

我想我错误地使用了getRectSubPix.如果是这种情况,请解释我如何正确使用此功能.

python opencv

184
推荐指数
7
解决办法
43万
查看次数

如何消除数独广场中的凸性缺陷?

我正在做一个有趣的项目:使用OpenCV从输入图像中解决数独(如Google护目镜等).我完成了任务,但最后我发现了一个问题,我来到这里.

我使用OpenCV 2.3.1的Python API进行编程.

以下是我的所作所为:

  1. 阅读图片
  2. 找到轮廓
  3. 选择具有最大面积的那个(并且也有点等于正方形).
  4. 找到角点.

    例如,如下:

    在此输入图像描述

    (请注意,绿线正确地与Sudoku的真实边界重合,因此可以正确扭曲数独.查看下一张图片)

  5. 将图像扭曲成完美的正方形

    例如:

    在此输入图像描述

  6. 执行OCR(我使用我在OpenCV-Python中的简单数字识别OCR中给出的方法)

而且方法效果很好.

问题:

看看这个图像.

在此图像上执行第4步,结果如下:

在此输入图像描述

绘制的红线是原始轮廓,它是数独边界的真实轮廓.

绘制的绿线是近似轮廓,它将是扭曲图像的轮廓.

当然,在数独的上边缘绿线和红线之间存在差异.因此,在翘曲时,我没有得到数独的原始边界.

我的问题 :

如何在数独的正确边界上扭曲图像,即红线,或者如何消除红线和绿线之间的差异?在OpenCV中有没有这方法?

python opencv sudoku computer-vision

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

OpenCV C++/Obj-C:检测一张纸/方形检测

我在我的测试应用程序中成功实现了OpenCV平方检测示例,但现在需要过滤输出,因为它非常混乱 - 或者我的代码是错误的?

我对本文的四个角点感兴趣,以减少偏斜(如此)和进一步处理......

输入输出: 输入输出

原始图片:

点击

码:

double angle( cv::Point pt1, cv::Point pt2, cv::Point pt0 ) {
    double dx1 = pt1.x - pt0.x;
    double dy1 = pt1.y - pt0.y;
    double dx2 = pt2.x - pt0.x;
    double dy2 = pt2.y - pt0.y;
    return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}

- (std::vector<std::vector<cv::Point> >)findSquaresInImage:(cv::Mat)_image
{
    std::vector<std::vector<cv::Point> > squares;
    cv::Mat pyr, timg, gray0(_image.size(), CV_8U), gray;
    int thresh = 50, N = 11;
    cv::pyrDown(_image, pyr, cv::Size(_image.cols/2, _image.rows/2));
    cv::pyrUp(pyr, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing objective-c computer-vision

171
推荐指数
3
解决办法
11万
查看次数