Как использовать OpenCV для распознавания ящиков и их подсчета (python)?Python

Программы на Python
Ответить
Anonymous
 Как использовать OpenCV для распознавания ящиков и их подсчета (python)?

Сообщение Anonymous »

(отказ от ответственности за большое количество картинок, я не знаю, как еще это объяснить)
Я новичок в OpenCV и обработке изображений в целом. Я пытаюсь создать программу-счетчик, которая считает пачку картонных сигарет, но теряюсь.
Я пробовал много разных методов и просмотрел много руководств, но не могу исправить их так, как мне нужно. Я некоторое время исследовал и нашел аналогичный пост, в котором требовалось посчитать свайную металлическую трубу, и кто-то в комментариях предложил использовать что-то под названием local-binary-pattern, которое выполняет локальное сравнение интенсивностей пикселей с использованием изображения в оттенках серого, и создать это для примера. Модуль «analyze_boxes» анализирует его, чтобы найти счетчики, и рисует границу блока для его визуализации.

Код: Выделить всё

def morph_operation(matinput):
kernel =  cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))

morph = cv2.erode(matinput,kernel,iterations=1)
morph = cv2.dilate(morph,kernel,iterations=2)
morph = cv2.erode(matinput,kernel,iterations=1)
morph = cv2.dilate(morph,kernel,iterations=1)

return morph

Код: Выделить всё

1. matinput- gray scale input matrix
2. width_radius, height_radius - radius of local neighborhood around each pixel.
3. stren - level of intensity
4. off - offset

def lbp_like_method(matinput, width_radius, height_radius, stren, off):
height, width = np.shape(matinput)
matdst = np.zeros_like(matinput)

for y in range(height):
y_min = max(0, y - height_radius)
y_max = min(height, y + height_radius + 1)

for x in range(width):
x_min = max(0, x - width_radius)
x_max = min(width, x + width_radius + 1)

roi = matinput[y_min:y_max, x_min:x_max]
center = matinput[y, x]

valid_cells = roi[roi > center + off]
total = len(valid_cells)

if total > stren * (2 * height_radius + 2 * width_radius):
matdst[y, x] = 255

return matdst

Код: Выделить всё

def analyze_boxes(matblobs, display_frame, size_threshold=200):
blobs, _ = cv2.findContours(matblobs, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
valid_boxes = []
wid = display_frame.shape[0]
hei = display_frame.shape[1]
for i, blob in enumerate(blobs):
b_rect = cv2.boundingRect(blob)

(rx, ry, rw, rh) = b_rect

# Additional criteria for boxes can be added here if needed

# Check if the area of the bounding rectangle is above the size threshold
if (rw * rh > size_threshold) and ( rw * rh < int(wid/3 * hei/3)):
valid_boxes.append(b_rect)

if valid_boxes:
print("Number of Large Boxes: ", len(valid_boxes))

for i, b_rect in enumerate(valid_boxes):
# Draw filled rectangles using cv2.rectangle
cv2.rectangle(display_frame, (b_rect[0], b_rect[1]), (b_rect[0] + b_rect[2], b_rect[1] + b_rect[3]), (0, 255, 255), thickness=2)
size = b_rect[2] * b_rect[3]

cv2.imshow("display_frame_in", display_frame)

return valid_boxes

Я прикреплю весь соответствующий код с помощью pastebin.
// У меня есть дополнительная функция, которая обрезает изображение до того, что мне нужно, и так далее, но в основном.
Шаг за шагом выглядит так, как показано в файле выше.
  • Изображение -> обрезать его, нарисовав прямоугольник и сохранить -> сделать его серым
  • использовать «lbp_like_method» и включите третье прикрепленное изображение.
  • используйте «morph_operation», а затем используйте «analyze_boxes».
  • получите коробки.
Теперь основная проблема. Я не знаю, как сделать так, чтобы коробки совпадали. Как мне действовать? Как вы думаете, это лучший подход? Не усложняю ли я проблему из-за недостатка знаний?
Кроме того, я попробовал сопоставление нескольких шаблонов, оно работает, но оно не распознает многие коробки, и я не знаю, как его оптимизировать.
@toyotaSupra нашел решение проблемы, которое частично работает, но он упомянул, что еще не полностью готово. Единственное, что осталось сделать, это оптимизировать метод «хитрого края», для которого я изучаю «метод OSTU».
Я оставлю эту страницу открытой, так что, надеюсь, я смогу увидеть разные подходы от умных людей в Интернете. Я обновлю этот пост для всех остальных!


Подробнее здесь: https://stackoverflow.com/questions/775 ... hem-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»