Не имея образца изображения для тестирования, я могу просто дать вам теоретический способ действий.
Вы можете просто использовать OTSU бинаризацию для исходного изображения и получитьчерно-белое изображение, где каждое яйцо представляет собой белую каплю на черном фоне.
(необязательно: запустите некоторые морфологические операции, такие как эрозия, вскрытие и т.д., чтобы отделить соприкасающиеся яйца)
На этом изображении, вы можете использовать cv::findContours
, чтобы извлечь границы каждого отдельного яйца.
Теперь на каждой границе вы можете использовать cv::minAreaRect
, чтобы найти ограничивающую рамкукаждого яйца.
Отфильтруйте, используя порог в области ограничивающего прямоугольника, ложные срабатывания.
Теперь у вас есть массив повернутых ограничивающих прямоугольников, которые можно использовать для извлеченияте же регионы в исходном изображении и подают их в качестве входных данных в вашу обученную сеть (а так как вы используете tenorflow, вы можете создать пакет изображений и передать весь пакет в качестве входных данных в вашу сеть, чтобы выполнить оценкупараллельно)
Вот скетч в python ("image.png" - это изображение вашего блока lego):
import cv2
import numpy as np
def main():
img = cv2.imread("image.png", 0)
threshold, binary = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
cv2.imshow("bin",binary)
im2, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
draw = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
#cv2.drawContours(img, contours, 0, (255,0, 0), 2)
boxes = []
for contour in contours:
#cv2.drawContours(img, [contour], 0, (0,255,0), 2)
area = cv2.contourArea(contour)
# heuristic: ignore small objects and noise
if area < 50:
continue
box = cv2.boundingRect(contour)
boxes.append(box)
feed_to_tensorflow = []
for box in boxes:
#extract roi
x, y, width, height = box
roi = img[y:y+height, x:x+width]
feed_to_tensorflow.append(roi)
cv2.imshow("box", feed_to_tensorflow[-1])
cv2.waitKey()
cv2.imshow("img", img)
cv2.waitKey()
if __name__ == "__main__":
main()