Постановка проблемы и справочная информация:
РЕДАКТИРОВАТЬ : Ограничения: красный цвет на фланце меняется со временем, поэтому я не пытаюсь использовать цветпризнание, чтобы идентифицировать мой объект в этот момент, если он не может быть надежным.Кроме того, союзник внешнего освещения может быть фактором, так как это будет в наружной области в будущем.
У меня есть камера RGB-Depth, и я могу снимать эту сцену.Где каждый пиксель (x, y) имеет значение глубины.
Применение фильтра градиентной величины к карте глубины, связанной с моим изображением, явозможность получить следующую карту краев.
Величинам градиента присваивается значение 0, если они имеют величину, которая не равна нулю.Черный (255) предназначен для значений амплитуд, связанных с 0 (однородная глубина или плоская поверхность).
Из этой карты краев я набрал края, чтобы было проще подобрать контуры.
Затем я нашел контуры на изображении и попытался построить только 5 самых больших контуров.
ПРОБЛЕМА
Есть ли способ надежно найти контуры, связанные с моими объектами (красныйкоробка и металлический крепеж) а потом найти их геометрический центроид?Я продолжаю сталкиваться с проблемой, заключающейся в том, что я могу найти контуры на изображении, но у меня нет возможности выборочно проверять контуры, которые являются моими объектами, а не шумом.
Я предоставил изображение, которое я использовал для изображенияобработки, но по какой-то причине OpenCV сохраняет изображение как черное изображение , а когда вы читаете его с помощью ...
gray = cv2.imread('GRAYTEST.jpeg', cv2.IMREAD_GRAYSCALE)
, оно выглядит синим, а не двоичнымчерно-белое изображение, как я показываю.Извините за это.
Вот изображение:
Извините, я не знаю, почему оно сохранилось просто как черное изображение, но если выпрочитайте его в OpenCV, он должен отображаться с теми же строками, что и график «величины градиентов».
МОЙ КОД
gray = cv2.imread('GRAYTEST.jpeg', cv2.IMREAD_GRAYSCALE)
plt.imshow(gray)
plt.title('gray start image')
plt.show()
blurred = cv2.bilateralFilter(gray, 8, 25, 25) # blurr image while preserving edges
kernel = np.ones((3, 3), np.uint8) # define a kernel (block) to apply filters to
dialated = cv2.dilate(blurred, kernel, iterations=1)
plt.title('dialated')
plt.imshow(dialated)
plt.show()
#Just performs a canny edge dectection on an image
edges_empty = self.Commons.CannyE_Auto(dialated) # Canny edge image for some sigma
#makes an empty image using the same diemensions of the given image
empty2 = self.Commons.make_empty(gray)
_, contours, _ = cv2.findContours(edges_empty, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(contours, key=cv2.contourArea, reverse=True)[:5] # get largest five contour area
cv2.drawContours(empty2, cnts, -1, (255, 0, 0), thickness=1)
plt.title('contours')
plt.imshow(empty2)
plt.show()