Как читать 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).
однако, поскольку этот вопрос одинаково интересен для пользователей последних версий, я предлагаю следующее решение. Приведенный ниже пример кода может быть лучше принятого решения, потому что:
- он совместим с более новым OpenCV python API (cv2 против cv). Это решение тестируется под opencv 3.0 и python 3.0. Я верю только в тривиальность. для opencv 2 потребуются изменения.x и / или python 2.7 x.
- меньше импорта. Все это можно сделать с помощью 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)