実現したい事
opencvをビルドしてpython3.8と3.9の2種類がインストールされている環境で,どちらからも使える様にするにはどの様な方法があるでしょうか?
お世話になっております.以下の構成から,CUDA有効なopencv及びpythonパッケージをビルドしました.
- opencv,opencv_contrib 4.5.1
- CUDA Toolkit 11.0 (Update1)
- cuDNN 8.0.4.30 for CUDA 11.1
ところで,自分の環境ではpython3は
- 3.9-64
- 3.8-64
の2バージョンがインストールされており,pathは3.9の方に通してある為かCMakeでビルド設定をする際にはpython3.9の方が自動検出されました.
python3.8でもopencvを使いたいのですが,取り敢えずそのまま進めてみて,ビルドされたopencvのc++ライブラリ及びpython3.9のsite-packagesディレクトリ(デフォルト設定)にインストールされたpythonパッケージがどちらもcuda系の関数含め問題無く使用出来る事を確認しました.
さて,python3.8でもこのopencvを使いたいのですが,どの様にしたらいいでしょうか?
opencv-pythonは本体であるc++のopencvを呼び出しているだけという風に聞きます.それならば,本体の部分まで含めてもう一度ビルドする必要は無くて,pythonパッケージの部分のみをビルドすれば良い様に思うのですが,やり方が良く分からなかったのでご助言頂きたいです.
宜しくお願い致します.
補足情報(ツールのバージョンなど)
- Windows10 64bit 10.0.19042
- NVIDIA GeForce RTX2060
- Visual Studio 16.9.2
- cl.exe 19.28.29913
- CMake 3.19.4
解決
ppaulさん,jbpb0さん,ありがとうございます.
既にビルド済の部分はもう一度ビルドされないという事実を知りませんでした…大規模なソースからビルドするという事が初めてでしたので.
アドバイスの通り,> pythonのバージョンに絡む部分だけを削除し、python3.8を指定 してビルドしてみた所,どちらのpythonでも使えました.
ただ,初回ビルドと,pythonのバージョン設定のみ変更した2回目ビルドの時間が殆ど同じ長さであったので,もう一度ビルドする必要のない部分まで再ビルドされている様に思えましたが,opencvというよりCMakeあるいは基本的なビルドに関する知識不足の問題かと思いますので,この問題についてはもう少し調べてみます.
取り敢えず,主要な問題であった両バージョンのpythonでcv2パッケージが使える様にしたいという目的は達成されたので,解決としておきます.
ありがとうございました.
補足
少々脱線しますがCMakeを使ってpythonに関する設定項目をver3.8を対象とした設定に直した上で,再度ビルドした際に少し嵌ったポイントがあったので一応残しておきます.CMakeの使い方の面で勘違いしていた所です.
opencv公式チュートリアルやいくつかのサイトではCMakeのgui版を使ったビルド方法が示されており,今回初めてCMakeを使うのでそれらで示されていた内容を参考に以下に示す様な手順を試していました.
「source/buildディレクトリ,プロジェクト種類(Visual Studio 16 2019)のみを指定して「Configure」→各設定項目一覧が画面に出るので修正の必要があれば変更して再度Configure最後にGenerate」
上の手順はインストールされているpythonのバージョンが1つの場合にはあまり問題無いのかもしれません.
ただ,
-
Configureが走り始めるとPythonの自動検出が始まり,それを基に各項目を自動で設定する
- 因みに,pythonの検出について,どのバージョンのpythonにもpathが通っていない設定にしても3.9の方が検出されるので,検出されるかどうか/どのバージョンが検出されるかはpathとは関係無い模様?
-
しかし,Configure後に画面に出る設定項目は全てではなく,ver3.9になっているpython関連の項目を全て3.8に書き換えても実は必要な項目を全て変更出来ていない
(gui上からアクセス出来る項目を全て3.8に変更してConfigure→Generateしてから,生成されたCMakeCache.txtを見てみると一部v3.9となっている記述が残っている.)
この問題は,初回Configureを押す前に「+Add Entry」から,pythonのとりわけバージョンに関する設定を予め追加しておく事で回避できました.
(ただ,これだとguiでは大変なので結局コマンドラインからやりました.)
コマンドの方だと,cmakeをすると基本的にはエラーが特に無ければ立て続けにconfigure→generateまで一気にされてしまうし,エラーがあれば最初からやり直す事になる様な挙動なので最初から必要な設定を全て入力する必要があり,こういう勘違いは起こらないのかもしれません.
回答1件
あなたの回答
tips
プレビュー