1

如文档中所述:

IplImage.imageData(来自 OpenCV 库):

指向对齐图像数据的指针

Image.tostring() (来自 Python PIL):

使用标准的“原始”编码器返回一个包含像素数据的字符串。

Image.tostring()和的结果有什么区别IplImage.imageDataIplImage.imageData如果我想获得与Python返回的数据完全相同的数据,我该怎么办?

编辑: 澄清一下,我需要使用 PIL 来加载图像,因为我有一个 python 服务来接收来自互联网的数据,并且在 OpenCV 中没有直接的方法来从内存而不是磁盘加载图像。

4

2 回答 2

3

在 opencv 中有一种直接从内存中读取图像的方法。

使用简历(版本 1)

import cv

# First get the compressed image data. This can be retrieved from
# a socket, a file, or whatever you want.
jpegdata = open('myimage.jpg','r').read()

# Create an opencv matrix to hold the compressed data
cvmat = cv.CreateMatHeader(1, len(jpegdata), cv.CV_8U)
cv.SetData(cvmat, jpegdata, len(jpegdata))

# Now let opencv decompress your image
cvimage = cv.DecodeImage(cvmat, cv.CV_LOAD_IMAGE_COLOR)

使用 cv2(和 numpy)

import cv2
import numpy as np

# First get the compressed image data. This can be retrieved from
# a socket, a file, or whatever you want.    
jpegdata = open('myimage.jpg','r').read()

# Convert your compressed data to a numpy array
nparr = np.fromstring(jpegdata, np.uint8)

# Now use imdecode to decompress it
cvimage = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR)
于 2012-09-03T10:57:28.390 回答
1

在 Opencv 图像中,像素数据按 BGR 排序,而在 PIL 中则是 RGB。您可以将 PIL 图像数据转换为 opencv,如下所示。

import Image, cv
pi = Image.open('building.jpg')       # PIL image
cv_im = cv.CreateImageHeader(pi.size, cv.IPL_DEPTH_8U, 3)
cv.SetData(cv_im, pi.tostring())

在此处了解更多信息。

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

于 2012-08-06T08:12:21.813 回答