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

使用python opencv的水平和垂直边缘轮廓,python,opencv,computer-vision,edge-detection,Python,Opencv,Computer Vision,Edge Detection,我试图检测图像中的车辆(实际上是视频中的一系列帧)。我是opencv和python新手,在Windows7下工作 有没有办法获得图像的水平边缘和垂直边缘,然后将结果图像汇总到各自的矢量中 是否有可用于此的python代码或函数 我看了看,但不知道怎么做。 您可以使用下图进行说明 编辑 我的灵感来自于以下文章中提出的想法(如果您没有访问权限,请抱歉) 贝特克,M。;Haritaoglu,E.和Davis,L.S.运动车辆的实时多车辆检测和跟踪机器视觉与应用,Springer Verlag,2000

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

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

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

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

编辑

我的灵感来自于以下文章中提出的想法(如果您没有访问权限,请抱歉)

贝特克,M。;Haritaoglu,E.和Davis,L.S.运动车辆的实时多车辆检测和跟踪机器视觉与应用,Springer Verlag,2000,12,69-83


我想看一看opencv的方块示例。它使用canny,然后进行轮廓查找以返回每个正方形的边。您应该能够修改此代码,以获得所需的水平线和垂直线。是指向canny的python调用文档的链接。这对于全方位的边缘检测是很有帮助的。大约一个小时后,我就可以回家给你一个你想要的工作示例。

阅读一下Sobel过滤器

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

下面是它的OpenCV函数


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

通常,用于对象检测的几何方法并不十分成功,因为您假设的外观模型很容易被遮挡、噪波或方向变化破坏

在我看来,机器学习方法通常工作得更好,并且可能会为您的问题提供更可靠的解决方案。由于您似乎正在使用OpenCV,您可以看看哪个OpenCV提供了基于Haar小波和局部二进制模式特征的分类器

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

检测可以使用C++或Python接口与这个训练的分类器进行。 例如,使用Python,您可以加载分类器并对图像执行检测,从而使用以下方法返回选定的边界矩形:

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

谢谢我提供的图像(正方形)仅用于说明目的,因为我没有道路上车辆的免费图像。如果您恰好知道车辆后部的外观,并且可以假设它保持相对恒定,那么我建议使用模板匹配。如果它是常数,那么它可能会更精确,计算压力更小。模板的想法可能会缩小感兴趣的区域。不幸的是,现实生活中的问题对基本算法并不友好。我的视频是在路上的,我需要识别司机驾驶的每一辆车。这是可以理解的。大约一年前,我碰巧用c写了一个程序,从行车记录仪中检测车牌。虽然这不是我最终使用的模板匹配,但在这种情况下,模板匹配实际上工作得比较好。需要注意的一点是,对于许多汽车来说,它们身上检测到的线条并不总是水平和垂直的。您可能希望扩展系统以包括某些线型。就像是一个圆形的梯形(挡风玻璃)。抱歉耽搁了,结果我比预期的要忙。我想我找到了那篇文章,所以我读过之后会发一个样本。