Я новичок в 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
// У меня есть дополнительная функция, которая обрезает изображение до того, что мне нужно, и так далее, но в основном.
Шаг за шагом выглядит так, как показано в файле выше.
- Изображение -> обрезать его, нарисовав прямоугольник и сохранить -> сделать его серым
- использовать «lbp_like_method» и включите третье прикрепленное изображение.
- используйте «morph_operation», а затем используйте «analyze_boxes».
- получите коробки.
Кроме того, я попробовал сопоставление нескольких шаблонов, оно работает, но оно не распознает многие коробки, и я не знаю, как его оптимизировать.
@toyotaSupra нашел решение проблемы, которое частично работает, но он упомянул, что еще не полностью готово. Единственное, что осталось сделать, это оптимизировать метод «хитрого края», для которого я изучаю «метод OSTU».
Я оставлю эту страницу открытой, так что, надеюсь, я смогу увидеть разные подходы от умных людей в Интернете. Я обновлю этот пост для всех остальных!
Подробнее здесь: https://stackoverflow.com/questions/775 ... hem-python
Мобильная версия