使用python-opencv的水平和垂直边缘轮廓

时间:2013-03-05 22:15:38

标签: python opencv computer-vision edge-detection

我正在尝试检测图像中的车辆(实际上是视频中的一系列帧)。我是opencv和python的新手,在Windows 7下工作。

有没有办法获得图像的水平边缘和垂直边缘,然后将结果图像汇总到各自的矢量中?

是否有可用的python代码或函数。

我查看了thisthis,但不知道该怎么做。 您可以使用以下图像进行说明。

修改

我受到以下论文中提出的想法的启发(对不起,如果您没有访问权限)。

Betke,M。; Haritaoglu,E。& Davis,L。S.实时多车辆检测和跟踪移动车辆机器视觉和应用,Springer-Verlag,2000,12,69-83

http://i.stack.imgur.com/y5MXl.jpg

3 个答案:

答案 0 :(得分:1)

我会看一下opencv的广场示例,发布here。它使用canny,然后轮廓找到返回每个方块的边。您应该能够修改此代码以获取您要查找的水平和垂直线。 Here是canny python调用文档的链接。它对于所有边缘检测都非常有用。在大约一个小时内,我可以回家,给你一个你想要的工作实例。

答案 1 :(得分:1)

对索贝尔过滤器做一些阅读。

http://en.wikipedia.org/wiki/Sobel_operator

您基本上可以在每个像素处获得垂直和水平渐变。

这是OpenCV函数。

http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=sobel#sobel

获得此过滤后的图像后,您可以收集统计信息列/行,并确定其是否为边缘并获取该位置。

答案 2 :(得分:1)

通常,几何物体检测方法并不是非常成功,因为您假设的外观模型很容易被遮挡,噪声或方向变化所侵犯。

在我看来,机器学习方法通​​常效果更好,可能会为您的问题提供更强大的解决方案。由于您似乎正在使用OpenCV,因此您可以查看Casacade Classifiers,其中OpenCV提供了Haar小波和基于本地二进制模式特征的分类器。

我提供的链接是一个教程,其中包含非常完整的步骤,解释了如何使用多个预先编写的实用程序创建分类器。基本上,您将创建一个目录,其中包含汽车的“正面”图像和具有典型背景的“负面”图像的目录。实用opencv_createsamples可用于创建扭曲的训练图像,以模拟来自一小组图像的不同方向和平均强度。然后使用实用程序opencv_traincascade设置一些命令行参数来选择输出训练分类器的不同训练选项。

可以使用C ++或Python接口使用此训练分类器执行检测。 例如,使用Python,您可以加载分类器并对图像执行检测,使用以下方法获取选定的边界矩形:

image = cv2.imread('path/to/image')
cc = cv2.CascadeClassifier('path/to/classifierfile')
objs = cc.detectMultiScale(image)