opencv показывает визуализированное изображение с ограничивающими рамками и метками

#python #opencv

#python #opencv

Вопрос:

Приведенный ниже код способен обнаруживать объекты без проблем, однако ближе к концу есть строка «cv2.imshow(«demo», img)»

Я ожидал бы, что в этом окне будет отображаться изображение с сгенерированными ограничивающими рамками и метками, но все, что я получаю, это пустое окно. Изначально я взял этот код из нескольких примеров в Интернете, поэтому я немного запутался в том, как расположить эту строку или почему она не генерирует изображение.

 import cv2
import numpy as np


def take_pic(output_filename):
    import os
    capture_img="ffmpeg -y -rtsp_transport udp -i rtsp://mycamera:apassword@172.16.66.106/live -vframes 1 "   output_filename



net = cv2.dnn.readNet("yolov3.weights", "./darknet/cfg/yolov3.cfg")
classes = []
with open("./darknet/data/coco.names", "r") as f:
    classes = [line.strip() for line in f.readlines()]
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
colors = np.random.uniform(0, 255, size=(len(classes), 3))



output_filename = "/tmp/camera.jpeg"
cap = cv2.imread(output_filename)
j = 0




if j==0:
        cv2.namedWindow("demo", cv2.WINDOW_AUTOSIZE)

        while True:
                take_pic(output_filename)
                cap = cv2.imread(source)
                j = j   1
                print("j= "   str(j))
                img = cap
                img = cv2.resize(img, None, fx=0.4, fy=0.4)
                height, width, channels = img.shape

                blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
                net.setInput(blob)
                outs = net.forward(output_layers)

                class_ids = []
                confidences = []
                boxes = []
                for out in outs:
                    for detection in out:
                        scores = detection[5:]
                        class_id = np.argmax(scores)
                        confidence = scores[class_id]
                        if confidence > 0.5:
                            # Object detected
                            center_x = int(detection[0] * width)
                            center_y = int(detection[1] * height)
                            print(str(center_x) " " str(center_y))
                            w = int(detection[2] * width)
                            h = int(detection[3] * height)
                            # Rectangle coordinates
                            x = int(center_x - w / 2)
                            y = int(center_y - h / 2)
                            boxes.append([x, y, w, h])
                            confidences.append(float(confidence))
                            class_ids.append(class_id)

                            indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

                            font = cv2.FONT_HERSHEY_PLAIN
                            for i in range(len(boxes)):
                                if i in indexes:
                                    x, y, w, h = boxes[i]
                                    label = str(classes[class_ids[i]])
                                    print("label :" str(label) "x: " str(x) " y: "   str(y))
                                    color = colors[i]
                                    cv2.rectangle(img, (x, y), (x   w, y   h), color, 2)
                                    cv2.putText(img, label, (x, y   30), font, 3, color, 3)
                cv2.imshow("demo", img)

        else:
            print("camera open failed")

cv2.destroyAllWindows()

  

Ответ №1:

В opencv imshow требуется, чтобы для отображения изображения a сопровождался waitKey методом.

Вставьте что-то похожее на это в конце вашего цикла, после вызова cv2.imshow :

 if cv2.waitKey(0) == ord('q'):
    print('exitting loop')
    break
  

Комментарии:

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

2. Примером была @SarahCharnette cv2.waitKey(0) . Я не понимал, что вы хотите воспроизводить его непрерывно. Установите для него значение 1 или любое другое положительное значение int. Аргумент представляет время ожидания в миллисекундах, но 0 означает ждать бесконечно

3.opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/….

Ответ №2:

Если во время imshow метода изображение отображается пустым, то вам может потребоваться умножить пиксели на 255. Например, в Matlab изображения нормализованы в диапазоне от 0 до 1.

Попробуйте:

 cv2.imshow("demo", img * 255)
cv2.waitKey(0)
  

Комментарии:

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

2. @SarahCharnette попробуйте cv2.waitKey(1)