【问题标题】:Python PIL Image.tostring('raw') and IplImage->imageData of OpenCVPython PIL Image.tostring('raw') 和 OpenCV 的 IplImage->imageData
【发布时间】:2012-08-03 04:52:52
【问题描述】:

如文档所述:

IplImage.imageData(来自 OpenCV 库):

指向对齐图像数据的指针

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

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

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

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

【问题讨论】:

    标签: c++ python c opencv python-imaging-library


    【解决方案1】:

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

    使用 cv(版本 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)
    

    【讨论】:

      【解决方案2】:

      在 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

      【讨论】:

      • 那如何获取图片数据呢? cv_im.tostring() 似乎没有返回我需要的东西。
      • 想通了:cv_im_new = cv.CloneImage(cv_im); cv.CvtColor(cv_im, cv_im_new, cv.CV_RGB2BGR); 然后cv_im_new.tostring() 是我需要的。我希望有更好的方法,IMO cv.CloneImage() 会很慢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 2013-03-08
      • 2014-04-30
      相关资源
      最近更新 更多