как обрезать указанную c часть изображения на основе координатных полей? - PullRequest
0 голосов
/ 11 марта 2020

Я хочу обрезать свое изображение на основе координатных блоков обнаруженных объектов, один из которых с classID = 1.

Может быть несколько объектов с одинаковым идентификатором или другими классами. Моя проблема в том, что мой код возвращает только одно обрезанное изображение. Как я могу вернуть все обрезанные изображения с ClassID = 1?

У меня всего 6 классов, в которых меня интересует ClassID = 1.

  # initializing bounding boxes, confidences, and classIDs.
   boxes = []
   confidences = []
   classIDs = []

   for output in layersOutputs:
      # loop over each of the detections
      for detection in output:
         # extract the class ID and confidence 
         scores = detection[5:]
         classID = np.argmax(scores)
         confidence = scores[classID]

         # filter out weak predictions 
         if confidence > c_threshold:
            box = detection[0:4] * np.array([W, H, W, H])
            (centerX, centerY, width, height) = box.astype("int")

            #coordinates 
            x = int(centerX - (width / 2))
            y = int(centerY - (height / 2))

            # update  bounding box coordinates, confidences, classIDs
            boxes.append([x, y, int(width), int(height)])
            confidences.append(float(confidence))
            classIDs.append(classID)

   # applying non maximum suppression
   ind = cv.dnn.NMSBoxes(boxes, confidences, c_threshold, nms)

   if len(ind) > 0:
      # loop over the indexes that we want to keep
      for i in ind.flatten():
         # extract the bounding box coordinates
         (x, y) = (boxes[1][0], boxes[1][1])
         (w, h) = (boxes[1][2], boxes[1][3])



 for i in classIDs:
        if i != 1:
            continue
            # extract the bounding box coordinates
            (x, y) = (boxes[i][0], boxes[i][1])
            (w, h) = (boxes[i][2], boxes[i][3])
            # crop that part of image which contains desired object
        image = image[y:y + h, x:x + w]

        cv.imshow("Image", image)

        path = '/path to folder'
        cv.imwrite(os.path.join(path, 'PImage.jpg'), image)

        #
        cv.waitKey(0)

Отредактировано: Как вы можете видеть на этой картине много видов животных, я пытаюсь обрезать часть изображения с собаками. Я уже получил ограничивающие прямоугольники, связанные с частями собаки (это означает, что я знаю, где находится местоположение прямоугольника с собакой в ​​нем, как показано на фотографии)

Я хочу обрезать те прямоугольники, которые я указал на изображении. У собаки класс ID = 1. У меня есть кошка класса и другие животные с разными индексами.

enter image description here

Ответы [ 3 ]

0 голосов
/ 11 марта 2020

Проблема в том, что вы теряете ссылку на исходное изображение в следующей строке.

image = image[y:y + h, x:x + w]

Вместо этого вы можете создать новую переменную для каждого изображения собаки

dog_img = image[y:y + h, x:x + w]

Также пока писать, вы пишете с тем же именем, поэтому оно будет перезаписывать предыдущий экземпляр изображения, поэтому попробуйте сделать имя изображения динамическим c, например, dog1.jpg, dog2.jpg ...

    c = 0
    for i in classIDs:
        if i != 1:
            continue
            # extract the bounding box coordinates
            (x, y) = (boxes[i][0], boxes[i][1])
            (w, h) = (boxes[i][2], boxes[i][3])
            # crop that part of image which contains desired object
        dog_img = image[y:y + h, x:x + w]

        cv.imshow("Image", dog_img )

        path = '/path to folder'
        c +=1
        cv.imwrite(os.path.join(path, 'PImage'+str(c)+'.jpg'), dog_img )

        #
        cv.waitKey(0)
0 голосов
/ 11 марта 2020

Я напечатал тип (type (classID)), он говорит, что

0
<class 'numpy.int64'>
1
<class 'numpy.int64'>
1
<class 'numpy.int64'>
0
<class 'numpy.int64'>

Насколько я знаю, я могу перебирать итерируемые объекты, такие как списки, отдельные значения, такие как int64, не повторяемы.

Как я мог решить эту проблему?

0 голосов
/ 11 марта 2020

Ваш l oop неверен.

classID= [1]
for i in classID:

Здесь вы в основном говорите for i in [1]:, который обрезается только для вашего первого обнаружения. Вместо этого вы должны l oop на все обнаружения. Предполагая, что остальная часть вашего кода верна, следующие циклы повторяются по всем обнаружениям, зарегистрированным в classID, и обрезаются, только если они принадлежат к классу 1.

for i in classID:
    if i!=1:
        continue
...