2015-01-18 3 views
1

Я пытаюсь прочитать файл .flo в виде изображения с двумя символами 2Channels.Чтение файлов middlebury 'flow' с помощью python (массив байтов и numpy)

Формат описан следующим образом:

".flo" file format used for optical flow evaluation 

Stores 2-band float image for horizontal (u) and vertical (v) flow components. 
Floats are stored in little-endian order. 
A flow value is considered "unknown" if either |u| or |v| is greater than 1e9. 

bytes contents 

0-3  tag: "PIEH" in ASCII, which in little endian happens to be the float 202021.25 
     (just a sanity check that floats are represented correctly) 
4-7  width as an integer 
8-11 height as an integer 
12-end data (width*height*2*4 bytes total) 
     the float values for u and v, interleaved, in row order, i.e., 
     u[row0,col0], v[row0,col0], u[row0,col1], v[row0,col1], ... 

(Отрывок из этого readme)

Вот мой код, но я вроде застрял, я не знаю, как читать файл как 2D-массив с двумя каналами.

import numpy as np 
import os 

# test.flo, 512*512 optical flow file 

f = open('test.flo', 'rb') 
f.seek(11, os.SEEK_SET) # skip header bytes 


data_array = np.fromfile(f, np.float16) 
data_2D = np.resize(data_array, (512, 512)) 

Возможно, кто-то знает, как это сделать?

+0

хорошо, формат описан в файле README вы связаны, и образец кода C++ для чтения '.flo' файлов [здесь] (http://vision.middlebury.edu/flow/code/flow- code/flowIO.cpp) - подробнее см. функцию ReadFlowFile() '(строка 46). Перевод не должен быть слишком ужасным для кого-то с небольшим знанием C/C++ (к сожалению, это не я ...) – MattDMo

+0

Кроме того, если вы загрузите ['flow-code-matlab.zip'] (http: //vision.middlebury.edu/flow/code/flow-code-matlab.zip), вы можете найти 'readFlowFile.m', который имеет тот же код в Matlab, если вы более свободно говорите об этом. – MattDMo

+0

привет, спасибо за комментарии, я не так свободно владею C++ или mathlab, но я попробую. На самом деле я пытаюсь найти решение numpy, чтобы избежать стиля C++ для цикла, который будет довольно медленным в python. –

ответ

6

Попробуйте это. Я тестировал его в одном файле .flo.

import numpy as np 
import os 
import sys 

# WARNING: this will work on little-endian architectures (eg Intel x86) only! 
if '__main__' == __name__: 
    if len(sys.argv) > 1: 
     with open(sys.argv[1], 'rb') as f: 
      magic = np.fromfile(f, np.float32, count=1) 
      if 202021.25 != magic: 
       print 'Magic number incorrect. Invalid .flo file' 
      else: 
       w = np.fromfile(f, np.int32, count=1) 
       h = np.fromfile(f, np.int32, count=1) 
       print 'Reading %d x %d flo file' % (w, h) 
       data = np.fromfile(f, np.float32, count=2*w*h) 
       # Reshape data into 3D array (columns, rows, bands) 
       data2D = np.resize(data, (w, h, 2)) 
    else: 
     print 'Specify a .flo file on the command line.' 
+0

Спасибо! Он работает отлично. Я закончил рабочим решением, но он был довольно грязным; укажите w & h, прочитайте весь файл и удалите заголовок ... ваш способ действительно умный. Еще раз спасибо :) –

+1

Flip 'w' и' h' in '(w, h, 2)' -> '(h, w 2)', если вы хотите просмотреть его с помощью чего-то вроде Matplotlib. – BeRecursive

+0

не могли бы вы дать код C++ для этого. Я хотел бы сравнить два файла (оптический поток Sintel dataset) и получить оценку алгоритмов. Я хочу получить «EPE все EPE соответствует EPE непревзойденный результат d0-10 d10-60 d60-140 s0-10 s10-40 s40 +» оптического потока из набора данных «http://sintel.is.tue.mpg.de/results». Я использовал OpenCV 3, VC++ 2013, Win 7 64bit. и мне нужен пример кода для получения этих результатов. –

4

Ответы bsa не работают для python 3.5 и далее. Небольшая модификация, показанная ниже, например. np.fromfile (f, np.int32, count = 1) [0], будет.

import numpy as np 
import os 
import sys 

# WARNING: this will work on little-endian architectures (eg Intel x86) only! 
if '__main__' == __name__: 
    if len(sys.argv) > 1: 
     with open(sys.argv[1], 'rb') as f: 
      magic = np.fromfile(f, np.float32, count=1) 
      if 202021.25 != magic: 
       print 'Magic number incorrect. Invalid .flo file' 
      else: 
       w = np.fromfile(f, np.int32, count=1)[0] 
       h = np.fromfile(f, np.int32, count=1)[0] 
       print 'Reading %d x %d flo file' % (w, h) 
       data = np.fromfile(f, np.float32, count=2*w*h) 
       # Reshape data into 3D array (columns, rows, bands) 
       data2D = np.resize(data, (h, w, 2)) 
    else: 
     print 'Specify a .flo file on the command line.'