2013-10-03 189 views
0
import sys, Image, scipy, cv2, numpy 
from scipy.misc import imread 
from cv2 import cv 
from SRM import SRM 

def ndarrayToIplImage (source): 
"""Conversion of ndarray to iplimage""" 
    image = cv.CreateImageHeader((source.shape[1], source.shape[0]), cv.IPL_DEPTH_8U, 3) 
    cv.SetData(image, source.tostring(), source.dtype.itemsize * 3 * source.shape[1]) 
    return image 

"""Main Program""" 

filename = "snap.jpeg" 
Q = 64 

im = imread(filename) 
name = filename[:-4] 

img = Image.fromarray(im) 

if img.size[0] > 200 or img.size[1] > 200: 
    ratio = img.size[0]/img.size[1] 
    size = int(ratio*200), 200 
    img = numpy.array(img.resize(size, Image.ANTIALIAS)) 

    srm = SRM(img, Q) 
    srm.initialization() 
    srm.segmentation() 
    classes, map = srm.map() 

    """Converting ndarray to PIL Image to iplimage""" 
    pil_img = Image.fromarray(map) 
    cv_img = cv.CreateImageHeader(pil_img.size, cv.IPL_DEPTH_8U, 3) 
    cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3) 
    print type(cv_img) ##prints <type 'cv2.cv.iplimage'> 

    """Using ndarrayToIplImage function also gives the same error!""" 

    """ 
    cv_img if of type iplimage but still gives error while using cv.ShowImage() 
    or cv.SaveImage(). 

    There is no error displayed. Just the console hangs... 

    """ 

我使用的SRM(统计区域合并)提供包被保存由cv.SaveImage()在this page.损坏图像中的OpenCV

我刚才已经改变了包装给出的示例程序。我必须将由SRM包函数返回的类型转换为iplimage。使用该软件包时没有错误,但在某处使用opencv函数。

这是悬挂后控制台关闭后保存的图像。 它使用cv.SaveImage()

After getting error

我试图cv2.imwrite(),我得到这个作为结果:

enter image description here

这是应该已经保存的图像。我用scipy.misc.imsave('image.jpg', map)来保存这个。

Should have been!

+0

如果你尝试'cv2.imwrite()'会发生什么?你不需要转换成'IplImage';它可以直接保存'ndarray'。 – Aurelius

+0

@Aurelius我甚至试过,但它没有帮助,虽然控制台没有挂这次。我编辑了所问的问题 –

回答

2

为什么你使用的IplImage和PIL? SRM库读取numpy数组,然后从cv2.imread(image)获得一个numpy数组,然后如果需要调整yuor图像的大小,可以使用opencv函数cv2.resize(...)。最后,你可以保存与cv2.imwrite(...)代码OpenCV的图像应该出现这样的:

import sys, cv2, numpy 
from SRM import SRM 

"""Main Program""" 

filename = "snap.jpeg" 
Q = 64 

img = cv2.imread(filename) 
name = filename[:-4] 


if img.shape[0] > 200 or img.shape[1] > 200: 
    ratio = img.shape[0] * 1./img.shape[1] 
    size = (int(ratio * 200), 200) 

    img = cv2.resize(img, size, interpolation=cv2.INTER_LANCZOS4) 

    srm = SRM(img, Q) 

    srm.initialization() 
    srm.segmentation() 
    classes, srmMap = srm.map() # Map is a python function, use different variable name 
    srmMap = srmMap.astype('uint8') # or you can try other opencv supported type 
    # I suppose that srmMap is your image returned as numpy array 
    cv2.imwrite('name.jpeg', srmMap) 
    # or 
    cv2.imshow('image', srmMap) 
    cv2.waitKey(0)