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

3 投票
3 回答
4022 浏览
提问于 2025-04-17 18:03

我正在尝试在一张图片中检测车辆(实际上是视频中的一系列画面)。我对opencv和python还很陌生,并且是在Windows 7系统下工作。

有没有办法获取图片的水平边缘和垂直边缘,然后把这些结果合并成相应的向量呢?

有没有现成的python代码或函数可以用来实现这个?

我看过这个这个,但是还是不知道该怎么做。你可以使用下面的图片来做说明。

编辑

我受到了一篇论文中提出的想法的启发(如果你无法访问,抱歉)。

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

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

3 个回答

1

通常来说,单纯用几何方法来检测物体效果并不好,因为你假设的外观模型很容易被遮挡、噪声或方向变化打破。

我认为,机器学习的方法通常效果要好得多,可能会为你的问题提供更稳健的解决方案。既然你在使用OpenCV,可以看看Cascade 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)
1

先了解一下Sobel滤波器。

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

简单来说,Sobel滤波器可以帮助我们找到每个像素点的垂直和水平变化。

这里有一个OpenCV的函数可以实现这个功能。

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

当你得到这些经过滤波的图像后,可以逐列或逐行收集数据,判断哪里是边缘,并找到那个位置。

1

我建议你看看这个关于opencv的方块示例,链接在这里。这个示例使用了canny算法,然后通过寻找轮廓来返回每个方块的边。你可以修改这个代码,来找到你想要的水平和垂直线条。关于canny算法的python调用,你可以参考这个文档,它对边缘检测非常有帮助。大约一个小时后我能回家,给你一个可以用的示例,帮你实现你想要的功能。

撰写回答