2017-12-25 30 views
-1

私はC++(opencv version 2.4)を使ってエラーレベル解析アルゴリズムを実装しています。私はcythonを使ってpythonラッパーを作りたいと思っています。 私はC++のためのcythonのドキュメントの一部を読んだことがありますが、それは私を助けず、さらにラッパーをオンラインで実装するための追加情報は見つかりませんでした。 誰かが私を導き、私がこの問題を解決するのを助けることができれば、本当に素晴らしいことでしょう。cythonを使ったエラーレベル解析アルゴリズムのopencv実装の実装

これは私がpyhtonラッパーを構築したい私のコードです:

#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <vector> 

// Control 
int scale = 15, 
quality = 75; 

// Image containers 
cv::Mat input_image, 
compressed_image; 

void processImage(int, void*) 
{ 

// Setting up parameters and JPEG compression 
std::vector<int> parameters; 
parameters.push_back(CV_IMWRITE_JPEG_QUALITY); 
parameters.push_back(quality); 
cv::imwrite("lena.jpeg", input_image, parameters); 

// Reading temp image from the disk 
compressed_image = cv::imread("lena.jpeg"); 

if (compressed_image.empty()) 
{ 
    std::cout << "> Error loading temp image" << std::endl; 
    exit(EXIT_FAILURE); 
} 

cv::Mat output_image = cv::Mat::zeros(input_image.size(), CV_8UC3); 

// Compare values through matrices 
for (int row = 0; row < input_image.rows; ++row) 
{ 
const uchar* ptr_input = input_image.ptr<uchar>(row); 
const uchar* ptr_compressed = compressed_image.ptr<uchar>(row); 
uchar* ptr_out = output_image.ptr<uchar>(row); 

    for (int column = 0; column < input_image.cols; column++) 
    { 
     // Calc abs diff for each color channel multiplying by a scale factor 
     ptr_out[0] = abs(ptr_input[0] - ptr_compressed[0]) * scale; 
     ptr_out[1] = abs(ptr_input[1] - ptr_compressed[1]) * scale; 
     ptr_out[2] = abs(ptr_input[2] - ptr_compressed[2]) * scale; 

     ptr_input += 3; 
     ptr_compressed += 3; 
     ptr_out += 3; 
    } 
} 

// Shows processed image 
cv::imshow("Error Level Analysis", output_image); 
} 

int main (int argc, char* argv[]) 
{ 
// Verifica se o número de parâmetros necessário foi informado 
if (argc < 2) 
{ 
std::cout << "> You need to provide an image as parameter" << std::endl; 
return EXIT_FAILURE; 
} 

// Read the image 
input_image = cv::imread(argv[1]); 

// Check image load 
if (input_image.empty()) 
{ 
    std::cout << "> Error loading input image" << std::endl; 
    return EXIT_FAILURE; 
} 

// Set up window and trackbar 
cv::namedWindow("Error Level Analysis", CV_WINDOW_AUTOSIZE); 
cv::imshow("Error Level Analysis", input_image); 
cv::createTrackbar("Scale", "Error Level Analysis", &scale, 100, processImage); 
cv::createTrackbar("Quality", "Error Level Analysis", &quality, 100, processImage); 

// Press 'q' to quit 
while (char(cv::waitKey(0)) != 'q') {}; 

return EXIT_SUCCESS; 
} 

​​

貢献を歓迎します。 ありがとうございます。

+0

私は、あなたが望むものについて詳しく考える必要があると思います:あなたのgithubによれば、その両方のパラメータを無視して何も返さない1つの関数があります - これは有意義にラップできるようには見えませんCythonで。また、コマンドライン引数としていくつかのファイル名を受け取り、opencvを呼び出すメインプログラムもあります。これは、実際にはCythonでラップするのには適していません。また、コードをオフサイトに置いていますので、ここで自己完結型の質問ではありません。最後に、既にPython用のopencvラッパーがありますか?それを使わないのはなぜですか? – DavidW

+0

サー、サイモンを使って私に提供されるタスクの一部であり、それを完了するための必要性です。私はcythonを初めて使っているので、上記のコードをcythonを使ってラップすることで私を導くことができれば本当に素晴らしいでしょう。ラップされたものや他の関連するものを得ることに関わるクラスは何でしょうか。ありがとうございました。 –

答えて

1

あなたがこれで達成したいことは本当にはっきりしませんが、Cythonから呼び出し可能な関数を作るのはかなり簡単です。 mainに小さな変更を加えることから始めます。プログラムのメイン関数として機能しなくなるように名前を変更する必要があります。また、2番目のコマンドライン引数だけをファイル名として使用するため、次のように変更する必要があります。

void some_function(char* filename) { 
    // Read the image 
    input_image = cv::imread(filename); 
    // everything else the same 
} 

次に、Cythonラッパーcy_wrap.pyxを作成します。これには2つの部分があります。まずCythonにあなたの2つのC++関数(cdef extern from)を伝える必要があります。第二に、あなたは、Pythonからこれらを呼び出すことができる小型のラッパー関数を記述する必要があります

cdef extern from "ela.hpp": 
    # you'll need to create ela.hpp with declarations for your two functions 
    void processImage(int, void*) 
    void some_function(char* filename) 

# and Python wrappers 
def processImagePy(): 
    # since the parameters are ignored in C++ we can pass anything 
    processImage(0,NULL) 

def some_functionPy(filename): 
    # automatic conversion from string to char* 
    some_function(filename) 

このモジュールを使用して、あなたがprocessImagePysome_functionPyを呼び出すことができるでしょう。

Pythonモジュールにコンパイルするには、setup.pyファイルを作成する必要があります。 the template given in the Cython documentationに従うことをお勧めします。ソースファイルはcy_wrap.pyxela.cppになります。おそらくOpenCVライブラリにリンクしたいと思うでしょう。 specify language="c++"

+0

Thanxたくさん、私はcythonを使用して私のプログラムの[ラッパー](https://github.com/shreyneil/image_test)クラスを構築することができましたが、テスト時に次のエラーが表示されます:ImportError:/ home/shreyash/Desktop/New/ela_c.so:未定義シンボル:_ZN2cv14createTrackbarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_PiiPFviPvES9_ –

+0

これはOpenCVの一部のようです。 'ライブラリ'の内容を変更する必要があるかもしれません。私はOpenCVを使用したことはありませんでしたが、私は本当に助けることができません – DavidW

+0

サー、Thanx、あなたの助けには、私は共有オブジェクトファイルをPythonにリンクできないと思うので、いくつかのエラーが発生します。そうするための手順を教えてください。それは本当に役立つだろう。ありがとうございました。 –