2015-02-24 3 views
0

Я прочитал эту картину с помощью OpenCV:обнаружить 4 интересных пикселей

enter image description here

Я обнаружить границы объектов внутри него и отобразить изображение:

enter image description here

Вот мой код :

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 


im=cv2.imread('db/4.jpg') 
#mask=np.zeros(img.shape[:2],np.uint8) 
imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
ret,thresh=cv2.threshold(imgray,242,245,235) 
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) 

cv2.drawContours(im,contours,-1,(0,255,0),3) 
cv2.imshow("GL",im) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Что я хочу делать:

Я хочу иметь координаты 4 точек, принадлежащих к одному из контуров и:

  • Первый шкаф от оси X
  • Второй один является Farest из X ось
  • Третья один шкаф от оси Y
  • Четвертого один является Farest от оси Y

Обрати внимание, что п Переменная множителя в моем коде может меняться в зависимости от изображения, которое я читаю.

+0

Что-то вроде [boundingRect] (http://docs.opencv.org /modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#boundingrect)? – beaker

+0

@beaker No. Вы видите переменную 'contours' в моей программе? все зеленые пиксели (контуры объектов) сохраняются там как список массивов. Я хочу посмотреть в этом списке массивов для 4 пикселей, о которых я упоминал. –

+0

Итак, вы хотите, чтобы ограничивающая рамка всех контуров была сгруппирована вместе? Как глобальный min-X, глобальный max-X? – beaker

ответ

2

Вы можете сложить все контуры в один массив green и поиск минимального/максимального значения х/у:

green = np.vstack(contours).reshape((-1, 2)) 
print "Min X:", green[np.where(green[:, 0] == green[:, 0].min()), :] 
print "Man X:", green[np.where(green[:, 0] == green[:, 0].max()), :] 
print "Min Y:", green[np.where(green[:, 1] == green[:, 1].min()), :] 
print "Man Y:", green[np.where(green[:, 1] == green[:, 1].max()), :] 

Обратите внимание, что, особенно для прямоугольника, есть несколько пикселей, отвечающие вашим требованиям, потому что они имеют равное расстояние от оси x или y.

Вот визуализация "четырех" пикселей:

enter image description here

Производящая PyLab код:

pl.imshow(im) 
pl.gca().autoscale(False) 
minX = np.where(green[:, 0] == green[:, 0].min()) 
maxX = np.where(green[:, 0] == green[:, 0].max()) 
minY = np.where(green[:, 1] == green[:, 1].min()) 
maxY = np.where(green[:, 1] == green[:, 1].max()) 
pl.plot(green[minX, 0], green[minX, 1], 'ro') 
pl.plot(green[maxX, 0], green[maxX, 1], 'go') 
pl.plot(green[minY, 0], green[minY, 1], 'bo') 
pl.plot(green[maxY, 0], green[maxY, 1], 'yo') 
+0

Ваше решение отлично работает. Огромное спасибо. Последний вопрос, если я могу: Что делать, если я хочу получить только один пиксель для max Y, потому что, как вы сказали, линия этого прямоугольника имеет много пикселей, которые удовлетворяют потребность? Вы ответили на мой вопрос, я знаю, что не имею права спрашивать об этом, но это звучит слишком легко для вас. –

+1

@ Kabyle: Не стоит беспокоиться. Вы можете добавить '[0] [0]' после команд 'where', чтобы получить только первые индексы. Таким образом, вы всегда используете только одну точку контура. – Falko

+0

Большое вам спасибо, сэр. –

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