使用python-opencv的水平和垂直边缘轮廓
我正在尝试在一张图片中检测车辆(实际上是视频中的一系列画面)。我对opencv和python还很陌生,并且是在Windows 7系统下工作。
有没有办法获取图片的水平边缘和垂直边缘,然后把这些结果合并成相应的向量呢?
有没有现成的python代码或函数可以用来实现这个?
我看过这个和这个,但是还是不知道该怎么做。你可以使用下面的图片来做说明。
编辑
我受到了一篇论文中提出的想法的启发(如果你无法访问,抱歉)。
Betke, M.; Haritaoglu, E. & Davis, L. S. 实时多车辆检测与跟踪来自移动车辆的机器视觉与应用,Springer-Verlag, 2000, 12, 69-83
3 个回答
通常来说,单纯用几何方法来检测物体效果并不好,因为你假设的外观模型很容易被遮挡、噪声或方向变化打破。
我认为,机器学习的方法通常效果要好得多,可能会为你的问题提供更稳健的解决方案。既然你在使用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)
先了解一下Sobel滤波器。
http://en.wikipedia.org/wiki/Sobel_operator
简单来说,Sobel滤波器可以帮助我们找到每个像素点的垂直和水平变化。
这里有一个OpenCV的函数可以实现这个功能。
http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=sobel#sobel
当你得到这些经过滤波的图像后,可以逐列或逐行收集数据,判断哪里是边缘,并找到那个位置。