質問: cv2.hconcat([ この中にimg[0,1,2]を入れたい ]) ↑こんなことはできないでしょうか。 hconcat([ の中にいろいろ書き込んでみましたが、エラーばかりです。 主にSyntaxErrorです。 実行できたとして、ここからどうするのか上記目的まで果てしないなと思っておりますが、 勉強がてら少しずつ理解していきたいと思っています。 初心者で不慣れなものですから、尋ねておきながら間違いや漏れがありましたらごめんなさい。 こんな方法でなくても、他に方法があるようでしたら教えていただけると嬉しいです。 どうぞよろしくお願いいたします。 ### 発生している問題・エラーメッセージ ``` SyntaxError: can't assign to operator ``` ### 該当のソースコード ``` ソースコード ``` ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) windows7 python-3.6.4 opencv-3.4.1
回答: 問題を少しずつ解きほぐしましょう。 **註:思考の順序に沿って章立てしているので、実際の解決法と順番が前後します。** 縦横に連結すること こちらのコードを借りてみてはいかがでしょうか。 > > > ``` > def concat_tile(im_list_2d): > return cv2.vconcat([cv2.hconcat(im_list_h) for im_list_h in im_list_2d]) > ``` > > **引用元:** Python, OpenCVで画像を縦・横に連結 (hconcat, vconcat, np.tile) 例えば`img0`から`img5`を、横書きの方向に連結したいなら次のように呼べば良いです。 ``` result = concat_tile( [[img0, img1, img2], [img3, img4, img5]] ) ``` しかし毎回このように書くのは随分面倒ですね。自動化しましょう。 呼び出しに合わせてリストを変形すること 次のようなイディオムが利用できるでしょう。 ``` >>> print(my_list) [0, 1, 2, 3, 4, 5] >>> >>> my_list_for_arg = [list(row) for row in zip(*[iter(my_list)]*3)] >>> print(my_list_for_arg) [[0, 1, 2], [3, 4, 5]] ``` このように書ける理由については、ちょっと煩雑なのでリンクに投げます。 気になるようなら読んでみてください。 * Qiita - 内包表記を使ってリストの作成を簡潔に書く * おぎろぐはてブロ - リストをn個ずつのサブリストに分割 (Python) さて、この時点で6画像の場合は連結できるはずです。 問題は空きマスが出る8画像のバージョンです。ダミーの画像を用意する必要があります。 結合可能な空画像を生成すること 結合可能にするためには、次の二条件に注意する必要があります。 * 画像の形状 (shape) * 画素値を表現する数値型 (dtype) モデル画像imgが既にあるとき、次のように真っ黒な画像を生成できます。 ``` empty = np.zeros(img.shape, dtype=img.dtype) ``` 次の問題は、空画像をどのように扱うか、です。 空画像を画像リストに追加すること 画像数が3の倍数になるまで、空画像をリストimgsに押し込んでやりましょう。 ``` while len(imgs) % 3 != 0: imgs.append(empty) ``` ここまでやれば、8画像の場合にも対応できます。 結局どう書けばいいか? 処理の流れは次のとおりです。 1. **画像名を取得し、リストimg_namesを作る。** 2. **OpenCVを用いて各画像を読み込み、リストimgsを作る。** 3. **imgs[0]をモデルに、空画像emptyを作っておく。** 上記『結合可能な空画像を生成すること』を参照のこと。 4. **imgsのリスト長が3の倍数になるまでemptyをimgsに押し込む。** 上記『空画像を画像リストに追加すること』を参照のこと。 5. **imgsの形状を適切に変形し、concat_tileに渡す。** 上記『呼び出しに合わせてリストを変形すること』を参照のこと。 6. **返り値が目的の画像。** その他 > > 画像が読み込まれますか、、。実行してもエラーはでませんが、読み込まれているかどうか確認する方法がわかりません。 > > > OpenCVのPythonバインディングは、imreadに失敗するとNoneを返すという**えげつない**設計です。 個人的には次のように書いておくことが多いです。 ``` img = cv2.imread(ファイル名) assert img is not None ``` このように書いておけば、読み込みに失敗したときも早い段階でエラーに出来ます。 > > hconcat([ の中にいろいろ書き込んでみましたが、エラーばかりです。主にSyntaxErrorです。 > > **...[中略]...** > > > > ``` > SyntaxError: can't assign to operator > ``` > > こればっかりはコードを読んでみないとなんとも言えません。 見たことがないわけではないですが... ``` >>> b = 3 >>> a + b = 10 File "", line 1 SyntaxError: can't assign to operator ```