2014-03-05 35 views
1

以下是用于从图像中移除背景的Python代码。我按照https://pypi.python.org/pypi/pgmagick/中给出的步骤在mac osx mavericks中安装pgmagick。Boost.Python.ArgumentError:Image .__ init __中的Python参数类型(图像,文件)与C++签名不匹配:

import pgmagick as pg 


    def trans_mask_sobel(img): 
     """ Generate a transparency mask for a given image """ 

     image = pg.Image(img) 

     # Find object 
     image.negate() 
     image.edge() 
     image.blur(1) 
     image.threshold(24) 
     image.adaptiveThreshold(5, 5, 5) 

     # Fill background 
     image.fillColor('magenta') 
     w, h = image.size().width(), image.size().height() 
     image.floodFillColor('0x0', 'magenta') 
     image.floodFillColor('0x0+%s+0' % (w-1), 'magenta') 
     image.floodFillColor('0x0+0+%s' % (h-1), 'magenta') 
     image.floodFillColor('0x0+%s+%s' % (w-1, h-1), 'magenta') 

     image.transparent('magenta') 
     return image 

    def alpha_composite(image, mask): 
     """ Composite two images together by overriding one opacity channel """ 

     compos = pg.Image(mask) 
     compos.composite(
      image, 
      image.size(), 
      pg.CompositeOperator.CopyOpacityCompositeOp 
     ) 
     return compos 

    def remove_background(filename): 
     """ Remove the background of the image in 'filename' """ 

     img = pg.Image(filename) 
     transmask = trans_mask_sobel(img) 
     img = alphacomposite(transmask, img) 
     img.trim() 
     img.write('out.png') 

    img = open("example.jpg") 
    remove_background(img) 

当运行这个我遇到以下错误

Traceback (most recent call last): 
    File "imgrm.py", line 48, in <module> 
    remove_background(img) 
    File "imgrm.py", line 41, in remove_background 
    img = pg.Image(filename) 
Boost.Python.ArgumentError: Python argument types in 
    Image.__init__(Image, file) 
did not match C++ signature: 
    __init__(_object*, Magick::Image) 
    __init__(_object*, unsigned int, unsigned int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, MagickLib::StorageType, char const*) 
    __init__(_object*, Magick::Blob, Magick::Geometry, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) 
    __init__(_object*, Magick::Blob, Magick::Geometry, unsigned int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) 
    __init__(_object*, Magick::Blob, Magick::Geometry, unsigned int) 
    __init__(_object*, Magick::Blob, Magick::Geometry) 
    __init__(_object*, Magick::Blob) 
    __init__(_object*, Magick::Geometry, Magick::Color) 
    __init__(_object*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) 
    __init__(_object*) 

问题是什么?我如何解决它?

+0

我与试验OSX Mavericks上的相同代码,我没有得到那个错误。 你是如何安装相关库的? – Pitarou

回答

0

由于C++类型的扩展名称,追溯可能有点让人望而生畏。但是,这表示pgmagick.Image正试图用file对象构建,但pgmagick未提供接受file对象的Image上的__init__方法。

在这种情况下,remove_background()方法的filename参数需要str而不是file。要解决此问题,更改:

img = open("example.jpg") 
remove_background(img) 

到:

remove_background("example.jpg") 
1

我有pgmagick同样的问题,以及与此代码解析:

image = pg.Image(str(img)) 
+0

感谢它为我工作。 – RajSharma