Как объединить 2 канала изображений JPG в градациях серого с оптическим потоком в одно изображение RGB в Python? - PullRequest
1 голос
/ 23 апреля 2019

Я делаю RGB-изображение из 2-х изображений jpg в градациях серого, соответственно для канала x, y в оптическом потоке.

выборка входных изображений и мой текущий вывод

def optical_flow(one, two, w, h):
    """
    method taken from (https://chatbotslife.com/autonomous-vehicle-speed-estimation-from-dashboard-cam-ca96c24120e4)
    """
    one_g = cv2.cvtColor(one, cv2.COLOR_RGB2GRAY)
    two_g = cv2.cvtColor(two, cv2.COLOR_RGB2GRAY)
    hsv = np.zeros((w, h, 3))
    # set saturation
    hsv[:,:,1] = cv2.cvtColor(two, cv2.COLOR_RGB2HSV)[:,:,1]
    # obtain dense optical flow paramters
    flow = cv2.calcOpticalFlowFarneback(one_g, two_g, flow=None,
                                        pyr_scale=0.5, levels=1, winsize=15,
                                        iterations=2,
                                        poly_n=5, poly_sigma=1.1, flags=0)
    # convert from cartesian to polar
    mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
    # hue corresponds to direction
    hsv[:,:,0] = ang * (180/ np.pi / 2)
    # value corresponds to magnitude
    hsv[:,:,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
    # convert HSV to int32's
    hsv = np.asarray(hsv, dtype= np.float32)
    rgb_flow = cv2.cvtColor(hsv,cv2.COLOR_HSV2RGB)
    return rgb_flow 

imgu = cv2.imread('u.jpg')
imgv = cv2.imread('v.jpg')
img = optical_flow(one, two, w, h)

Image.fromarray(imgu, 'RGB').show() // top-left one in img
Image.fromarray(imgv, 'RGB').show() // top-right one in img
Image.fromarray(img, 'RGB').show()  // bottom-left one in img

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

1 Ответ

0 голосов
/ 01 мая 2019

Оптический поток вычисляет поле вектора движения из двух последовательных кадров.В вашем случае one и two.Однако ваши входные изображения u и v не показывают последовательные кадры.Проблема здесь в том, что между изображениями нет связи, то есть нет аналогичного контента.Иногда ваше поле оптического потока flow будет иметь некоторые случайные значения.

При вычислении цветовой визуализации вашего поля оптического потока.В вашем случае канал насыщения инициализируется не правильно:

# set saturation
hsv[:,:,1] = cv2.cvtColor(two, cv2.COLOR_RGB2HSV)[:,:,1]

Установите его на 255. Более распространенным решением является установка канала значений на 255 и использование канала насыщения для кодирования величины.

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