Python - Извлечение и потоковая передача видеокадров с помощью колбы - PullRequest
0 голосов
/ 22 января 2019

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

app = Flask(__name__)

def gen():
    cap = cv2.VideoCapture('a.mp4')
    while(True):
        img = cap.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        edge = cv2.Canny(gray, 10, 200, apertureSize=3)
        vis = img.copy()
        vis /=2
        vis[edge != 0] = (0, 255, 0)
        merge = np.concatenate((img, vis), axis=1)
        cv2.imwrite('out.png', merge)
        frame = open('out.png', 'rb').read()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')


@app.route('/')
def video_feed():
   return Response(gen(),
                mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
      app.run(host='0.0.0.0', debug=True)

Спасибо.

1 Ответ

0 голосов
/ 22 января 2019

В вашем коде было две проблемы:

Первый был в этой строке:

img = cap.read()

Это потому, что cv2.VideoCapture(src).read() возвращает 2 аргумента. Первый - логическое значение, True, когда изображение существует, или False, если его нет. Второй аргумент - текущий кадр. Итак, вы должны заменить свою строку чем-то вроде: ret, img = cap.read() или img = cap.read()[1]

Также эта строка вызвала TypeError:

 vis /=2

Это происходит, потому что нечетные целые числа после деления на 2 получают тип с плавающей запятой. Для успешного запуска вашего детектора углов вы должны импортировать библиотеку numpy и заменить эту строку другой, которая не преобразует элементы массива изображений в float:

vis = numpy.trunc(vis / 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...