#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)