Как читать raw png из массива в python opencv?

Я передаю изображение png с моего iPhone на мой MacBook по tcp. Код MacBook от http://docs.python.org/library/socketserver.html#requesthandler-objects. Как можно преобразовать изображение для использования с OpenCV? Png был выбран, потому что они эффективны, но могут использоваться другие форматы.

Я написал тестовую программу, которая читает rawImage из файла, но не уверен, как его преобразовать:

# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
f.close()

# Not sure how to convert rawImage
npImage = np.array(rawImage)
matImage = cv2.imdecode(rawImage, 1)

#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0)

5 ответов


другой путь,

также в случае чтения фактического файла это будет работать для пути unicode (проверено в windows)
with open(image_full_path, 'rb') as img_stream:
    file_bytes = numpy.asarray(bytearray(img_stream.read()), dtype=numpy.uint8)
    img_data_ndarray = cv2.imdecode(file_bytes, cv2.CV_LOAD_IMAGE_UNCHANGED)
    img_data_cvmat = cv.fromarray(img_data_ndarray) #  convert to old cvmat if needed

@Andy Rosenblum работает, и это может быть лучшим решением, если использовать устаревший CV python API (против cv2).

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

  1. он совместим с более новым OpenCV python API (cv2 против cv). Это решение тестируется под opencv 3.0 и python 3.0. Я верю только в тривиальность. для opencv 2 потребуются изменения.x и / или python 2.7 x.
  2. меньше импорта. Все это можно сделать с помощью numpy и opencv напрямую, без необходимости в StringIO и PIL.

вот как я создаю изображение opencv, декодированное непосредственно из файлового объекта или из байтового буфера, считанного из файлового объекта.

import cv2
import numpy as np

#read the data from the file
with open(somefile, 'rb') as infile:
     buf = infile.read()

#use numpy to construct an array from the bytes
x = np.fromstring(buf, dtype='uint8')

#decode the array into an image
img = cv2.imdecode(x, cv2.IMREAD_UNCHANGED)

#show it
cv2.imshow("some window", img)
cv2.waitKey(0)

обратите внимание, что в opencv 3.0 соглашение об именах для различных констант/флагов изменилось, поэтому при использовании opencv 2.x, вам нужно будет изменить cv2 флаг.IMREAD_UNCHANGED. Этот пример кода также предполагает, что вы загружаете стандартный 8-битный образ, но если нет, вы можете играть с dtype='... флаг в НП.fromstring.


Я понял это:

# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
f.close()

# Convert rawImage to Mat
pilImage = Image.open(StringIO(rawImage));
npImage = np.array(pilImage)
matImage = cv.fromarray(npImage)

#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0) 

(ваш вопрос, кажется, помечен objective-c, но вы спрашиваете Python, и ваш пример, поэтому я буду использовать это.) Мой первый пост в Stack Overflow!

ЧВ.Метод LoadImageM кажется тем, что вы ищете.

http://opencv.willowgarage.com/documentation/python/reading_and_writing_images_and_video.html

пример использования: http://opencv.willowgarage.com/wiki/PythonInterface/

LoadImage (filename, iscolor=CV_LOAD_IMAGE_COLOR) → нет

Loads an image from a file as an IplImage.
Parameters:   

    filename (str) – Name of file to be loaded.
    iscolor (int) –

    Specific color type of the loaded image:
        CV_LOAD_IMAGE_COLOR the loaded image is forced to be a 3-channel color image
        CV_LOAD_IMAGE_GRAYSCALE the loaded image is forced to be grayscale
        CV_LOAD_IMAGE_UNCHANGED the loaded image will be loaded as is.

функция cvLoadImage загружает изображение из указанного файла и возвращает указатель на загруженное изображение. В настоящее время следующий файл поддерживаются форматы:

Windows bitmaps - BMP, DIB
JPEG files - JPEG, JPG, JPE
Portable Network Graphics - PNG
Portable image format - PBM, PGM, PPM
Sun rasters - SR, RAS
TIFF files - TIFF, TIF

обратите внимание, что в текущей реализации альфа-канал, если таковой имеется, сорвали с выходного изображения, например, 4-канала RGBA-изображения. будет загружен как RGB.


когда вам нужно загрузить из файла, это простое решение выполняет эту работу (проверено с помощью opencv-python-3.2.0.6):

import cv2

img = cv2.imread(somefile)