何度か質問をさせていただき,プログラムを作成しています.
しかし,うまく動作しないため,どのようにすればうまくいくかご教授ください.
エラーは起きませんがなにも結果がおこりません.
forループがおかしいと思います。
また,これでは保存がうまくいかないに気もしますが,いまいちわからず…
助けてください
import cv2 import pathlib import re import matplotlib.pyplot as plt import numpy as np import math round=lambda x:(x*2+1)//2 y_step=101 x_step=101 s=2.4 t=1/30 u=10 v=round(s*t*u) folder1_path = pathlib.Path("images1") output_path = pathlib.Path('images2') step_img_list = folder1_path.glob('*.jpg') for step_img_file in step_img_list: i=1 img = cv.imread(step_img_file) j=v*i k=x_step-j img_y,img_x=img.shape[:2] img[y_step:img_y:y_step, :, :] = 0 img[:, k:img_x:x_step, :] = 0 cv2.imwrite('grid_(\04d+).jpg',img) i=i+1
何も起きないということですが、原因はいろいろ考えられます。
原因を探るために、デバッグしてみていますか?
- VSCodeなどで書いているのであれば、そこからデバッグで1行ずつ実行しながら変数の内容を確認
- やりかたがわからなければ、いろいろな場所にprintを挿入して変数の値を表示
まずは、step_img_list の変数に想定どおりのファイルのリストが入っているかどうか確認してください。
あと、'cv2.imwrite('grid_(\04d+).jpg',img)' はたぶん想定通りのファイル名にはなりませんよ。 どのようなファイル名が生成されると思っていますか?
コメントありがとうございます。
たぶん動いてはいるんですけど、仰られている通り保存する過程と、変数iのところのループが変な気がします。
画像を書き出して新規フォルダに保存する過程がいつも上手く行えません。もちろん調べているのですが、難しくて理解できていません。やり方を教えて頂きたいです。
「いろいろな場所にprintを挿入して変数の値を表示」くらいはできますよね?
できます。printで変数を全てチェックしようとしたのですが、表示すらされなかったのですがなぜでしょうか
どこに入れましたか?
まずは、
step_img_list = folder1_path.glob('*.jpg')
の後に必要ですよ。
print(list(step_img_list)) のようにリスト化しないと内容が表示されないかもしれません。
その直後だとs,t,u,vの全ての変数はただしく表示されます。for以降なにも表示されないです
ここで表示させたいのは、それらの変数ではなく、step_img_listの中身です。
ここに、対象のjpgファイルのリストが入っているはずですのでその確認をしなければなりません。
たぶん、何も入っていないと思います。
<generator object Path.glob at 0x09D4AF70>
と表記されました
ですよね。なので、前に書いたとおり、
print(list(step_img_list))
としてください。
適当に作ったフォルダなので中身も適当ですが
[WindowsPath('images1/0001.jpg'), WindowsPath('images1/0002.jpg')]
と表記され,画像が2つ入っていることが確認できました
ちなみにgeneratorというのは、for文などで呼ばれると中身を1つずつ出してくれるオブジェクトです。 中を見るためには全部出してやらなくてはならないのですが、その1つがリスト化です。
ということは、ファイルは取得できているはずなので、for文が1回も回らないということはなさそうですね。
では次はfor文の中を見ていくことになりますが、for文の直後にstep_img_file の値をprintするとどうなるでしょう
ああ、エラーでているんですね。
もしかして、ずっとこのエラー出ていませんか?
Traceback から始まる表示は、処理中に問題がおきてプログラムが異常終了したことを示しています。
cv2がこのイメージ(0001.jpg)を読もうとしてエラーになっていますが、このjpgファイルはちゃんとしたファイルですか?
最初pngとなっていたため途中から訂正したところこのようになりました。画像は問題なく開けます
ちょっと調べたら、cv2はpathlibのPathを読めないようです。すみません。
img = cv.imread(step_img_file) を
img = cv.imread(str(step_img_file))
にしてみていただけますか?
また、ついでに、
cv2.imwrite('grid_(\04d+).jpg',img) を
cv2.imwrite(f'grid_{i:04d}.jpg',img)
に変えておいてください。
変えましたが、何も変わりませんでした…
何も変わらないというのは、どういうことでしょう。
実行して表示される内容を貼ってみてください。
実行結果です
images1\0001.jpg
Traceback (most recent call last):
File "C:\Users\Desktop\新しいフォルダー\1.py", line 36, in <module>
img[:, k:img_x:x_step, :] = 0
TypeError: slice indices must be integers or None or have an __index__ method
変らなくは無いですよね。
エラーの発生箇所と内容が変っています。
ここにあるようなエラーメッセージは問題の内容を示していますので、内容を読んで理解するようにしないと、先には進めませんよ。
エラーには、slice indices must be integers : スライスのインデックスは整数でないとだめって書いてあります。
k、 img_x、 x_step はすべて整数でなければいけませんが、どうですか?
別件ですけど、i の初期化の場所はここではなくて、for文の前に出さないとだめですね。 いつも1になってしまう。
iの位置をずらし実行すると
images1\0001.jpg
101 101 1.0 100.0
98 90
Traceback (most recent call last):
File "C:\Users\Desktop\新しいフォルダー\1.py", line 36, in <module>
img[:, k:img_x:x_step, :] = 0
TypeError: slice indices must be integers or None or have an __index__ method
このようになり,浮動小数点が原因と考え,round = lambda x: int(x * 2 + 1) // 2としたところ,
images1\0001.jpg
101 101 1 100
1367 2048
images1\0002.jpg
101 101 2 99
1367 2048
このように実行できました!ありがとうございます!
しかし,images2内に保存できませんでした.どのようにしたらよいでしょうか
cv2.imwrite(f'grid_{i:04d}.jpg',img)
ここで指定している文字列はファイルの名前でなくて、パスです。
パスというのはディレクトリ名を含んだもののことです。
なので、images2 に保存したいのであれば、保存するファイルのパスにimages2を含めてやればOKです。
cv2.imwrite(f'images2\\grid_{i:04d}.jpg',img)
この ようなファイルやフォルダなどの名前の扱いについても調べて考えかたや操作のしかたを理解しておくといいですよ。
できました!本当にありがとうございます!
プログラムを自分で作成していく手順がわかってきた気がします!
勉強になりました。
本当にありがとうございました!
またなにかあればよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー