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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2364閲覧

機械学習で使う画像の水増しを行いたい

0000

総合スコア3

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/16 16:24

編集2020/05/16 16:44

前提・実現したいこと
機械学習で使う画像を左右反転して水増ししたい。

現在画像の識別アプリを作成しており、
そこで使う画像を水増ししたいです。

具体的にはフォルダ(saito_out)の中に画像が複数入っており、
その中の画像全てを左右反転し、
別のフォルダ(saito_mizumashi)に保存するコードを書きたいのですが、
何故かデスクトップ上に3枚のみ、左右反転した画像が保存されてしまいます。

エラーメッセージ
cv2.error: OpenCV(4.2.0) /Users/travis/build/skvark/opencv-python/opencv/modules/imgcodecs/src/loadsave.cpp:715: error: (-215:Assertion failed) !_img.empty() in function 'imwrite

該当のソースコード
cv2.imwrite('saito1.jpg', xAxis)

ここに言語名を入力
python

ソースコード

import cv2 import matplotlib.pyplot as plt import numpy as np import sys, os from PIL import Image #入力ファイルのパスを指定 in_jpg = "./saito_out/" out_jpg = "./saito_mizumashi/" #リストで結果を返す関数 def get_file(dir_path): filenames = os.listdir(dir_path) return filenames pic = get_file(in_jpg) for i in pic: # 画像の読み込み image_gs = cv2.imread(in_jpg + i) xAxis = cv2.flip(image_gs, 0) yAxis = cv2.flip(image_gs, 1) xyAxis = cv2.flip(image_gs, -1) cv2.imwrite('saito1.jpg', xAxis) cv2.imwrite('saito2.jpg', yAxis) cv2.imwrite('saito3.jpg', xyAxis)

試したこと
フォルダもコードを書いたファイルも全てdesktop上に置いています。

補足情報(FW/ツールのバージョンなど)
mac python3.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

error: (-215:Assertion failed) !_img.empty() in function 'imwrite というエラー

os.listdir() はディレクトリ内のすべてのファイルを列挙する関数なので、画像ファイル以外も混じっている可能性はないでしょうか。(例: .DS_STORE とか)
読み込んだ結果 image_gs は None になっていないことを確認してください。

何故かデスクトップ上に3枚のみ、左右反転した画像が保存されてしまいます。

出力ディレクトリのパスを頭につけてないからだと思います。

diff

1- cv2.imwrite('saito1.jpg', xAxis) 2- cv2.imwrite('saito2.jpg', yAxis) 3- cv2.imwrite('saito3.jpg', xyAxis) 4+ cv2.imwrite(out_jpg + 'saito1.jpg', xAxis) 5+ cv2.imwrite(out_jpg + 'saito2.jpg', yAxis) 6+ cv2.imwrite(out_jpg + 'saito3.jpg', xyAxis)

サンプルコード

python

1import cv2 2from pathlib import Path 3 4 5def _get_img_paths(img_dir): 6 """指定したディレクトリ内の画像ファイルのパス一覧を取得する。 7 """ 8 img_extensions = [".jpg", ".jpeg", ".png", ".bmp"] 9 img_paths = [p for p in img_dir.iterdir() if p.suffix in img_extensions] 10 11 return img_paths 12 13 14input_dir = Path("saito_out") # 入力ディレクトリ 15output_dir = Path("saito_mizumashi") # 出力ディレクトリ 16output_dir.mkdir(exist_ok=True) 17 18for path in _get_img_paths(input_dir): 19 img = cv2.imread(str(path)) 20 21 img1 = cv2.flip(img, 0) # 左右反転 22 img2 = cv2.flip(img, 1) # 上下反転 23 img3 = cv2.flip(img, -1) # 上下左右反転 24 25 # ファイル名は <元のファイル名>_flip1<拡張子> で保存する。 26 output_path = output_dir / f"{path.stem}_flip1{path.suffix}" 27 cv2.imwrite(str(output_path), img1) 28 29 output_path = output_dir / f"{path.stem}_flip2{path.suffix}" 30 cv2.imwrite(str(output_path), img2) 31 32 output_path = output_dir / f"{path.stem}_flip3{path.suffix}" 33 cv2.imwrite(str(output_path), img3)

投稿2020/05/16 16:44

編集2020/05/16 16:50
tiitoi

総合スコア21956

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

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

0000

2020/05/16 17:12

回答、またサンプルコードの添付ありがとうございます。 サンプルコードの方では無事出来ました‼︎ あと追記で一点教えて頂きたいのですが、 読み込んだ結果 image_gs は None になっていないことを確認してください。 >>これはどういった意味でしょうか? どうしても理解出来ず、回答頂けたら幸いです。 よろしくお願いします。
tiitoi

2020/05/16 17:18 編集

cv2.imread() は読み込みに失敗した場合は None を返します。 そのような場合、cv2.imread() では処理は止まりませんが、その後続の処理でエラーとなります。 今回エラーが発生しているのは imwrite() のところですが、その原因は imread() でそもそも読み込みに失敗していたのではないかと思ったので聞きました。 image_gs = cv2.imread(in_jpg + i) のあとに assert image_gs is not None と入れて関数の返り値をチェックするようにすれば、読み込みに失敗した場合、すぐにエラーとなるので、気付けると思います。
0000

2020/05/16 17:30

そういう事だったんですね‼︎ 分かりやすく、理解出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問