5

PILを使用して読み込まれた iamge を Cimg イメージ オブジェクトに変換しようとしています。Cimg は C++ ライブラリであり、PIL は Python イメージング ライブラリであることを理解しています。画像の URL を指定して、ディスクに書き込むことなく画像のpHashを計算することを目的としています。pHash モジュールはCimg 画像オブジェクトで動作し、C++ で実装されています。そのため、python 拡張バインディングを使用して、必要な画像データを python プログラムから c++ プログラムに送信することを計画しています。次のコード スニペットでは、指定された URL から画像を読み込んでいます。

//python code sniplet   
import PIL.Image as pil

file = StringIO(urlopen(url).read())
img = pil.open(file).convert("RGB")

構築する必要がある Cimg 画像オブジェクトは次のようになります。

CImg  ( const t *const  values,  
    const unsigned int  size_x,  
    const unsigned int  size_y = 1,  
    const unsigned int  size_z = 1,  
    const unsigned int  size_c = 1,  
    const bool  is_shared = false  
)

img.size を使用して width(size_x) と height(size_y) を取得し、C++ に渡すことができます。Cimg オブジェクトの「値」フィールドに入力する方法がわかりません。Python から C++ コードに画像データを渡すために使用するデータ構造はどのようなものですか?

また、PIL イメージを Cimg に変換する他の方法はありますか?

4

2 に答える 2

0

メイン アプリケーションが Python で記述されていて、Python から C++ コードを呼び出したいとします。すべてのネイティブ C/C++ 機能を Python に公開する" Python モジュール"を作成することで、これを実現できます。SWIG のようなツールを使用すると、作業が簡単になります。

それが私の頭に浮かんだあなたの問題の最善の解決策です。

于 2013-03-09T17:21:15.107 に答える
0

Python から C++ CImg ベースのプログラムにイメージを渡す最も簡単な方法は、パイプを使用することです。

この C++ CImg ベースのプログラムは、画像を読み取り、stdinダミーの pHash を Python の呼び出し元に返します。

#include "CImg.h"
#include <iostream>

using namespace cimg_library;
using namespace std;

int main()
{
    // Load image from stdin in PNM (a.k.a. PPM Portable PixMap) format
    cimg_library::CImg<unsigned char> image;
    image.load_pnm("-");

    // Save as PNG (just for debug) rather than generate pHash
    image.save_png("result.png");

    // Send dummy result back to Python caller
    std::cout << "pHash = 42" << std::endl;
}

URL から画像をダウンロードし、それを PNM/PPM ( "Portable PixMap" ) に変換し、それを C++ プログラムに送信して、pHash を生成して返す Python プログラムを次に示します。

#!/usr/bin/env python3

import requests
import subprocess
from PIL import Image
from io import BytesIO

# Grab image and open as PIL Image
url = 'https://i.stack.imgur.com/DRQbq.png'
response = requests.get(url)
img = Image.open(BytesIO(response.content)).convert('RGB')

# Generate in-memory PPM image which CImg can read without any libraries
with BytesIO() as buffer:
    img.save(buffer,format="PPM")
    data = buffer.getvalue()

# Start CImg passing our PPM image via pipe (not disk)
with subprocess.Popen(["./main"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) as proc:
    (stdout, stderr) = proc.communicate(input=data)

print(f"Returned: {stdout}")

Python プログラムを実行すると、次のようになります。

Returned: b'pHash = 42\n'
于 2020-01-21T15:02:53.093 に答える