Генерация движущейся 2D синусоидальной фигуры - PullRequest
0 голосов
/ 20 февраля 2019

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

2-D sinusoidal Patter

Я написал это следующим образом.Видеофайл создан без ошибок, но файл не открывается ни в одном видеопроигрывателе

        import cv2
        import numpy as np
        from cv2 import VideoWriter, VideoWriter_fourcc

        video = VideoWriter('_sine_pattern_gen_'+str(60)+'_fps.avi', VideoWriter_fourcc(*'MP42'), 60, (346, 260))

        x = np.arange(346)  # generate 1-D sine wave of required period 
        y = np.sin(2 * np.pi * x / 20) 

        y += max(y) # offset sine wave by the max value to go out of negative range of sine 

        frame = np.array([[y[j] for j in range(346)] for i in range(260)], dtype='uint8') # create 2-D array of sine-wave

        for _ in range(0, 346):
            video.write(frame)
            shifted_frame =  np.roll(frame, 2, axis=1) # roll the columns of the sine wave to get moving effect
            frame = shifted_frame 

        cv2.destroyAllWindows()
        video.release()

1 Ответ

0 голосов
/ 20 февраля 2019

Эта проблема связана с использованием одноканального изображения в градациях серого, когда VideoWriter ожидает цветное изображение.Это можно исправить, используя флаг isColor=False.

. Кроме того, поскольку изображения имеют тип uint8 и y только до 2, это будет выглядеть как черное видео вместо изображения, которое вышоу.Вы можете масштабировать y, чтобы перейти к полному диапазону 0-255, умножив y[j]*127.Должно работать следующее:

import cv2
import numpy as np
from cv2 import VideoWriter, VideoWriter_fourcc

fname = '_sine_pattern_gen_'+str(60)+'_fps.avi'
video = VideoWriter(fname, VideoWriter_fourcc(*'MP42'), 60, (346, 260), isColor=False)

x = np.arange(346)  # generate 1-D sine wave of required period 
y = np.sin(2 * np.pi * x / 20)

y += max(y) # offset sine wave by the max value to go out of negative range of sine 

frame = np.array([[y[j]*127 for j in range(346)] for i in range(260)], dtype=np.uint8) # create 2-D array of sine-wave

for _ in range(0, 346):
    video.write(frame)
    shifted_frame =  np.roll(frame, 2, axis=1) # roll the columns of the sine wave to get moving effect
    frame = shifted_frame 

video.release()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...