15

我正在通过 tcp 将 png 图像从我的 iPhone 流式传输到我的 MacBook。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)
4

6 回答 6

20

@Andy Rosenblum 的作品,如果使用过时的 cv python API(与 cv2 相比),它可能是最好的解决方案。

但是,因为这个问题对于最新版本的用户来说同样有趣,所以我建议以下解决方案。下面的示例代码可能比公认的解决方案更好,因为:

  1. 它与较新的 OpenCV python API(cv2 与 cv)兼容。此解决方案在 opencv 3.0 和 python 3.0 下测试。我相信 opencv 2.x 和/或 python 2.7x 只需要进行微不足道的修改。
  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 位图像,但如果不是,您可以使用 np.fromstring 中的 dtype='...' 标志。

于 2015-12-26T21:09:40.643 回答
16

另一种方式,

在读取实际文件的情况下,这也适用于 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
于 2013-07-09T11:50:46.710 回答
2

I figured it out:

# 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) 
于 2012-07-22T15:17:56.440 回答
1

这对我有用(这些天):

import cv2
import numpy as np

data = open('016e263c726a.raw').read()
x = np.frombuffer(data, dtype='uint8').reshape(2048,2448)
cv2.imshow('x',x); cv2.waitKey(); cv2.destroyAllWindows()

但它会读取没有任何特定格式保存的RAW图像。

于 2019-11-01T09:51:34.850 回答
0

(您的问题似乎被标记为objective-c,但您要求使用Python,您的示例也是如此,所以我将使用它。)我在Stack Overflow 上的第一篇文章!

cv.LoadImageM 方法似乎是您正在寻找的。

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

使用示例:http: //opencv.willowgarage.com/wiki/PythonInterface/

LoadImage(文件名, 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

请注意,在当前实现中,alpha 通道(如果有)会从输出图像中剥离,例如 4 通道 RGBA 图像将作为 RGB 加载。

于 2012-07-19T06:20:18.050 回答
-2

当您必须从文件加载时,这个简单的解决方案可以完成工作(用 测试opencv-python-3.2.0.6):

import cv2

img = cv2.imread(somefile)
于 2017-02-12T21:18:44.523 回答