2014-10-25 3 views
2

Я вынул лазер кривого этого изображения:лазерное обнаружение изогнуты линии с помощью OpenCV и питона

original image http://img4.hostingpics.net/thumbs/mini_367400simple21.png curve http://img4.hostingpics.net/thumbs/mini_646613curve.png

И теперь я пытаюсь получить набор точек (больше, тем лучше), которые находятся в середине этой кривой. Я попытался разбить изображение на вертикальные полосы, а затем обнаружить центр тяжести. Но он не вычисляет много очков, и это совсем не удовлетворительно!

img = cv2.Canny(img,50,150,apertureSize = 3) 
sub = 100 
step=int(img.shape[1]/sub) 
centroid=[] 
for i in range(sub): 
    x0= i*step 
    x1=(i+1)*step-1 
    temp = img[:,x0:x1] 
    hierarchy,contours,_ = cv2.findContours(temp, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
    if contours <> []: 
     for i in contours :  
      M = cv2.moments(i) 
      if M['m00'] <> 0: 
      centroid.append((x0+int(M['m10']/M['m00']),(int(M['m01']/M['m00'])))) 

Я также попытался cv2.fitLine(), но это было не удовлетворителен. Как я могу эффективно определить точки в середине этой кривой? С уважением.

+0

Описание и сценарий MATLAB для 3D-сканера, как вы хотите (я полагаю). http://www.instructables.com/id/3-D-Laser-Scanner/ –

+0

Спасибо, но я не использую точно такой же процесс. Я хотел бы просто найти что-то вроде среднего для этой густой красной кривой. Есть ли способ сделать это? – Chr35

ответ

0

Я думаю, вы получаете меньше очков из-за следующих двух причин:

  • с использованием детектора края: в зависимости от пороговых значений, иногда ребра могут не обоснованно представляют собой кривую
  • дискретизации изображения с помощью большой шаг

Попробуйте вместо этого вместо этого.

# threshold the image using a threshold value 0 
ret, bw = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY) 
# find contours of the binarized image 
contours, heirarchy = cv2.findContours(bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
# curves 
curves = np.zeros((img.shape[0], img.shape[1], 3), np.uint8) 

for i in range(len(contours)): 
    # for each contour, draw the filled contour 
    draw = np.zeros((img.shape[0], img.shape[1]), np.uint8) 
    cv2.drawContours(draw, contours, i, (255,255,255), -1) 
    # for each column, calculate the centroid 
    for col in range(draw.shape[1]): 
     M = cv2.moments(draw[:, col]) 
     if M['m00'] != 0: 
      x = col 
      y = int(M['m01']/M['m00']) 
      curves[y, x, :] = (0, 0, 255) 

я кривой, как это:

enter image description here

Вы также можете использовать расстояние преобразования, а затем получить строку, связанную с максимальным значением расстояния для каждого столбца отдельных контуров.

+0

На самом деле, я понял, что нет необходимости вычислять контуры. Поэтому для ускорения процесса я сохранил только часть вычисления центра тяжести (по столбцу) кода (я получаю 0,05 вместо 1,47). Благодаря ! – Chr35

Смежные вопросы