Как мне найти координаты нижней красной линии - PullRequest
0 голосов
/ 19 июня 2019

enter image description here

Я пытаюсь найти координаты нижней красной линии с помощью opencv_python.

Я уже нахожу контуры и все координатыэтой красной линии.но мне нужны только координаты нижней красной линии, а не красной линии над закрытой серой областью.

def find_drawContours(path):                        
   src = cv2.imread(path)                          
   # cv2.imshow('input', src)                      
   src = cv2.GaussianBlur(src, (3,3), 0)           
   # cv2.imshow('', src)                           
   gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)    
   ret, binary = cv2.threshold(gray, 0, 255, cv2.TH
   # cv2.imshow('binary', binary)                  

   image, contours, hierachy = cv2.findContours(bin
   for i in range(len(contours)):                  
       mm = cv2.moments(contours[i])               
       m00 = mm['m00']                             
       m10 = mm['m10']                             
       m01 = mm['m01']                             
       cx = np.int(m10/m00)                        
       cy = np.int(m01/m00)                        
       (x, y), (a, b), degree = cv2.fitEllipse(cont
       cv2.circle(src, (cx, cy), 2, (0,0,255), -1, 
       cv2.drawContours(src, contours, i, (0, 0, 25
   pix_list = []                                   
   for i in range(len(contours[0])):               
       a = contours[0][i]                          
       pix_list.append(a[0])                       
   pix_array = np.array(pix_list)                  
   print(min(pix_array[...,0]))                    
   # cv2.imwrite('img/res.contour.jpg',src)  

enter image description here

1 Ответ

0 голосов
/ 20 июня 2019

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

  1. Сканирование вдоль каждого столбца (ось x), и если в этом столбце есть только две красные точки , найдите точку с более высокой координатой y и добавьте ее в список points_on_lower_line[] ,
  2. После того как вы отсканировали все столбцы изображения, points_on_lower_line будет иметь все точки, которые принадлежат нижней красной линии. Вы можете в дальнейшем это убрать, убедившись, что все точки 4-соединены.

Поскольку вы уже сохраняете точки контура, вам даже не нужно рисовать контур и сканировать изображение на наличие красных пикселей. Вы можете отсортировать список контуров по x-координате точек и отфильтровать список, проверив, имеют ли только две точки одинаковую x-координату, и сохранив нижнюю точку (более высокая y-координата). Результирующий список будет содержать точки нижней красной линии.

Вы также можете использовать наборы, чтобы избежать сортировки точек контура:

contour_points[] #list of contour points
lower_line_point_list[] #list of points belonging to the lower red line

#get list of sets where each set is formed by points have the same x-coordinate
set_by_x = form_sets_by_x_coordinate(contour_points)
for set in set_by_x:
   if len(set) == 2:
       p = lower_point_in_set(set)
       lower_line_point_list.append(p)
clean_up(lower_line_point_list) #check for 4-connectivity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...