Stat-R
Stat-R

Reputation: 5270

Horizontal and vertical edge profiles using python-opencv

I am trying to detect a vehicle in an image (actually a sequence of frames in a video). I am new to opencv and python and work under windows 7.

Is there a way to get horizontal edges and vertical edges of an image and then sum up the resultant images into respective vectors?

Is there a python code or function available for this.

I looked at this and this but would not get a clue how to do it. You may use the following image for illustration.

EDIT

I was inspired by the idea presented in the following paper (sorry if you do not have access).

Betke, M.; Haritaoglu, E. & Davis, L. S. Real-time multiple vehicle detection and tracking from a moving vehicle Machine Vision and Applications, Springer-Verlag, 2000, 12, 69-83

https://i.sstatic.net/y5MXl.jpg

Upvotes: 3

Views: 4120

Answers (3)

Max Allan
Max Allan

Reputation: 2395

Typically geometrical approaches to object detection are not hugely successful as the appearance model you assume can quite easily be violated by occlusion, noise or orientation changes.

Machine learning approaches typically work much better in my opinion and would probably provide a more robust solution to your problem. Since you appear to be working with OpenCV you could take a look at Casacade Classifiers for which OpenCV provides a Haar wavelet and a local binary pattern feature based classifiers.

The link I have provided is to a tutorial with very complete steps explaining how to create a classifier with several prewritten utilities. Basically you will create a directory with 'positive' images of cars and a directory with 'negative' images of typical backgrounds. A utiltiy opencv_createsamples can be used to create training images warped to simulate different orientations and average intensities from a small set of images. You then use the utility opencv_traincascade setting a few command line parameters to select different training options outputting a trained classifier for you.

Detection can be performed using either the C++ or the Python interface with this trained classifier. For instance, using Python you can load the classifier and perform detection on an image getting back a selection of bounding rectangles using:

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

Upvotes: 1

Krish
Krish

Reputation: 1827

Do some reading on Sobel filters.

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

You can basically get vertical and horizontal gradients at each pixel.

Here is the OpenCV function for it.

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

Once you get this filtered images then you can collect statistics column/row wise and decide if its an edge and get that location.

Upvotes: 1

a sandwhich
a sandwhich

Reputation: 4448

I would take a look at the squares example for opencv, posted here. It uses canny and then does a contour find to return the sides of each square. You should be able to modify this code to get the horizontal and vertical lines you are looking for. Here is a link to the documentation for the python call of canny. It is rather helpful for all around edge detection. In about an hour I can get home and give you a working example of what you are wanting.

Upvotes: 1

Related Questions