Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

object (Car) Detection and segmentation

I am trying to segment cars from image that consist of only one car and an easy background like
enter image description here


enter image description here


but what I get from my implementation is this
enter image description here


and
enter image description here


respectively

but it works very easily on almost already segmented images like. enter image description here


giving results like
enter image description here


The Code I am using is

import cv2
import numpy as np

THRESH_TYPE=cv2.THRESH_BINARY_INV

def show(name,obj):
    cv2.imshow(name,obj)
    cv2.moveWindow(name, 100, 100) 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def process_end(new):
    drawing = np.zeros(o.shape,np.uint8)     # Image to draw the contours
    contours,hierarchy =cv2.findContours(new,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#find connected borders
    for cnt in contours:
        color = np.random.randint(0,255,(3)).tolist()  # Select a random color
        cv2.drawContours(drawing,[cnt],0,color,2)
    print "processing done"
    return drawing

def process(name,path):
    global o
    print "Started!!! processing "+name
    ratio=1#change according to image size
    o=cv2.imread(path+name)#open image
    print type(o)
    show("original",o)
    w,h=o.shape[1]/ratio,o.shape[0]/ratio#resize ratio for width and height
    new=cv2.resize(o,(w,h))#resize image
    #show("Resized",new)
    new=cv2.cvtColor(new,cv2.COLOR_RGB2GRAY)#grey scale image
    show("grey",new)
    cv2.imwrite("grey.jpg",new)
    new1 = cv2.GaussianBlur(new,(5,5),0)#gaussians Blurs Image
    show("blurred1",new1)
    cv2.imwrite("gblur_"+name,new1)#save image
    new2 = cv2.medianBlur(new,7)#Median Blurs Image
    show("blurred2",new1)
    cv2.imwrite("mblur_"+name,new2)#save image
    #new=cv2.equalizeHist(new,)#do image histogram equalisation to better the contrast
    #show("hist equal otsu",new)
    ##cv2.imwrite("otsu_"+name,new)#save image

    a,new=cv2.threshold(new,0,255,THRESH_TYPE | cv2.THRESH_OTSU)#OTSU thresholding
    show("otsu",new)
    cv2.imwrite("otsu_"+name,new)#save image
    return new,name



new,name=process("car9.jpg","C:\\Users\\XOR\\Desktop\\file\\")#Change the Name and path accordingly
new=cv2.Canny(new, 100,200)#canny edge detection technique
show("canny",new)
cv2.imwrite("canny_"+name,new)#save image
new=process_end(new)
show("blobed",new)
cv2.imwrite("blob_"+name,new)#save image
new=cv2.Sobel(new,-1,1,0,3,BORDER_WRAP)
show("sobel",new)
cv2.imwrite("sobel_"+name,new)#save image

I have tried the watershed algorithm (on matlab) too but it also doesn't help. I'm looking for a way to segment the first two images that gives a result similar to third one.

like image 210
xor Avatar asked Nov 30 '22 02:11

xor


2 Answers

First of all, Detection and Segmentation are two different problems. First decide which one you wanna do.

If your problem is 'Car Detection From Single Image', you can't do it by segmentation. You can segment image into parts and by using another approach (take the biggest segmented region) you can find the car in the image, but I'm sure it won't work for all images. That's why watershed algorithm didn't work. Segmentation algorithms just segments the image doesn't give you particular object/region in it. For example if you look at the image shown, it is segmented into regions, but you can't know which region is which.

image,

If you want to detect cars in images, you need to approach this problem as object detection problem. This link will provide you some information about car detection problem. It has two papers about it and a database to test approaches.

Hope it helps..

like image 158
guneykayim Avatar answered Dec 04 '22 04:12

guneykayim


For car detection I would use latern svm detector with the "Car" model:

http://docs.opencv.org/modules/objdetect/doc/latent_svm.html

like image 42
GilLevi Avatar answered Dec 04 '22 06:12

GilLevi