質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4462閲覧

pythonでモジュールの中身を編集したい

deb

総合スコア17

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/02/06 18:23

題意の通り、pythonでインポートするモジュールの中身が編集したいです。
例えばC++の場合は、モジュール(ライブラリ)やヘッダファイルをインクルードするので、

c++

1#include <iostream> 2#include <stdarg.h> 3#include <opencv2/core/hal/hal.hpp>

上記のようにヘッダファイルを探して開いて、その中身を編集することが出来ます。
しかしpythonの場合は、

python

1import numpy as np 2import cv2

このようにcv2をインポートしたからといって、cv2.pyというソースコードがあるわけではなく、編集できません。
具体的に何を編集した以下と言うと、SIFT特徴量の抽出器を開きたく、C++の場合はsift.cppというソースコードがgithub上にあり、openCVをインストールしたときにPCに一緒に入るのですが、pythonの場合はsift.pyはバイナリコードになっていて開けません。

ちなみに、
sift.cppを編集して、pythonでSIFT特徴量を使ったコードを書いても、出力は変化しませんでした。

python

1import numpy as np 2import cv2 3img1 = cv2.imread('test3.png',0) 4img2 = cv2.imread('test3_rot.png',0) 5#特徴抽出機の生成 6detector = cv2.xfeatures2d.SIFT_create() 7#kpは特徴的な点の位置 destは特徴を現すベクトル 8kp1, des1 = detector.detectAndCompute(img1, None) 9kp2, des2 = detector.detectAndCompute(img2, None) 10#特徴点の比較機 11bf = cv2.BFMatcher() 12matches = bf.knnMatch(des1,des2, k=2) 13#割合試験を適用 14good = [] 15match_param = 0.6 16for m,n in matches: 17 if m.distance < match_param*n.distance: 18 good.append([m]) 19#cv2.drawMatchesKnnは適合している点を結ぶ画像を生成する 20img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good, None,flags=2) 21cv2.imwrite("sift_result.png", img3)

detectAndCompute(img1, None)は、sift.cpp内に定義があるのでそこのパラメータを弄ってみたのですが、このPythonコードから出力される結果には影響しませんでした。

どうすればpythonで書いたソースコードの中のモジュールの中身を編集できますか。
ご教授お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Q71

2019/02/07 04:49

Cでヘッダーファイルを編集してもモジュールを編集したことになりませんが?公開されているヘッダーを変更しても、ライブラリは変更前の値を取り込んでコンパイルされているので、ライブラリの動作が変わるわけではありませんよ。
deb

2019/02/07 05:01

そうなのですか! https://teratail.com/questions/110387 上URLの方が似たようなことをしていると思ったのですが、これはC++ではなくPythonだから実現できていることなのでしょうか?
Q71

2019/02/07 05:36

C のライブラリは、普通、バイナリで提供されます。C では宣言がなければ使えないので、宣言部分を提供するためにヘッダー ファイルがあります。コンパイル(翻訳済み)なので、コードを変えても動作は変わりません。 Python は、インタープリター(逐次翻訳)なので、インポートするコードを編集すれば、ライブラリの動作が変わります。 また、バイナリとして提供することもできます。OpenCV for Python は、Python で書かれているわけではなく、C で書かれたものを Python から呼び出せるようにして、(pipでは)バイナリで提供されています。ですから、「ソースコードからビルドしてインストールすればよいです」という回答になります。
deb

2019/02/07 07:03

なるほど、非常に分かりやすいです。 pythonがAIやら機械学習やらに使われやすいのはそういう編集のしやすさが利点にもなっているからなんですかね。とりあえずバイナリで書かれたOpenCVコードを書き換えるには、ソースからビルドし直すしかないようですね。ありがとうございます!
guest

回答1

0

ベストアンサー

ソースコードからビルドしインストールすればよいです。
基本的な手順は公式Building OpenCV from sourceに書いていますが、Pythonバージョンなどの情報が古いので
具体的な手順についてはpyenv環境へOpenCVをインストールするなど、最近の情報かつご自身の環境にあったものを検索して参照ください。

投稿2019/02/07 00:22

can110

総合スコア38254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

deb

2019/02/07 05:04

なるほど、では逆にプレビルド版のOpenCVを入れてしまうとソースには干渉できないという理解でよろしいでしょうか?
can110

2019/02/07 05:13

はい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問